feat(gen): output compiled file in build dir

This commit is contained in:
2026-06-15 14:20:17 +02:00
parent 59c1a0c7b6
commit 81181891c4

View File

@@ -1,18 +1,35 @@
import ast import ast
import shutil
from pathlib import Path
import midas.ast.python as p import midas.ast.python as p
from midas.utils import TypedAST from midas.utils import TypedAST
class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]):
def __init__(self) -> None: def __init__(self, workdir: Path) -> None:
pass self.workdir: Path = workdir.resolve()
self.build_dir: Path = self.workdir / "build" / "midas"
if self.build_dir.exists():
shutil.rmtree(self.build_dir)
self.build_dir.mkdir(parents=True, exist_ok=True)
def generate(self, typed_ast: TypedAST, src_path: Path) -> str: def generate(self, typed_ast: TypedAST, src_path: Path) -> Path:
body: list[ast.stmt] = self._visit_body(typed_ast.stmts) body: list[ast.stmt] = self._visit_body(typed_ast.stmts)
module = ast.Module(body=body, type_ignores=[]) module = ast.Module(body=body, type_ignores=[])
module = ast.fix_missing_locations(module) module = ast.fix_missing_locations(module)
return ast.unparse(module) compiled: str = ast.unparse(module)
rel_src_path: Path = src_path.relative_to(self.workdir)
out_path: Path = (self.build_dir / rel_src_path).resolve()
try:
_ = out_path.relative_to(self.build_dir)
except ValueError:
raise ValueError(
f"Directory traversal, {rel_src_path} points outside of parent directory"
)
out_path.parent.mkdir(parents=True, exist_ok=True)
out_path.write_text(compiled)
return out_path
def visit_binary_expr(self, expr: p.BinaryExpr) -> ast.expr: def visit_binary_expr(self, expr: p.BinaryExpr) -> ast.expr:
return ast.BinOp( return ast.BinOp(