only and omit; notes & dead code deletion

This commit is contained in:
Ryan Fleury
2025-04-11 14:16:48 -07:00
parent 83a31a5229
commit 3e49e92e98
9 changed files with 182 additions and 222 deletions
+10 -8
View File
@@ -297,14 +297,16 @@ E_MemberKind;
typedef U32 E_TypeFlags;
enum
{
E_TypeFlag_Const = (1<<0),
E_TypeFlag_Volatile = (1<<1),
E_TypeFlag_IsPlainText = (1<<2),
E_TypeFlag_IsCodeText = (1<<3),
E_TypeFlag_IsPathText = (1<<4),
E_TypeFlag_IsNotText = (1<<5),
E_TypeFlag_EditableChildren = (1<<6),
E_TypeFlag_InheritedOnAccess = (1<<7),
E_TypeFlag_Const = (1<<0),
E_TypeFlag_Volatile = (1<<1),
E_TypeFlag_IsPlainText = (1<<2),
E_TypeFlag_IsCodeText = (1<<3),
E_TypeFlag_IsPathText = (1<<4),
E_TypeFlag_IsNotText = (1<<5),
E_TypeFlag_EditableChildren = (1<<6),
E_TypeFlag_InheritedByMembers = (1<<7),
E_TypeFlag_InheritedByElements = (1<<8),
E_TypeFlag_ArrayLikeExpansion = (1<<9),
};
typedef struct E_Member E_Member;
+3 -177
View File
@@ -103,181 +103,6 @@ e_select_ir_ctx(E_IRCtx *ctx)
}
}
////////////////////////////////
//~ rjf: Member Filtering Lookup Rules
#if 0 // TODO(rjf): @eval
typedef struct E_MemberFilterAccel E_MemberFilterAccel;
struct E_MemberFilterAccel
{
E_MemberArray members;
};
E_LOOKUP_INFO_FUNCTION_DEF(only)
{
Temp scratch = scratch_begin(&arena, 1);
E_LookupInfo lookup_info = {0};
{
//- rjf: extract struct type
E_TypeKey struct_type_key = zero_struct;
{
E_TypeKey lhs_type_key = e_type_unwrap(lhs->type_key);
E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key);
if(e_type_kind_is_pointer_or_ref(lhs_type_kind))
{
E_Type *type = e_type_from_key__cached(lhs_type_key);
if(type->count == 1)
{
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(lhs->type_key));
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
if(direct_type_kind == E_TypeKind_Struct ||
direct_type_kind == E_TypeKind_Class ||
direct_type_kind == E_TypeKind_Union)
{
struct_type_key = direct_type_key;
}
}
}
else if(lhs_type_kind == E_TypeKind_Struct ||
lhs_type_kind == E_TypeKind_Class ||
lhs_type_kind == E_TypeKind_Union)
{
struct_type_key = lhs_type_key;
}
}
//- rjf: not struct -> fall back on default
if(e_type_key_match(struct_type_key, e_type_key_zero()))
{
lookup_info = E_LOOKUP_INFO_FUNCTION_NAME(default)(arena, lhs, tag, filter);
}
//- struct -> filter
else
{
E_MemberArray data_members = e_type_data_members_from_key__cached(struct_type_key);
E_MemberList data_members_list__filtered = {0};
for EachIndex(idx, data_members.count)
{
B32 fits_filter = 0;
for(E_Expr *name = tag->first->next; name != &e_expr_nil; name = name->next)
{
if(str8_match(name->string, data_members.v[idx].name, 0))
{
fits_filter = 1;
break;
}
}
if(fits_filter)
{
e_member_list_push(scratch.arena, &data_members_list__filtered, &data_members.v[idx]);
}
}
E_MemberFilterAccel *accel = push_array(arena, E_MemberFilterAccel, 1);
accel->members = e_member_array_from_list(arena, &data_members_list__filtered);
lookup_info.user_data = accel;
lookup_info.named_expr_count = accel->members.count;
}
}
scratch_end(scratch);
return lookup_info;
}
E_LOOKUP_INFO_FUNCTION_DEF(omit)
{
Temp scratch = scratch_begin(&arena, 1);
E_LookupInfo lookup_info = {0};
{
//- rjf: extract struct type
E_TypeKey struct_type_key = zero_struct;
{
E_TypeKey lhs_type_key = e_type_unwrap(lhs->type_key);
E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key);
if(e_type_kind_is_pointer_or_ref(lhs_type_kind))
{
E_Type *type = e_type_from_key__cached(lhs_type_key);
if(type->count == 1)
{
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(lhs->type_key));
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
if(direct_type_kind == E_TypeKind_Struct ||
direct_type_kind == E_TypeKind_Class ||
direct_type_kind == E_TypeKind_Union)
{
struct_type_key = direct_type_key;
}
}
}
else if(lhs_type_kind == E_TypeKind_Struct ||
lhs_type_kind == E_TypeKind_Class ||
lhs_type_kind == E_TypeKind_Union)
{
struct_type_key = lhs_type_key;
}
}
//- rjf: not struct -> fall back on default
if(e_type_key_match(struct_type_key, e_type_key_zero()))
{
lookup_info = E_LOOKUP_INFO_FUNCTION_NAME(default)(arena, lhs, tag, filter);
}
//- struct -> filter
else
{
E_MemberArray data_members = e_type_data_members_from_key__cached(struct_type_key);
E_MemberList data_members_list__filtered = {0};
for EachIndex(idx, data_members.count)
{
B32 fits_filter = 1;
for(E_Expr *name = tag->first->next; name != &e_expr_nil; name = name->next)
{
if(str8_match(name->string, data_members.v[idx].name, 0))
{
fits_filter = 0;
break;
}
}
if(fits_filter)
{
e_member_list_push(scratch.arena, &data_members_list__filtered, &data_members.v[idx]);
}
}
E_MemberFilterAccel *accel = push_array(arena, E_MemberFilterAccel, 1);
accel->members = e_member_array_from_list(arena, &data_members_list__filtered);
lookup_info.user_data = accel;
lookup_info.named_expr_count = accel->members.count;
}
}
scratch_end(scratch);
return lookup_info;
}
E_LOOKUP_RANGE_FUNCTION_DEF(only_and_omit)
{
if(user_data == 0)
{
E_LOOKUP_RANGE_FUNCTION_NAME(default)(arena, lhs, tag, filter, idx_range, exprs, exprs_strings, user_data);
}
else
{
Temp scratch = scratch_begin(&arena, 1);
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, lhs);
E_MemberFilterAccel *accel = (E_MemberFilterAccel *)user_data;
Rng1U64 legal_idx_range = r1u64(0, accel->members.count);
Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);
U64 read_range_count = dim_1u64(read_range);
for(U64 idx = 0; idx < read_range_count; idx += 1)
{
U64 member_idx = idx + read_range.min;
String8 member_name = accel->members.v[member_idx].name;
exprs[idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, member_name);
}
scratch_end(scratch);
}
}
#endif
////////////////////////////////
//~ rjf: Auto Hooks
@@ -1122,7 +947,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
for(;kind == E_TypeKind_Lens;)
{
E_Type *lens_type = e_type_from_key__cached(k);
if(lens_type->flags & E_TypeFlag_InheritedOnAccess)
if((lens_type->flags & E_TypeFlag_InheritedByMembers && expr->kind == E_ExprKind_MemberAccess) ||
(lens_type->flags & E_TypeFlag_InheritedByElements && expr->kind == E_ExprKind_ArrayIndex))
{
e_type_key_list_push_front(scratch.arena, &inherited_lenses, k);
}
@@ -2407,7 +2233,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
}
//- rjf: find any auto hooks according to this generation's type
if(allow_autohooks)
if(allow_autohooks && result.mode != E_Mode_Null)
{
E_ExprList exprs = e_auto_hook_exprs_from_type_key__cached(result.type_key);
for(E_ExprNode *n = exprs.first; n != 0; n = n->next)
+109
View File
@@ -2495,6 +2495,115 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(slice)
}
}
////////////////////////////////
//~ rjf: (Built-In Type Hooks) `only`, `omit` lenses
typedef struct E_MemberFilterAccel E_MemberFilterAccel;
struct E_MemberFilterAccel
{
E_MemberArray members;
};
E_TYPE_EXPAND_INFO_FUNCTION_DEF(only_and_omit)
{
Temp scratch = scratch_begin(&arena, 1);
E_TypeExpandInfo info = {0};
{
//- rjf: extract struct type
E_TypeKey struct_type_key = zero_struct;
{
E_TypeKey lhs_type_key = e_type_unwrap(irtree->type_key);
E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key);
if(e_type_kind_is_pointer_or_ref(lhs_type_kind))
{
E_Type *type = e_type_from_key__cached(lhs_type_key);
if(type->count == 1)
{
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(irtree->type_key));
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
if(direct_type_kind == E_TypeKind_Struct ||
direct_type_kind == E_TypeKind_Class ||
direct_type_kind == E_TypeKind_Union)
{
struct_type_key = direct_type_key;
}
}
}
else if(lhs_type_kind == E_TypeKind_Struct ||
lhs_type_kind == E_TypeKind_Class ||
lhs_type_kind == E_TypeKind_Union)
{
struct_type_key = lhs_type_key;
}
}
//- rjf: not struct -> fall back on default
if(e_type_key_match(struct_type_key, e_type_key_zero()))
{
info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(default)(arena, expr, irtree, filter);
}
//- struct -> filter
else
{
E_Type *type = e_type_from_key__cached(irtree->type_key);
E_MemberArray data_members = e_type_data_members_from_key__cached(struct_type_key);
E_MemberList data_members_list__filtered = {0};
if(type->args != 0)
{
B32 default_fits_filter = (str8_match(type->name, str8_lit("only"), 0) ? 0 : 1);
for EachIndex(idx, data_members.count)
{
B32 fits_filter = default_fits_filter;
for EachIndex(arg_idx, type->count)
{
E_Expr *arg = type->args[arg_idx];
if(str8_match(arg->string, data_members.v[idx].name, 0))
{
fits_filter = !default_fits_filter;
break;
}
}
if(fits_filter)
{
e_member_list_push(scratch.arena, &data_members_list__filtered, &data_members.v[idx]);
}
}
}
E_MemberFilterAccel *accel = push_array(arena, E_MemberFilterAccel, 1);
accel->members = e_member_array_from_list(arena, &data_members_list__filtered);
info.user_data = accel;
info.expr_count = accel->members.count;
}
}
scratch_end(scratch);
return info;
}
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(only_and_omit)
{
if(user_data == 0)
{
E_TYPE_EXPAND_RANGE_FUNCTION_NAME(default)(arena, user_data, expr, irtree, filter, idx_range, exprs_out, exprs_strings_out);
}
else
{
Temp scratch = scratch_begin(&arena, 1);
E_MemberFilterAccel *accel = (E_MemberFilterAccel *)user_data;
Rng1U64 legal_idx_range = r1u64(0, accel->members.count);
Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);
U64 read_range_count = dim_1u64(read_range);
for(U64 idx = 0; idx < read_range_count; idx += 1)
{
U64 member_idx = idx + read_range.min;
String8 member_name = accel->members.v[member_idx].name;
exprs_out[idx] = e_expr_irext_member_access(arena, expr, irtree, member_name);
}
scratch_end(scratch);
}
}
////////////////////////////////
//~ rjf: (Built-In Type Hooks) `folder` type
+6
View File
@@ -298,6 +298,12 @@ E_TYPE_IREXT_FUNCTION_DEF(slice);
E_TYPE_ACCESS_FUNCTION_DEF(slice);
E_TYPE_EXPAND_INFO_FUNCTION_DEF(slice);
////////////////////////////////
//~ rjf: (Built-In Type Hooks) `only`, `omit` lenses
E_TYPE_EXPAND_INFO_FUNCTION_DEF(only_and_omit);
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(only_and_omit);
////////////////////////////////
//~ rjf: (Built-In Type Hooks) `folder` type