Skip to content

Commit c203a12

Browse files
committed
Working on AST Generation
1 parent 6d5c4ea commit c203a12

File tree

1 file changed

+63
-5
lines changed

1 file changed

+63
-5
lines changed

pylasu/lionweb/ast_generation.py

+63-5
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,16 @@ def main(dependencies, lionweb_language, output):
8686
names=[ast.alias(name='dataclass', asname=None)],
8787
level=0
8888
)
89+
import_enum = ast.ImportFrom(
90+
module="enum",
91+
names=[ast.alias(name="Enum", asname=None)],
92+
level=0
93+
)
94+
import_typing = ast.ImportFrom(
95+
module='typing',
96+
names=[ast.alias(name='Optional', asname=None)],
97+
level=0
98+
)
8999
import_starlasu = ast.ImportFrom(
90100
module='pylasu.model.metamodel',
91101
names=[ast.alias(name='Expression', asname='StarLasuExpression'),
@@ -104,7 +114,7 @@ def main(dependencies, lionweb_language, output):
104114
names=[ast.alias(name='Node', asname=None)],
105115
level=0
106116
)
107-
module = ast.Module(body=[import_abc, import_dataclass, import_starlasu, import_node], type_ignores=[])
117+
module = ast.Module(body=[import_abc, import_dataclass, import_typing, import_enum, import_starlasu, import_node], type_ignores=[])
108118

109119

110120
for element in language.get_elements():
@@ -115,7 +125,22 @@ def main(dependencies, lionweb_language, output):
115125
elif isinstance(element, PrimitiveType):
116126
pass
117127
elif isinstance(element, Enumeration):
118-
pass
128+
members = [
129+
ast.Assign(
130+
targets=[ast.Name(id=literal.get_name(), ctx=ast.Store())],
131+
value=ast.Constant(value=literal.get_name())
132+
)
133+
for literal in element.get_literals()
134+
]
135+
136+
enum_class = ast.ClassDef(
137+
name=element.get_name(),
138+
bases=[ast.Name(id="Enum", ctx=ast.Load())],
139+
keywords=[],
140+
body=members,
141+
decorator_list=[]
142+
)
143+
module.body.append(enum_class)
119144
else:
120145
raise ValueError(f"Unsupported {element}")
121146

@@ -162,19 +187,52 @@ def main(dependencies, lionweb_language, output):
162187
field_name = feature.get_name()
163188
if field_name in keyword.kwlist:
164189
field_name = f"{field_name}_"
190+
type = feature.get_type().get_name()
191+
if feature.is_multiple():
192+
type = f"List[{type}]"
193+
elif feature.is_optional():
194+
type = f"Optional[{type}]"
165195
field = ast.AnnAssign(
166196
target=ast.Name(id=field_name, ctx=ast.Store()),
167-
annotation=ast.Constant(value=feature.get_type().get_name()),
197+
annotation=ast.Constant(value=type),
168198
value=None,
169199
simple=1,
170200
)
171201
if len(classdef.body) == 1 and isinstance(classdef.body[0], ast.Pass):
172202
classdef.body = []
173203
classdef.body.append(field)
174204
elif isinstance(feature, Reference):
175-
pass
205+
field_name = feature.get_name()
206+
if field_name in keyword.kwlist:
207+
field_name = f"{field_name}_"
208+
type = f"ReferenceByName[{feature.get_type().get_name()}]"
209+
if feature.is_optional():
210+
type = f"Optional[{type}]"
211+
field = ast.AnnAssign(
212+
target=ast.Name(id=field_name, ctx=ast.Store()),
213+
annotation=ast.Constant(value=type),
214+
value=None,
215+
simple=1,
216+
)
217+
if len(classdef.body) == 1 and isinstance(classdef.body[0], ast.Pass):
218+
classdef.body = []
219+
classdef.body.append(field)
176220
elif isinstance(feature, Property):
177-
pass
221+
field_name = feature.get_name()
222+
if field_name in keyword.kwlist:
223+
field_name = f"{field_name}_"
224+
type = feature.get_type().get_name()
225+
if feature.is_optional():
226+
type = f"Optional[{type}]"
227+
field = ast.AnnAssign(
228+
target=ast.Name(id=field_name, ctx=ast.Store()),
229+
annotation=ast.Constant(value=type),
230+
value=None,
231+
simple=1,
232+
)
233+
if len(classdef.body) == 1 and isinstance(classdef.body[0], ast.Pass):
234+
classdef.body = []
235+
classdef.body.append(field)
178236
else:
179237
raise ValueError()
180238

0 commit comments

Comments
 (0)