Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 29 additions & 13 deletions _codegen/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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":
Expand All @@ -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}")
10 changes: 10 additions & 0 deletions _parsing/LSP/samples/fortran-utils/fortls_debug.log
Original file line number Diff line number Diff line change
@@ -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}}}}]}