@@ -410,7 +410,7 @@ fn generate_member(aspect_id: u64, aspect_name: &str, member: &Member) -> TokenS
410410 let return_type = member
411411 . return_type
412412 . as_ref ( )
413- . map ( |r| generate_argument_type ( r , false , true ) )
413+ . map ( generate_return_type )
414414 . unwrap_or_else ( || quote ! ( ( ) ) ) ;
415415 let name_str = name. to_string ( ) ;
416416
@@ -503,7 +503,7 @@ fn generate_run_member(aspect_name: &Ident, _type: MemberType, member: &Member)
503503 }
504504 } )
505505 . unwrap_or_default ( ) ;
506- let serialize = generate_argument_serialize (
506+ let serialize = generate_return_serialize (
507507 "result" ,
508508 & member. return_type . clone ( ) . unwrap_or ( ArgumentType :: Empty ) ,
509509 false ,
@@ -592,16 +592,38 @@ fn generate_argument_serialize(
592592 argument_name : & str ,
593593 argument_type : & ArgumentType ,
594594 optional : bool ,
595+ ) -> TokenStream {
596+ generate_argument_serialize_inner ( argument_name, argument_type, optional, false )
597+ }
598+
599+ fn generate_return_serialize (
600+ argument_name : & str ,
601+ argument_type : & ArgumentType ,
602+ optional : bool ,
603+ ) -> TokenStream {
604+ generate_argument_serialize_inner ( argument_name, argument_type, optional, true )
605+ }
606+
607+ fn generate_argument_serialize_inner (
608+ argument_name : & str ,
609+ argument_type : & ArgumentType ,
610+ optional : bool ,
611+ is_return : bool ,
595612) -> TokenStream {
596613 let name = Ident :: new ( & argument_name. to_case ( Case :: Snake ) , Span :: call_site ( ) ) ;
597614 match argument_type {
598- ArgumentType :: Node {
599- _type,
600- return_id_parameter_name : _,
601- } => match optional {
602- true => quote ! ( #name. map( |n| n. get_id( ) ) ) ,
603- false => quote ! ( #name. get_id( ) ) ,
604- } ,
615+ ArgumentType :: Node { .. } => {
616+ if is_return {
617+ // For return values, the value is already an Id, just use it directly
618+ quote ! ( #name)
619+ } else {
620+ // For arguments, the value is Arc<Node>, need to call get_id()
621+ match optional {
622+ true => quote ! ( #name. map( |n| n. get_id( ) ) ) ,
623+ false => quote ! ( #name. get_id( ) ) ,
624+ }
625+ }
626+ }
605627 ArgumentType :: Color => quote ! ( [ #name. c. r, #name. c. g, #name. c. b, #name. a] ) ,
606628 ArgumentType :: Vec ( v) => {
607629 let mapping = generate_argument_serialize ( "a" , v, false ) ;
@@ -619,6 +641,13 @@ fn generate_argument_decl(argument: &Argument, owned_values: bool) -> TokenStrea
619641 let mut _type = generate_argument_type ( & argument. _type , argument. optional , owned_values) ;
620642 quote ! ( #name: #_type)
621643}
644+ fn generate_return_type ( argument_type : & ArgumentType ) -> TokenStream {
645+ // For return types, if it's a Node, we allow returning just Id instead of Arc<Node>
646+ match argument_type {
647+ ArgumentType :: Node { .. } => quote ! ( crate :: nodes:: Id ) ,
648+ _ => generate_argument_type ( argument_type, false , true ) ,
649+ }
650+ }
622651fn argument_type_option_name ( argument_type : & ArgumentType ) -> String {
623652 match argument_type {
624653 ArgumentType :: Empty => "Empty" . to_string ( ) ,
0 commit comments