@@ -47,7 +47,8 @@ use crate::ZynGrammar;
4747// Re-export types from typed_ast for host function implementations
4848pub use zyntax_typed_ast:: {
4949 TypedASTBuilder , TypedProgram , TypedNode , TypedDeclaration , TypedExpression ,
50- TypedStatement , TypedBlock , BinaryOp , UnaryOp , Span ,
50+ TypedStatement , TypedBlock , BinaryOp , UnaryOp , Span , InternedString ,
51+ TypedClass , TypedEnum , TypedField , TypedVariant , TypedVariantFields ,
5152 type_registry:: { Type , PrimitiveType , Mutability , Visibility } ,
5253} ;
5354
@@ -834,6 +835,10 @@ pub struct TypedAstBuilder {
834835 blocks : HashMap < NodeHandle , TypedBlock > ,
835836 /// Stored declaration nodes by handle
836837 declarations : HashMap < NodeHandle , TypedNode < TypedDeclaration > > ,
838+ /// Stored field nodes by handle
839+ fields : HashMap < NodeHandle , TypedField > ,
840+ /// Stored variant nodes by handle
841+ variants : HashMap < NodeHandle , TypedVariant > ,
837842 /// Program declaration handles (in order)
838843 program_decls : Vec < NodeHandle > ,
839844}
@@ -853,6 +858,8 @@ impl TypedAstBuilder {
853858 statements : HashMap :: new ( ) ,
854859 blocks : HashMap :: new ( ) ,
855860 declarations : HashMap :: new ( ) ,
861+ fields : HashMap :: new ( ) ,
862+ variants : HashMap :: new ( ) ,
856863 program_decls : Vec :: new ( ) ,
857864 }
858865 }
@@ -907,6 +914,16 @@ impl TypedAstBuilder {
907914 self . blocks . get ( & handle) . cloned ( )
908915 }
909916
917+ /// Get a field by handle (cloning it)
918+ fn get_field ( & self , handle : NodeHandle ) -> Option < TypedField > {
919+ self . fields . get ( & handle) . cloned ( )
920+ }
921+
922+ /// Get a variant by handle (cloning it)
923+ fn get_variant ( & self , handle : NodeHandle ) -> Option < TypedVariant > {
924+ self . variants . get ( & handle) . cloned ( )
925+ }
926+
910927 /// Get the default span for nodes
911928 fn default_span ( & self ) -> Span {
912929 self . inner . dummy_span ( )
@@ -1319,28 +1336,103 @@ impl AstHostFunctions for TypedAstBuilder {
13191336 self . alloc_handle ( )
13201337 }
13211338
1322- fn create_struct ( & mut self , _name : & str , _fields : Vec < NodeHandle > ) -> NodeHandle {
1323- // TODO: Implement struct declaration once TypedDeclaration supports it
1324- // For now, just allocate a handle
1325- self . alloc_handle ( )
1339+ fn create_struct ( & mut self , name : & str , field_handles : Vec < NodeHandle > ) -> NodeHandle {
1340+ let span = self . default_span ( ) ;
1341+
1342+ // Collect fields from handles
1343+ let fields: Vec < TypedField > = field_handles
1344+ . iter ( )
1345+ . filter_map ( |h| self . get_field ( * h) )
1346+ . collect ( ) ;
1347+
1348+ let class = TypedClass {
1349+ name : InternedString :: new_global ( name) ,
1350+ type_params : Vec :: new ( ) ,
1351+ extends : None ,
1352+ implements : Vec :: new ( ) ,
1353+ fields,
1354+ methods : Vec :: new ( ) ,
1355+ constructors : Vec :: new ( ) ,
1356+ visibility : Visibility :: Public ,
1357+ is_abstract : false ,
1358+ is_final : false ,
1359+ span,
1360+ } ;
1361+
1362+ let decl = TypedNode {
1363+ node : TypedDeclaration :: Class ( class) ,
1364+ ty : Type :: Never ,
1365+ span,
1366+ } ;
1367+
1368+ self . store_decl ( decl)
13261369 }
13271370
1328- fn create_enum ( & mut self , _name : & str , _variants : Vec < NodeHandle > ) -> NodeHandle {
1329- // TODO: Implement enum declaration once TypedDeclaration supports it
1330- // For now, just allocate a handle
1331- self . alloc_handle ( )
1371+ fn create_enum ( & mut self , name : & str , variant_handles : Vec < NodeHandle > ) -> NodeHandle {
1372+ let span = self . default_span ( ) ;
1373+
1374+ // Collect variants from handles
1375+ let variants: Vec < TypedVariant > = variant_handles
1376+ . iter ( )
1377+ . filter_map ( |h| self . get_variant ( * h) )
1378+ . collect ( ) ;
1379+
1380+ let enum_decl = TypedEnum {
1381+ name : InternedString :: new_global ( name) ,
1382+ type_params : Vec :: new ( ) ,
1383+ variants,
1384+ visibility : Visibility :: Public ,
1385+ span,
1386+ } ;
1387+
1388+ let decl = TypedNode {
1389+ node : TypedDeclaration :: Enum ( enum_decl) ,
1390+ ty : Type :: Never ,
1391+ span,
1392+ } ;
1393+
1394+ self . store_decl ( decl)
13321395 }
13331396
1334- fn create_field ( & mut self , _name : & str , _ty : NodeHandle ) -> NodeHandle {
1335- // TODO: Implement field once TypedField is available
1336- // For now, just allocate a handle
1337- self . alloc_handle ( )
1397+ fn create_field ( & mut self , name : & str , ty : NodeHandle ) -> NodeHandle {
1398+ let span = self . default_span ( ) ;
1399+
1400+ // Get the type - for now use a placeholder if not available
1401+ let field_type = if let Some ( _expr) = self . get_expr ( ty) {
1402+ // TODO: Extract type from type expression when type expr support is complete
1403+ Type :: Primitive ( PrimitiveType :: I32 )
1404+ } else {
1405+ Type :: Primitive ( PrimitiveType :: I32 )
1406+ } ;
1407+
1408+ let field = TypedField {
1409+ name : InternedString :: new_global ( name) ,
1410+ ty : field_type,
1411+ initializer : None ,
1412+ visibility : Visibility :: Public ,
1413+ mutability : Mutability :: Immutable ,
1414+ is_static : false ,
1415+ span,
1416+ } ;
1417+
1418+ let handle = self . alloc_handle ( ) ;
1419+ self . fields . insert ( handle, field) ;
1420+ handle
13381421 }
13391422
1340- fn create_variant ( & mut self , _name : & str ) -> NodeHandle {
1341- // TODO: Implement variant once TypedEnumVariant is available
1342- // For now, just allocate a handle
1343- self . alloc_handle ( )
1423+ fn create_variant ( & mut self , name : & str ) -> NodeHandle {
1424+ let span = self . default_span ( ) ;
1425+
1426+ let variant = TypedVariant {
1427+ name : InternedString :: new_global ( name) ,
1428+ fields : TypedVariantFields :: Unit , // Simple Zig-style enum variants
1429+ discriminant : None ,
1430+ span,
1431+ } ;
1432+
1433+ let handle = self . alloc_handle ( ) ;
1434+ self . variants . insert ( handle, variant) ;
1435+ handle
13441436 }
13451437
13461438 fn set_span ( & mut self , _node : NodeHandle , _start : usize , _end : usize ) {
0 commit comments