fix ghost auto-view-rule text visualization to calculate auto view rule from raw type expression rather than post-view-rule-applied one

This commit is contained in:
Ryan Fleury
2024-09-19 16:07:14 -07:00
parent 454764b9f6
commit bbd86449d8
6 changed files with 62 additions and 7 deletions
+45
View File
@@ -243,6 +243,7 @@ e_select_type_ctx(E_TypeCtx *ctx)
}
arena_pop_to(e_type_state->arena, e_type_state->arena_eval_start_pos);
e_type_state->ctx = ctx;
e_type_state->cons_id_gen = 0;
e_type_state->cons_content_slots_count = 256;
e_type_state->cons_key_slots_count = 256;
e_type_state->cons_content_slots = push_array(e_type_state->arena, E_ConsTypeSlot, e_type_state->cons_content_slots_count);
@@ -489,6 +490,50 @@ e_type_key_match(E_TypeKey l, E_TypeKey r)
//- rjf: key -> info extraction
internal U64
e_hash_from_type_key(E_TypeKey key)
{
U64 hash = 0;
if(!e_type_key_match(e_type_key_zero(), key))
{
Temp scratch = scratch_begin(0, 0);
E_Type *type = e_type_from_key(scratch.arena, key);
String8List strings = {0};
str8_serial_begin(scratch.arena, &strings);
str8_serial_push_struct(scratch.arena, &strings, &type->kind);
str8_serial_push_struct(scratch.arena, &strings, &type->flags);
str8_serial_push_string(scratch.arena, &strings, type->name);
str8_serial_push_struct(scratch.arena, &strings, &type->byte_size);
str8_serial_push_struct(scratch.arena, &strings, &type->count);
str8_serial_push_struct(scratch.arena, &strings, &type->off);
U64 direct_hash = e_hash_from_type_key(type->direct_type_key);
U64 owner_hash = e_hash_from_type_key(type->direct_type_key);
str8_serial_push_struct(scratch.arena, &strings, &direct_hash);
str8_serial_push_struct(scratch.arena, &strings, &owner_hash);
if(type->param_type_keys != 0)
{
for EachIndex(idx, type->count)
{
U64 param_type_hash = e_hash_from_type_key(type->param_type_keys[idx]);
str8_serial_push_struct(scratch.arena, &strings, &param_type_hash);
}
}
else if(type->members != 0)
{
for EachIndex(idx, type->count)
{
U64 member_type_hash = e_hash_from_type_key(type->members[idx].type_key);
str8_serial_push_struct(scratch.arena, &strings, &type->members[idx].off);
str8_serial_push_struct(scratch.arena, &strings, &member_type_hash);
}
}
String8 string = str8_serial_end(scratch.arena, &strings);
hash = e_hash_from_string(5381, string);
scratch_end(scratch);
}
return hash;
}
internal E_TypeKind
e_type_kind_from_key(E_TypeKey key)
{
+1
View File
@@ -249,6 +249,7 @@ internal E_TypeKey e_type_key_cons_base(Type *type, String8 name);
internal B32 e_type_key_match(E_TypeKey l, E_TypeKey r);
//- rjf: key -> info extraction
internal U64 e_hash_from_type_key(E_TypeKey key);
internal E_TypeKind e_type_kind_from_key(E_TypeKey key);
internal U64 e_type_byte_size_from_key(E_TypeKey key);
internal E_Type *e_type_from_key(Arena *arena, E_TypeKey key);
@@ -363,7 +363,7 @@ ev_auto_view_rule_table_push_new(Arena *arena, EV_AutoViewRuleTable *table, E_Ty
table->slots_count = 4096;
table->slots = push_array(arena, EV_AutoViewRuleSlot, table->slots_count);
}
U64 hash = e_hash_from_string(5381, str8_struct(&type_key));
U64 hash = e_hash_from_type_key(type_key);
U64 slot_idx = hash%table->slots_count;
EV_AutoViewRuleSlot *slot = &table->slots[slot_idx];
EV_AutoViewRuleNode *node = 0;
@@ -396,7 +396,7 @@ ev_auto_view_rule_from_type_key(E_TypeKey type_key)
String8 string = {0};
if(ev_auto_view_rule_table != 0 && ev_auto_view_rule_table->slots_count != 0)
{
U64 hash = e_hash_from_string(5381, str8_struct(&type_key));
U64 hash = e_hash_from_type_key(type_key);
U64 slot_idx = hash%ev_auto_view_rule_table->slots_count;
EV_AutoViewRuleSlot *slot = &ev_auto_view_rule_table->slots[slot_idx];
EV_AutoViewRuleNode *node = 0;
@@ -501,6 +501,7 @@ ev_block_begin(Arena *arena, EV_BlockKind kind, EV_Key parent_key, EV_Key key, S
n->v.key = key;
n->v.depth = depth;
n->v.expr = &e_expr_nil;
n->v.expr_raw = &e_expr_nil;
n->v.view_rules = &ev_nil_view_rule_list;
return &n->v;
}
@@ -514,6 +515,7 @@ ev_block_split_and_continue(Arena *arena, EV_BlockList *list, EV_Block *split_bl
EV_Block *continue_block = ev_block_begin(arena, split_block->kind, split_block->parent_key, split_block->key, split_block->depth);
continue_block->string = split_block->string;
continue_block->expr = split_block->expr;
continue_block->expr_raw = split_block->expr_raw;
continue_block->visual_idx_range = continue_block->semantic_idx_range = r1u64(split_idx+1, total_count);
continue_block->view_rules = split_block->view_rules;
continue_block->members = split_block->members;
@@ -540,6 +542,7 @@ ev_append_expr_blocks__rec(Arena *arena, EV_View *view, EV_Key parent_key, EV_Ke
Temp scratch = scratch_begin(&arena, 1);
//- rjf: apply expr resolution view rules
E_Expr *expr_raw = expr;
expr = ev_expr_from_expr_view_rules(arena, expr, view_rules);
//- rjf: determine if this key is expanded
@@ -551,6 +554,7 @@ ev_append_expr_blocks__rec(Arena *arena, EV_View *view, EV_Key parent_key, EV_Ke
EV_Block *block = ev_block_begin(arena, EV_BlockKind_Root, parent_key, key, depth);
block->string = string;
block->expr = expr;
block->expr_raw = expr_raw;
block->view_rules = view_rules;
block->visual_idx_range = r1u64(key.child_num-1, key.child_num+0);
block->semantic_idx_range = r1u64(key.child_num-1, key.child_num+0);
@@ -912,6 +916,7 @@ ev_row_list_push_new(Arena *arena, EV_View *view, EV_WindowedRowList *rows, EV_B
// rjf: pick view rule list; resolve expression if needed
EV_ViewRuleList *view_rules = 0;
E_Expr *expr_resolved = expr;
switch(block->kind)
{
default:
@@ -929,7 +934,7 @@ ev_row_list_push_new(Arena *arena, EV_View *view, EV_WindowedRowList *rows, EV_B
{
ev_view_rule_list_push_string(arena, view_rules, row_view_rules);
}
expr = ev_expr_from_expr_view_rules(arena, expr, view_rules);
expr_resolved = ev_expr_from_expr_view_rules(arena, expr, view_rules);
}break;
case EV_BlockKind_Root:
case EV_BlockKind_Canvas:
@@ -945,7 +950,8 @@ ev_row_list_push_new(Arena *arena, EV_View *view, EV_WindowedRowList *rows, EV_B
row->key = key;
row->size_in_rows = 1;
row->string = block->string;
row->expr = expr;
row->expr = expr_resolved;
row->expr_raw = expr;
if(row->expr->kind == E_ExprKind_MemberAccess)
{
Temp scratch = scratch_begin(&arena, 1);
@@ -1038,7 +1044,7 @@ ev_windowed_row_list_from_block_list(Arena *arena, EV_View *view, Rng1S64 visibl
case EV_BlockKind_Null:
case EV_BlockKind_Root:
{
ev_row_list_push_new(arena, view, &list, block, block->key, block->expr);
ev_row_list_push_new(arena, view, &list, block, block->key, block->expr_raw);
}break;
//////////////////////////////
@@ -126,6 +126,7 @@ struct EV_Block
// rjf: evaluation info
String8 string;
E_Expr *expr;
E_Expr *expr_raw;
// rjf: info about ranges that this block spans
Rng1U64 visual_idx_range;
@@ -284,6 +285,7 @@ struct EV_Row
String8 string;
E_Member *member;
E_Expr *expr;
E_Expr *expr_raw;
// rjf: view rule attachments
EV_ViewRuleList *view_rules;
+1 -1
View File
@@ -10399,7 +10399,7 @@ rd_frame(void)
//
EV_AutoViewRuleTable *auto_view_rule_table = push_array(scratch.arena, EV_AutoViewRuleTable, 1);
{
// TODO(rjf)
ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, e_type_key_cons_base(type(CTRL_MetaEvalFrameArray), str8_zero()), str8_lit("slice"));
}
ev_select_auto_view_rule_table(auto_view_rule_table);
+2 -1
View File
@@ -2511,7 +2511,8 @@ rd_watch_view_build(RD_WatchViewState *ewv, B32 modifiable, U32 default_radix, R
cell_autocomp_flags = RD_AutoCompListerFlag_ViewRules;
if(cell_pre_edit_string.size == 0)
{
cell_ghost_text = ev_auto_view_rule_from_type_key(row_eval.type_key);
E_IRTreeAndType raw_irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr_raw);
cell_ghost_text = ev_auto_view_rule_from_type_key(raw_irtree.type_key);
}
}break;
case RD_WatchViewColumnKind_FrameSelection: