record which irtree-and-type generations were produced via auto-hooks; skip those when doing typeofs

This commit is contained in:
Ryan Fleury
2025-05-13 14:19:30 -07:00
parent 89e93459d7
commit e10f0489da
3 changed files with 25 additions and 1 deletions
+1
View File
@@ -318,6 +318,7 @@ struct E_IRTreeAndType
E_TypeKey type_key;
void *user_data;
E_Mode mode;
B32 auto_hook;
E_MsgList msgs;
E_IRTreeAndType *prev;
};
+23 -1
View File
@@ -903,9 +903,20 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, 1, 1, r_expr);
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
// rjf: find the first non-autohook result
E_TypeKey type_key = r_tree.type_key;
for(E_IRTreeAndType *t = &r_tree; t != 0; t = t->prev)
{
type_key = t->type_key;
if(t->auto_hook == 0)
{
break;
}
}
// rjf: fill output
result.root = e_irtree_const_u(arena, 0);
result.type_key = r_tree.type_key;
result.type_key = type_key;
result.mode = E_Mode_Null;
}break;
@@ -1573,6 +1584,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
case E_ExprKind_LeafIdentifier:
{
Temp scratch = scratch_begin(&arena, 1);
B32 is_auto_hook = 0;
String8 qualifier = expr->qualifier;
String8 string = expr->string;
String8 string__redirected = string;
@@ -1617,6 +1629,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);
mapped_bytecode_mode = parent_irtree->mode;
mapped_type_key = parent_irtree->type_key;
is_auto_hook = parent_irtree->auto_hook;
disallow_autohooks = 1;
E_MsgList msgs = e_msg_list_copy(arena, &parent_irtree->msgs);
e_msg_list_concat_in_place(&result.msgs, &msgs);
@@ -2054,6 +2067,9 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
result = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, access);
}
//- rjf: mark if auto hook
result.auto_hook = is_auto_hook;
//- rjf: error on failure-to-generate
if(!generated && !str8_match(string, str8_lit("$"), 0))
{
@@ -2340,6 +2356,12 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_I
result.prev[0] = *parent;
}
//- rjf: mark this result as an auto-hook, if we have an override
if(t->overridden)
{
result.auto_hook = 1;
}
//- rjf: find any auto hooks according to this generation's type
if(!disallow_autohooks && result.mode != E_Mode_Null)
{
+1
View File
@@ -2428,6 +2428,7 @@ rd_view_from_eval(RD_Cfg *parent, E_Eval eval)
rd_cfg_child_from_string_or_alloc(view, str8_lit("selected"));
{
// rjf: get expression evaluation
// TODO(rjf): we need to account for UFCS style expressions here...
E_Eval expr_eval = eval;
if(eval.expr->kind == E_ExprKind_Call && type_is_visualizer)
{