diff --git a/_codegen/main.py b/_codegen/main.py index b924f5b..fd0881b 100644 --- a/_codegen/main.py +++ b/_codegen/main.py @@ -2,21 +2,39 @@ from utils import logger from debug import fix_problem from generate import generate_unit_tests, generate_python +from pathlib import Path +def write_to_file(i: int, filename: str, content: str, outdir: str): + # Open new file for writing + with open(f"{outdir}/v{i}_{filename}", "w") as f: + f.write(content) -def translate(fortran_code: str): +def translate(name: str, fortran_code: str, outdir: str): if not check_if_docker_is_running(): logger.error("Docker is not running. Please start Docker and try again.") return "" + i = 0 + python_code = generate_python(fortran_code) unit_tests = generate_unit_tests(python_code) status, result = run_tests(python_code, unit_tests) + # Write to file + write_to_file(i, f"{name}_python.py", python_code, outdir) + write_to_file(i, f"{name}_tests.py", unit_tests, outdir) + write_to_file(i, f"{name}_output.txt", result, outdir) + + while status != TestResult.PASSED: python_code, unit_tests = fix_problem(python_code, unit_tests, result) status, result = run_tests(python_code, unit_tests) + i += 1 + write_to_file(i, f"{name}_python.py", python_code, outdir) + write_to_file(i, f"{name}_tests.py", unit_tests, outdir) + write_to_file(i, f"{name}_output.txt", result, outdir) + if status != TestResult.PASSED: response = input("Would you like to continue (Y/n)? ") if response.lower() == "n": @@ -37,32 +55,30 @@ def translate(fortran_code: str): "--infile", type=str, default="source/input.f90", help="input Fortran file path" ) parser.add_argument( - "--outfile", + "--outdir", type=str, - default="source/output.py", - help="output Python file path", - ) - parser.add_argument( - "--testfile", - type=str, - default="source/test_output.py", - help="output unit test file path", + default="source", + help="output directory, will get created if it doesn't exist", ) args = parser.parse_args() infile = args.infile - outfile = args.outfile - testfile = args.testfile + outdir = args.outdir + + # Make output directory if it doesn't exist + Path(outdir).mkdir(parents=True, exist_ok=True) with open(infile, "r") as f: logger.info(f"Reading from {infile}") fortran_function = f.read() - python_code, unit_tests = translate(fortran_function) + python_code, unit_tests = translate(Path(infile).stem, fortran_function, outdir) + outfile = outdir + '/output.py' with open(outfile, "w") as f: f.write(python_code) logger.info(f"Python translation written to {outfile}") + testfile = outdir + '/test_output.py' with open(testfile, "w") as f: f.write(unit_tests) logger.info(f"Unit tests written to {testfile}") diff --git a/_parsing/LSP/samples/fortran-utils/fortls_debug.log b/_parsing/LSP/samples/fortran-utils/fortls_debug.log new file mode 100644 index 0000000..04194fc --- /dev/null +++ b/_parsing/LSP/samples/fortran-utils/fortls_debug.log @@ -0,0 +1,10 @@ +DEBUG:fortls.constants:REQUEST 1 initialize +INFO:fortls.constants:fortls - Fortran Language Server 2.13.0 Initialized +DEBUG:fortls.constants:SEND {"jsonrpc":"2.0","method":"window/showMessage","params":{"type":3,"message":"fortls initialization complete"}} +INFO:fortls.constants:fortls initialization complete +DEBUG:fortls.constants:SEND {"jsonrpc":"2.0","id":1,"result":{"capabilities":{"completionProvider":{"resolveProvider":false,"triggerCharacters":["%"]},"definitionProvider":true,"documentSymbolProvider":true,"referencesProvider":true,"hoverProvider":true,"implementationProvider":true,"renameProvider":true,"workspaceSymbolProvider":true,"textDocumentSync":2,"codeActionProvider":true}}} +DEBUG:fortls.constants:SEND {"jsonrpc":"2.0","method":"window/showMessage","params":{"type":3,"message":"fortls debugging enabled"}} +INFO:fortls.constants:fortls debugging enabled +DEBUG:fortls.constants:RECV {"jsonrpc": "2.0", "id": 1, "method": "textDocument/documentSymbol", "params": {"textDocument": {"uri": "/Users/anthony/Documents/climate_code_conversion/_parsing/LSP/samples/fortran-utils/tests/special/test_airyai.f90"}}} +DEBUG:fortls.constants:REQUEST 1 textDocument/documentSymbol +DEBUG:fortls.constants:SEND {"jsonrpc":"2.0","id":1,"result":[{"name":"test_airyai","kind":2,"location":{"uri":"/Users/anthony/Documents/climate_code_conversion/_parsing/LSP/samples/fortran-utils/tests/special/test_airyai.f90","range":{"start":{"line":0,"character":0},"end":{"line":21,"character":0}}}}]}