diff --git a/gen/python.py b/gen/python.py index 35908f7..2e6c7d3 100644 --- a/gen/python.py +++ b/gen/python.py @@ -82,6 +82,10 @@ class IfStmt: orelse: list[Stmt] +class Pass: + pass + + ###< diff --git a/midas/ast/printer.py b/midas/ast/printer.py index e52472c..77a6069 100644 --- a/midas/ast/printer.py +++ b/midas/ast/printer.py @@ -593,6 +593,9 @@ class PythonAstPrinter( self._mark_last() else_stmt.accept(self) + def visit_pass(self, stmt: p.Pass) -> None: + self._write_line("Pass") + def visit_binary_expr(self, expr: p.BinaryExpr) -> None: self._write_line("BinaryExpr") with self._child_level(): diff --git a/midas/ast/python.py b/midas/ast/python.py index f025e2f..f3c9e1c 100644 --- a/midas/ast/python.py +++ b/midas/ast/python.py @@ -107,6 +107,9 @@ class Stmt(ABC): @abstractmethod def visit_if_stmt(self, stmt: IfStmt) -> T: ... + @abstractmethod + def visit_pass(self, stmt: Pass) -> T: ... + @dataclass(frozen=True) class ExpressionStmt(Stmt): @@ -178,6 +181,14 @@ class IfStmt(Stmt): return visitor.visit_if_stmt(self) +@dataclass(frozen=True) +class Pass(Stmt): + pass + + def accept(self, visitor: Stmt.Visitor[T]) -> T: + return visitor.visit_pass(self) + + ############### # Expressions # ############### diff --git a/midas/checker/python.py b/midas/checker/python.py index a0f7a06..93ac111 100644 --- a/midas/checker/python.py +++ b/midas/checker/python.py @@ -328,6 +328,9 @@ class PythonTyper( if body_returned and else_returned: raise ReturnException() + def visit_pass(self, stmt: p.Pass) -> None: + pass + def visit_binary_expr(self, expr: p.BinaryExpr) -> Type: method: Optional[str] = OPERATOR_METHODS.get(expr.operator.__class__) if method is None: diff --git a/midas/checker/resolver.py b/midas/checker/resolver.py index 12f18cf..eb0a6e8 100644 --- a/midas/checker/resolver.py +++ b/midas/checker/resolver.py @@ -150,6 +150,9 @@ class Resolver(p.Stmt.Visitor[None], p.Expr.Visitor[None]): self.resolve(*stmt.orelse) self.end_scope() + def visit_pass(self, stmt: p.Pass) -> None: + pass + def visit_binary_expr(self, expr: p.BinaryExpr) -> None: self.resolve(expr.left) self.resolve(expr.right) diff --git a/midas/cli/highlighter.py b/midas/cli/highlighter.py index bc7727c..ce63d62 100644 --- a/midas/cli/highlighter.py +++ b/midas/cli/highlighter.py @@ -188,6 +188,9 @@ class PythonHighlighter( for else_stmt in stmt.orelse: else_stmt.accept(self) + def visit_pass(self, stmt: p.Pass) -> None: + pass + def visit_binary_expr(self, expr: p.BinaryExpr) -> None: ... def visit_compare_expr(self, expr: p.CompareExpr) -> None: ... diff --git a/midas/generator/generator.py b/midas/generator/generator.py index a288d03..7ba1daf 100644 --- a/midas/generator/generator.py +++ b/midas/generator/generator.py @@ -140,5 +140,8 @@ class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): orelse=self._visit_body(stmt.orelse), ) + def visit_pass(self, stmt: p.Pass) -> ast.stmt: + return ast.Pass() + def _visit_body(self, stmts: list[p.Stmt]) -> list[ast.stmt]: return [stmt.accept(self) for stmt in stmts] diff --git a/tests/serializer/python.py b/tests/serializer/python.py index b090eea..e1f3fd4 100644 --- a/tests/serializer/python.py +++ b/tests/serializer/python.py @@ -20,6 +20,7 @@ from midas.ast.python import ( LiteralExpr, LogicalExpr, MidasType, + Pass, ReturnStmt, SliceExpr, Stmt, @@ -176,6 +177,11 @@ class PythonAstJsonSerializer( "orelse": self._serialize_list(stmt.orelse), } + def visit_pass(self, stmt: Pass) -> dict: + return { + "_type": "Pass", + } + def visit_binary_expr(self, expr: BinaryExpr) -> dict: return { "_type": "BinaryExpr",