feat(passer): add raw statements and expressions

This commit is contained in:
2026-06-16 10:38:09 +02:00
parent 2e5cf6f8a2
commit 61514d036c
8 changed files with 71 additions and 2 deletions

View File

@@ -92,6 +92,10 @@ class ForStmt:
body: list[Stmt]
class RawStmt:
stmt: ast.stmt
###<
@@ -164,4 +168,8 @@ class SliceExpr:
step: Optional[Expr]
class RawExpr:
expr: ast.expr
###<

View File

@@ -613,6 +613,11 @@ class PythonAstPrinter(
self._mark_last()
body_stmt.accept(self)
def visit_raw_stmt(self, stmt: p.RawStmt) -> None:
self._write_line("RawStmt")
with self._child_level(single=True):
self._write_line(f"stmt: {ast.unparse(stmt.stmt)}")
def visit_binary_expr(self, expr: p.BinaryExpr) -> None:
self._write_line("BinaryExpr")
with self._child_level():
@@ -756,3 +761,8 @@ class PythonAstPrinter(
self._write_optional_child("lower", expr.lower)
self._write_optional_child("upper", expr.upper)
self._write_optional_child("step", expr.step, last=True)
def visit_raw_expr(self, expr: p.RawExpr) -> None:
self._write_line("RawExpr")
with self._child_level(single=True):
self._write_line(f"expr: {ast.unparse(expr.expr)}")

View File

@@ -113,6 +113,9 @@ class Stmt(ABC):
@abstractmethod
def visit_for_stmt(self, stmt: ForStmt) -> T: ...
@abstractmethod
def visit_raw_stmt(self, stmt: RawStmt) -> T: ...
@dataclass(frozen=True)
class ExpressionStmt(Stmt):
@@ -202,6 +205,14 @@ class ForStmt(Stmt):
return visitor.visit_for_stmt(self)
@dataclass(frozen=True)
class RawStmt(Stmt):
stmt: ast.stmt
def accept(self, visitor: Stmt.Visitor[T]) -> T:
return visitor.visit_raw_stmt(self)
###############
# Expressions #
###############
@@ -254,6 +265,9 @@ class Expr(ABC):
@abstractmethod
def visit_slice_expr(self, expr: SliceExpr) -> T: ...
@abstractmethod
def visit_raw_expr(self, expr: RawExpr) -> T: ...
@dataclass(frozen=True)
class BinaryExpr(Expr):
@@ -373,3 +387,11 @@ class SliceExpr(Expr):
def accept(self, visitor: Expr.Visitor[T]) -> T:
return visitor.visit_slice_expr(self)
@dataclass(frozen=True)
class RawExpr(Expr):
expr: ast.expr
def accept(self, visitor: Expr.Visitor[T]) -> T:
return visitor.visit_raw_expr(self)

View File

@@ -22,6 +22,8 @@ from midas.ast.python import (
LiteralExpr,
LogicalExpr,
MidasType,
RawExpr,
RawStmt,
ReturnStmt,
SliceExpr,
Stmt,
@@ -99,7 +101,7 @@ class PythonParser:
case _:
print(f"Unsupported statement: {ast.unparse(node)}")
return None
return RawStmt(location=location, stmt=node)
def parse_annotation_assign(self, node: ast.AnnAssign) -> list[Stmt]:
statements: list[Stmt] = []
@@ -461,7 +463,8 @@ class PythonParser:
)
case _:
raise UnsupportedSyntaxError(node)
print(f"Unsupported expression: {ast.unparse(node)}")
return RawExpr(location=location, expr=node)
def parse_bool_op(self, node: ast.BoolOp) -> LogicalExpr:
op: ast.boolop = node.op

View File

@@ -1,5 +1,9 @@
{
"stmts": [
{
"_type": "RawStmt",
"stmt": "from __future__ import annotations"
},
{
"_type": "TypeAssign",
"name": "df",

View File

@@ -1,5 +1,9 @@
{
"stmts": [
{
"_type": "RawStmt",
"stmt": "from __future__ import annotations"
},
{
"_type": "TypeAssign",
"name": "df",

View File

@@ -1,5 +1,9 @@
{
"stmts": [
{
"_type": "RawStmt",
"stmt": "from __future__ import annotations"
},
{
"_type": "Function",
"name": "func",

View File

@@ -22,6 +22,8 @@ from midas.ast.python import (
LogicalExpr,
MidasType,
Pass,
RawExpr,
RawStmt,
ReturnStmt,
SliceExpr,
Stmt,
@@ -191,6 +193,12 @@ class PythonAstJsonSerializer(
"body": self._serialize_list(stmt.body),
}
def visit_raw_stmt(self, stmt: RawStmt) -> dict:
return {
"_type": "RawStmt",
"stmt": ast.unparse(stmt.stmt),
}
def visit_binary_expr(self, expr: BinaryExpr) -> dict:
return {
"_type": "BinaryExpr",
@@ -284,3 +292,9 @@ class PythonAstJsonSerializer(
"upper": self._serialize_optional(expr.upper),
"step": self._serialize_optional(expr.step),
}
def visit_raw_expr(self, expr: RawExpr) -> dict:
return {
"_type": "RawExpr",
"expr": ast.unparse(expr.expr),
}