fix(parser): add function body and all_args property

This commit is contained in:
2026-05-28 15:26:33 +02:00
parent 6bf91db757
commit 8304760fe0
3 changed files with 21 additions and 2 deletions

View File

@@ -46,13 +46,18 @@ class Function:
args: list[Argument] args: list[Argument]
kwonlyargs: list[Argument] kwonlyargs: list[Argument]
returns: Optional[MidasType] returns: Optional[MidasType]
body: list[Stmt]
@dataclass(frozen=True, kw_only=True) @dataclass(frozen=True, kw_only=True)
class Argument: class Argument:
location: Optional[Location] = None location: Optional[Location] = None
name: Optional[str] name: str
type: Optional[MidasType] type: Optional[MidasType]
@property
def all_args(self) -> list[Argument]:
return self.posonlyargs + self.args + self.kwonlyargs
class TypeAssign: class TypeAssign:
name: str name: str

View File

@@ -116,13 +116,18 @@ class Function(Stmt):
args: list[Argument] args: list[Argument]
kwonlyargs: list[Argument] kwonlyargs: list[Argument]
returns: Optional[MidasType] returns: Optional[MidasType]
body: list[Stmt]
@dataclass(frozen=True, kw_only=True) @dataclass(frozen=True, kw_only=True)
class Argument: class Argument:
location: Optional[Location] = None location: Optional[Location] = None
name: Optional[str] name: str
type: Optional[MidasType] type: Optional[MidasType]
@property
def all_args(self) -> list[Argument]:
return self.posonlyargs + self.args + self.kwonlyargs
def accept(self, visitor: Stmt.Visitor[T]) -> T: def accept(self, visitor: Stmt.Visitor[T]) -> T:
return visitor.visit_function(self) return visitor.visit_function(self)

View File

@@ -128,11 +128,19 @@ class PythonParser:
kwonlyargs=kwonlyargs, kwonlyargs=kwonlyargs,
), ),
returns=returns, returns=returns,
body=raw_body,
): ):
def parse_args(args_list: list[ast.arg]) -> list[Function.Argument]: def parse_args(args_list: list[ast.arg]) -> list[Function.Argument]:
return [self._parse_function_argument(arg) for arg in args_list] return [self._parse_function_argument(arg) for arg in args_list]
body: list[Stmt] = []
for stmt in raw_body:
stmts = self.parse_stmt(stmt)
if isinstance(stmts, Stmt):
body.append(stmts)
elif stmts is not None:
body.extend(stmts)
return Function( return Function(
location=loc, location=loc,
name=name, name=name,
@@ -140,6 +148,7 @@ class PythonParser:
args=parse_args(args), args=parse_args(args),
kwonlyargs=parse_args(kwonlyargs), kwonlyargs=parse_args(kwonlyargs),
returns=self._parse_type(returns) if returns is not None else None, returns=self._parse_type(returns) if returns is not None else None,
body=body,
) )
case _: case _:
print(f"Unsupported function definition: {ast.unparse(node)}") print(f"Unsupported function definition: {ast.unparse(node)}")