mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-25 13:05:00 -07:00
only and omit; notes & dead code deletion
This commit is contained in:
+10
-8
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user