@@ -2711,13 +2711,54 @@ E_TYPE_IREXT_FUNCTION_DEF(list)
27112711{
27122712 E_IRExt result = {0 };
27132713 E_Type * type = e_type_from_key (irtree -> type_key );
2714- String8 next_link_member_name = str8_lit ("next" );
2715- if (type -> args != 0 && type -> count > 0 )
2714+
2715+ //- rjf: get member encoding the link to the next node
2716+ E_Member next_link_member = {0 };
27162717 {
2717- next_link_member_name = type -> args [0 ]-> string ;
2718+ E_TypeKey node_type_key = e_type_key_unwrap (irtree -> type_key , E_TypeUnwrapFlag_All );
2719+
2720+ // rjf: try explicitly-passed name
2721+ if (next_link_member .kind == E_MemberKind_Null && type -> args != 0 && type -> count > 0 && type -> args [0 ]-> kind == E_ExprKind_LeafIdentifier )
2722+ {
2723+ String8 name = type -> args [0 ]-> string ;
2724+ next_link_member = e_type_member_from_key_name__cached (node_type_key , name );
2725+ }
2726+
2727+ // rjf: try `next`
2728+ if (next_link_member .kind == E_MemberKind_Null )
2729+ {
2730+ next_link_member = e_type_member_from_key_name__cached (node_type_key , str8_lit ("next" ));
2731+ }
2732+
2733+ // rjf: try `prev`
2734+ if (next_link_member .kind == E_MemberKind_Null )
2735+ {
2736+ next_link_member = e_type_member_from_key_name__cached (node_type_key , str8_lit ("prev" ));
2737+ }
2738+
2739+ // rjf: try any pointer to the same type
2740+ if (next_link_member .kind == E_MemberKind_Null )
2741+ {
2742+ E_Type * node_type = e_type_from_key (node_type_key );
2743+ if (node_type -> members != 0 )
2744+ {
2745+ for EachIndex (idx , node_type -> count )
2746+ {
2747+ E_TypeKey member_type_key = node_type -> members [idx ].type_key ;
2748+ E_TypeKey member_type_key_undecorated = e_type_key_unwrap (member_type_key , E_TypeUnwrapFlag_AllDecorative );
2749+ E_TypeKey member_ptee_type_key = e_type_key_unwrap (member_type_key_undecorated , E_TypeUnwrapFlag_All );
2750+ if (e_type_kind_from_key (member_type_key_undecorated ) == E_TypeKind_Ptr &&
2751+ e_type_key_match (member_ptee_type_key , node_type_key ))
2752+ {
2753+ next_link_member = node_type -> members [idx ];
2754+ break ;
2755+ }
2756+ }
2757+ }
2758+ }
27182759 }
2719- E_TypeKey node_type_key = e_type_key_unwrap ( irtree -> type_key , E_TypeUnwrapFlag_All );
2720- E_Member next_link_member = e_type_member_from_key_name__cached ( node_type_key , next_link_member_name );
2760+
2761+ //- rjf: generate expansion info
27212762 E_TypeExpandInfo info = {0 , 0 };
27222763 if (next_link_member .kind != E_MemberKind_DataField )
27232764 {
@@ -2765,6 +2806,7 @@ E_TYPE_IREXT_FUNCTION_DEF(list)
27652806 access_close (access );
27662807 scratch_end (scratch );
27672808 }
2809+
27682810 return result ;
27692811}
27702812
0 commit comments