@@ -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