@@ -152,8 +152,12 @@ E_LOOKUP_INFO_FUNCTION_DEF(default)
152152 E_TypeKind direct_type_kind = e_type_kind_from_key (direct_type_key );
153153 if (direct_type_kind == E_TypeKind_Struct ||
154154 direct_type_kind == E_TypeKind_Class ||
155- direct_type_kind == E_TypeKind_Union ||
156- direct_type_kind == E_TypeKind_Enum )
155+ direct_type_kind == E_TypeKind_Union )
156+ {
157+ E_MemberArray data_members = e_type_data_members_from_key__cached (direct_type_key );
158+ lookup_info .named_expr_count = data_members .count ;
159+ }
160+ else if (direct_type_kind == E_TypeKind_Enum )
157161 {
158162 E_Type * direct_type = e_type_from_key__cached (direct_type_key );
159163 lookup_info .named_expr_count = direct_type -> count ;
@@ -430,7 +434,9 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default)
430434
431435 //- rjf: pull out specific kinds of types
432436 B32 do_struct_range = 0 ;
437+ B32 do_enum_range = 0 ;
433438 B32 do_index_range = 0 ;
439+ E_TypeKey enum_type_key = zero_struct ;
434440 E_TypeKey struct_type_key = zero_struct ;
435441 E_TypeKind struct_type_kind = E_TypeKind_Null ;
436442 if (e_type_kind_is_pointer_or_ref (lhs_type_kind ))
@@ -439,27 +445,35 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default)
439445 if (lhs_type -> count == 1 &&
440446 (direct_type_kind == E_TypeKind_Struct ||
441447 direct_type_kind == E_TypeKind_Union ||
442- direct_type_kind == E_TypeKind_Class ||
443- direct_type_kind == E_TypeKind_Enum ))
448+ direct_type_kind == E_TypeKind_Class ))
444449 {
445450 struct_type_key = direct_type_key ;
446451 struct_type_kind = direct_type_kind ;
447452 do_struct_range = 1 ;
448453 }
454+ else if (lhs_type -> count == 1 && direct_type_kind == E_TypeKind_Enum )
455+ {
456+ do_enum_range = 1 ;
457+ enum_type_key = direct_type_key ;
458+ }
449459 else
450460 {
451461 do_index_range = 1 ;
452462 }
453463 }
454464 else if (lhs_type_kind == E_TypeKind_Struct ||
455465 lhs_type_kind == E_TypeKind_Union ||
456- lhs_type_kind == E_TypeKind_Class ||
457- lhs_type_kind == E_TypeKind_Enum )
466+ lhs_type_kind == E_TypeKind_Class )
458467 {
459468 struct_type_key = lhs_type_key ;
460469 struct_type_kind = lhs_type_kind ;
461470 do_struct_range = 1 ;
462471 }
472+ else if (lhs_type_kind == E_TypeKind_Enum )
473+ {
474+ enum_type_key = lhs_type_key ;
475+ do_enum_range = 1 ;
476+ }
463477 else if (lhs_type_kind == E_TypeKind_Set )
464478 {
465479 do_index_range = 1 ;
@@ -472,15 +486,29 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default)
472486 //- rjf: struct case -> the lookup-range will return a range of members
473487 if (do_struct_range )
474488 {
475- E_Type * struct_type = e_type_from_key__cached (struct_type_key );
476- Rng1U64 legal_idx_range = r1u64 (0 , struct_type -> count );
489+ E_MemberArray data_members = e_type_data_members_from_key__cached (struct_type_key );
490+ Rng1U64 legal_idx_range = r1u64 (0 , data_members .count );
491+ Rng1U64 read_range = intersect_1u64 (legal_idx_range , idx_range );
492+ U64 read_range_count = dim_1u64 (read_range );
493+ for (U64 idx = 0 ; idx < read_range_count ; idx += 1 )
494+ {
495+ U64 member_idx = idx + read_range .min ;
496+ String8 member_name = data_members .v [member_idx ].name ;
497+ exprs [idx ] = e_expr_irext_member_access (arena , lhs , & lhs_irtree , member_name );
498+ }
499+ }
500+
501+ //- rjf: enum case -> the lookup-range will return a range of enum constants
502+ else if (do_enum_range )
503+ {
504+ E_Type * type = e_type_from_key__cached (enum_type_key );
505+ Rng1U64 legal_idx_range = r1u64 (0 , type -> count );
477506 Rng1U64 read_range = intersect_1u64 (legal_idx_range , idx_range );
478507 U64 read_range_count = dim_1u64 (read_range );
479508 for (U64 idx = 0 ; idx < read_range_count ; idx += 1 )
480509 {
481510 U64 member_idx = idx + read_range .min ;
482- String8 member_name = (struct_type -> members ? struct_type -> members [member_idx ].name :
483- struct_type -> enum_vals ? struct_type -> enum_vals [member_idx ].name : str8_lit ("" ));
511+ String8 member_name = type -> enum_vals [member_idx ].name ;
484512 exprs [idx ] = e_expr_irext_member_access (arena , lhs , & lhs_irtree , member_name );
485513 }
486514 }
0 commit comments