feat(parser): add dictionary expression
This commit is contained in:
@@ -157,6 +157,11 @@ class ListExpr:
|
|||||||
items: list[Expr]
|
items: list[Expr]
|
||||||
|
|
||||||
|
|
||||||
|
class DictExpr:
|
||||||
|
keys: list[Optional[Expr]]
|
||||||
|
values: list[Expr]
|
||||||
|
|
||||||
|
|
||||||
class SubscriptExpr:
|
class SubscriptExpr:
|
||||||
object: Expr
|
object: Expr
|
||||||
index: Expr
|
index: Expr
|
||||||
|
|||||||
@@ -745,6 +745,27 @@ class PythonAstPrinter(
|
|||||||
self._mark_last()
|
self._mark_last()
|
||||||
item.accept(self)
|
item.accept(self)
|
||||||
|
|
||||||
|
def visit_dict_expr(self, expr: p.DictExpr) -> None:
|
||||||
|
self._write_line("DictExpr")
|
||||||
|
with self._child_level():
|
||||||
|
self._write_line("keys")
|
||||||
|
with self._child_level():
|
||||||
|
for i, key in enumerate(expr.keys):
|
||||||
|
self._idx = i
|
||||||
|
if i == len(expr.keys) - 1:
|
||||||
|
self._mark_last()
|
||||||
|
if key is None:
|
||||||
|
self._write_line("None")
|
||||||
|
else:
|
||||||
|
key.accept(self)
|
||||||
|
self._write_line("values", last=True)
|
||||||
|
with self._child_level():
|
||||||
|
for i, value in enumerate(expr.values):
|
||||||
|
self._idx = i
|
||||||
|
if i == len(expr.values) - 1:
|
||||||
|
self._mark_last()
|
||||||
|
value.accept(self)
|
||||||
|
|
||||||
def visit_subscript_expr(self, expr: p.SubscriptExpr) -> None:
|
def visit_subscript_expr(self, expr: p.SubscriptExpr) -> None:
|
||||||
self._write_line("SubscriptExpr")
|
self._write_line("SubscriptExpr")
|
||||||
with self._child_level():
|
with self._child_level():
|
||||||
|
|||||||
@@ -259,6 +259,9 @@ class Expr(ABC):
|
|||||||
@abstractmethod
|
@abstractmethod
|
||||||
def visit_list_expr(self, expr: ListExpr) -> T: ...
|
def visit_list_expr(self, expr: ListExpr) -> T: ...
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def visit_dict_expr(self, expr: DictExpr) -> T: ...
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def visit_subscript_expr(self, expr: SubscriptExpr) -> T: ...
|
def visit_subscript_expr(self, expr: SubscriptExpr) -> T: ...
|
||||||
|
|
||||||
@@ -370,6 +373,15 @@ class ListExpr(Expr):
|
|||||||
return visitor.visit_list_expr(self)
|
return visitor.visit_list_expr(self)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class DictExpr(Expr):
|
||||||
|
keys: list[Optional[Expr]]
|
||||||
|
values: list[Expr]
|
||||||
|
|
||||||
|
def accept(self, visitor: Expr.Visitor[T]) -> T:
|
||||||
|
return visitor.visit_dict_expr(self)
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class SubscriptExpr(Expr):
|
class SubscriptExpr(Expr):
|
||||||
object: Expr
|
object: Expr
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from midas.ast.python import (
|
|||||||
CastExpr,
|
CastExpr,
|
||||||
CompareExpr,
|
CompareExpr,
|
||||||
ConstraintType,
|
ConstraintType,
|
||||||
|
DictExpr,
|
||||||
Expr,
|
Expr,
|
||||||
ExpressionStmt,
|
ExpressionStmt,
|
||||||
ForStmt,
|
ForStmt,
|
||||||
@@ -447,6 +448,16 @@ class PythonParser:
|
|||||||
items=[self.parse_expr(item) for item in items],
|
items=[self.parse_expr(item) for item in items],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
case ast.Dict(keys=keys, values=values):
|
||||||
|
return DictExpr(
|
||||||
|
location=location,
|
||||||
|
keys=[
|
||||||
|
self.parse_expr(key) if key is not None else None
|
||||||
|
for key in keys
|
||||||
|
],
|
||||||
|
values=[self.parse_expr(value) for value in values],
|
||||||
|
)
|
||||||
|
|
||||||
case ast.Subscript(value=value, slice=index):
|
case ast.Subscript(value=value, slice=index):
|
||||||
return SubscriptExpr(
|
return SubscriptExpr(
|
||||||
location=location,
|
location=location,
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ from midas.ast.python import (
|
|||||||
CastExpr,
|
CastExpr,
|
||||||
CompareExpr,
|
CompareExpr,
|
||||||
ConstraintType,
|
ConstraintType,
|
||||||
|
DictExpr,
|
||||||
Expr,
|
Expr,
|
||||||
ExpressionStmt,
|
ExpressionStmt,
|
||||||
ForStmt,
|
ForStmt,
|
||||||
@@ -278,6 +279,13 @@ class PythonAstJsonSerializer(
|
|||||||
"items": [item.accept(self) for item in expr.items],
|
"items": [item.accept(self) for item in expr.items],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def visit_dict_expr(self, expr: DictExpr) -> dict:
|
||||||
|
return {
|
||||||
|
"_type": "DictExpr",
|
||||||
|
"keys": [self._serialize_optional(key) for key in expr.keys],
|
||||||
|
"values": self._serialize_list(expr.values),
|
||||||
|
}
|
||||||
|
|
||||||
def visit_subscript_expr(self, expr: SubscriptExpr) -> dict:
|
def visit_subscript_expr(self, expr: SubscriptExpr) -> dict:
|
||||||
return {
|
return {
|
||||||
"_type": "SubscriptExpr",
|
"_type": "SubscriptExpr",
|
||||||
|
|||||||
Reference in New Issue
Block a user