@@ -282,7 +282,8 @@ pub trait AstHostFunctions {
282282 & mut self ,
283283 trait_name : & str ,
284284 for_type_name : & str ,
285- methods : Vec < NodeHandle > ,
285+ trait_args : Vec < NodeHandle > ,
286+ items : Vec < NodeHandle > ,
286287 ) -> NodeHandle ;
287288
288289 /// Create a function parameter
@@ -1215,6 +1216,19 @@ impl TypedAstBuilder {
12151216 self . types . get ( & handle) . cloned ( )
12161217 }
12171218
1219+ /// Get a named type by string name (creates unresolved type for inference)
1220+ fn get_type_by_name ( & mut self , name : & str ) -> Type {
1221+ // Create a named type with placeholder ID (0)
1222+ // Type inference will resolve this to the actual TypeId
1223+ Type :: Named {
1224+ id : zyntax_typed_ast:: TypeId :: new ( 0 ) ,
1225+ type_args : vec ! [ ] ,
1226+ const_args : vec ! [ ] ,
1227+ variance : vec ! [ ] ,
1228+ nullability : zyntax_typed_ast:: type_registry:: NullabilityKind :: NonNull ,
1229+ }
1230+ }
1231+
12181232 /// Get the default span for nodes
12191233 fn default_span ( & self ) -> Span {
12201234 self . inner . dummy_span ( )
@@ -1469,28 +1483,69 @@ impl AstHostFunctions for TypedAstBuilder {
14691483 & mut self ,
14701484 trait_name : & str ,
14711485 for_type_name : & str ,
1472- methods : Vec < NodeHandle > ,
1486+ trait_args : Vec < NodeHandle > ,
1487+ items : Vec < NodeHandle > ,
14731488 ) -> NodeHandle {
14741489 let span = self . default_span ( ) ;
14751490
1476- // TODO: Properly resolve the type by name from type registry
1477- // For now, use a placeholder type ID
1478- let for_type = Type :: Named {
1479- id : zyntax_typed_ast:: TypeId :: new ( 0 ) ,
1480- type_args : vec ! [ ] ,
1481- const_args : vec ! [ ] ,
1482- variance : vec ! [ ] ,
1483- nullability : zyntax_typed_ast:: type_registry:: NullabilityKind :: NonNull ,
1484- } ;
1491+ // Convert trait type arguments from handles to Type
1492+ let trait_type_args: Vec < Type > = trait_args. iter ( )
1493+ . filter_map ( |h| self . get_type_from_handle ( * h) )
1494+ . collect ( ) ;
1495+
1496+ // Create named type for the implementing type
1497+ // Type inference will resolve the actual TypeId later
1498+ let for_type = self . get_type_by_name ( for_type_name) ;
1499+
1500+ // Separate items into methods and associated types
1501+ let mut methods = Vec :: new ( ) ;
1502+ let mut associated_types = Vec :: new ( ) ;
1503+
1504+ for item_handle in items {
1505+ if let Some ( decl) = self . declarations . get ( & item_handle) {
1506+ match & decl. node {
1507+ TypedDeclaration :: Function ( func) => {
1508+ // Convert TypedParameter to TypedMethodParam
1509+ let method_params: Vec < TypedMethodParam > = func. params . iter ( ) . map ( |p| {
1510+ TypedMethodParam {
1511+ name : p. name ,
1512+ ty : p. ty . clone ( ) ,
1513+ mutability : p. mutability . clone ( ) ,
1514+ is_self : false , // Will be inferred by compiler
1515+ default_value : None ,
1516+ attributes : vec ! [ ] ,
1517+ kind : ParameterKind :: Regular ,
1518+ span : span,
1519+ }
1520+ } ) . collect ( ) ;
1521+
1522+ // Convert function to method
1523+ let method = TypedMethod {
1524+ name : func. name ,
1525+ type_params : func. type_params . clone ( ) ,
1526+ params : method_params,
1527+ return_type : func. return_type . clone ( ) ,
1528+ body : func. body . clone ( ) ,
1529+ visibility : func. visibility . clone ( ) ,
1530+ is_static : false ,
1531+ is_async : func. is_async ,
1532+ is_override : false ,
1533+ span : span,
1534+ } ;
1535+ methods. push ( method) ;
1536+ }
1537+ // TODO: Handle associated types when impl_assoc_type creates proper structures
1538+ _ => { }
1539+ }
1540+ }
1541+ }
14851542
1486- // For now, create impl with empty methods
1487- // Full implementation needs method body handling
14881543 let impl_decl = self . inner . impl_block (
14891544 trait_name,
1490- vec ! [ ] , // trait_type_args (TODO: handle generic trait args)
1545+ trait_type_args,
14911546 for_type,
1492- vec ! [ ] , // methods (TODO: convert handles to TypedMethod)
1493- vec ! [ ] , // associated_types
1547+ methods,
1548+ associated_types,
14941549 span,
14951550 ) ;
14961551
@@ -5120,10 +5175,31 @@ impl<'a, H: AstHostFunctions> CommandInterpreter<'a, H> {
51205175 _ => return Err ( crate :: error:: ZynPegError :: CodeGenError ( "impl_block: missing type_name" . into ( ) ) ) ,
51215176 } ;
51225177
5123- // TODO: Handle trait_args and items (methods/associated types)
5124- let methods = vec ! [ ] ;
5178+ // Extract trait type arguments (e.g., <Tensor> in Add<Tensor>)
5179+ let trait_args: Vec < NodeHandle > = match args. get ( "trait_args" ) {
5180+ Some ( RuntimeValue :: List ( vals) ) => vals. iter ( ) . filter_map ( |v| {
5181+ if let RuntimeValue :: Node ( h) = v {
5182+ Some ( * h)
5183+ } else {
5184+ None
5185+ }
5186+ } ) . collect ( ) ,
5187+ _ => vec ! [ ] , // No type arguments
5188+ } ;
5189+
5190+ // Extract impl items (methods and associated types)
5191+ let items: Vec < NodeHandle > = match args. get ( "items" ) {
5192+ Some ( RuntimeValue :: List ( vals) ) => vals. iter ( ) . filter_map ( |v| {
5193+ if let RuntimeValue :: Node ( h) = v {
5194+ Some ( * h)
5195+ } else {
5196+ None
5197+ }
5198+ } ) . collect ( ) ,
5199+ _ => vec ! [ ] , // No items
5200+ } ;
51255201
5126- let handle = self . host . create_impl_block ( & trait_name, & for_type, methods ) ;
5202+ let handle = self . host . create_impl_block ( & trait_name, & for_type, trait_args , items ) ;
51275203 Ok ( RuntimeValue :: Node ( handle) )
51285204 }
51295205
0 commit comments