begin color editing, fix some bugs with meta-type-info disrupting type chain scans

This commit is contained in:
Ryan Fleury
2025-04-26 17:30:34 -07:00
parent 6a7420b7aa
commit 282f6022e1
13 changed files with 211 additions and 30 deletions
+2
View File
@@ -183,6 +183,8 @@ e_token_kind_strings:
`LastSigned2 = E_TypeKind_S512`,
`FirstIncomplete = E_TypeKind_IncompleteStruct`,
`LastIncomplete = E_TypeKind_IncompleteEnum`,
`FirstMeta = E_TypeKind_MetaExpr`,
`LastMeta = E_TypeKind_MetaDescription`,
}
@data(String8) e_type_kind_basic_string_table:
+5 -3
View File
@@ -1382,14 +1382,14 @@ e_expand_rule_from_type_key(E_TypeKey key)
{
E_TypeExpandRule *rule = &e_type_expand_rule__default;
{
E_Type *type = e_type_from_key__cached(key);
E_Type *type = e_type_from_key__cached(e_type_key_unwrap(key, E_TypeUnwrapFlag_Meta));
if(type->expand.info != 0)
{
rule = &type->expand;
}
for(E_Type *lens_type = type;
lens_type->kind == E_TypeKind_Lens || lens_type->kind == E_TypeKind_Set;
lens_type = e_type_from_key__cached(lens_type->direct_type_key))
lens_type = e_type_from_key__cached(e_type_key_unwrap(lens_type->direct_type_key, E_TypeUnwrapFlag_Meta)))
{
if(lens_type->expand.info != 0)
{
@@ -1746,6 +1746,8 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
}break;
case E_TypeKind_MetaExpr:
case E_TypeKind_MetaDisplayName:
case E_TypeKind_MetaDescription:
{
E_TypeKey direct = e_type_key_direct(key);
e_type_lhs_string_from_key(arena, direct, out, prec, skip_return);
@@ -1905,7 +1907,7 @@ e_default_expansion_type_from_key(E_TypeKey root_key)
//- rjf: if we have meta-expression tags in the type chain, defer
// to the next type in the chain.
else if(kind == E_TypeKind_MetaExpr)
else if(E_TypeKind_FirstMeta <= kind && kind <= E_TypeKind_LastMeta)
{
done = 0;
}
+2
View File
@@ -91,6 +91,8 @@ E_TypeKind_FirstSigned2 = E_TypeKind_S8,
E_TypeKind_LastSigned2 = E_TypeKind_S512,
E_TypeKind_FirstIncomplete = E_TypeKind_IncompleteStruct,
E_TypeKind_LastIncomplete = E_TypeKind_IncompleteEnum,
E_TypeKind_FirstMeta = E_TypeKind_MetaExpr,
E_TypeKind_LastMeta = E_TypeKind_MetaDescription,
} E_TypeKind;
typedef U32 E_ExprKind;
@@ -417,9 +417,9 @@ ev_expand_rule_from_type_key(E_TypeKey type_key)
{
EV_ExpandRule *rule = &ev_nil_expand_rule;
{
E_TypeKey k = type_key;
E_TypeKey k = e_type_key_unwrap(type_key, E_TypeUnwrapFlag_Meta);
E_TypeKind kind = e_type_kind_from_key(k);
for(;kind == E_TypeKind_Lens; k = e_type_key_direct(k), kind = e_type_kind_from_key(k))
for(;kind == E_TypeKind_Lens; k = e_type_key_direct(e_type_key_unwrap(k, E_TypeUnwrapFlag_Meta)), kind = e_type_kind_from_key(k))
{
E_Type *type = e_type_from_key__cached(k);
EV_ExpandRule *candidate = ev_expand_rule_from_string(type->name);
@@ -536,10 +536,10 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval
tree.total_item_count += 1;
//- rjf: generate initial task, for root's evaluation
typedef struct Task Task;
struct Task
typedef struct BlockTreeBuildTask BlockTreeBuildTask;
struct BlockTreeBuildTask
{
Task *next;
BlockTreeBuildTask *next;
EV_Block *parent_block;
E_Eval eval;
E_Expr *next_expr;
@@ -548,12 +548,12 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval
B32 default_expanded;
B32 force_expanded;
};
Task start_task = {0, tree.root, tree.root->eval, tree.root->eval.expr->next, 1, 0};
Task *first_task = &start_task;
Task *last_task = first_task;
BlockTreeBuildTask start_task = {0, tree.root, tree.root->eval, tree.root->eval.expr->next, 1, 0};
BlockTreeBuildTask *first_task = &start_task;
BlockTreeBuildTask *last_task = first_task;
//- rjf: iterate all expansions & generate blocks for each
for(Task *t = first_task; t != 0; t = t->next)
for(BlockTreeBuildTask *t = first_task; t != 0; t = t->next)
{
// rjf: get task key
EV_Key key = ev_key_make(ev_hash_from_key(t->parent_block->key), t->child_id);
@@ -704,7 +704,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval
E_Eval child_eval = {0};
type_expand_rule->range(arena, type_expand_info.user_data, t->eval, filter, r1u64(split_relative_idx, split_relative_idx+1), &child_eval);
EV_Key child_key = child_keys[idx];
Task *task = push_array(scratch.arena, Task, 1);
BlockTreeBuildTask *task = push_array(scratch.arena, BlockTreeBuildTask, 1);
SLLQueuePush(first_task, last_task, task);
task->parent_block = expansion_block;
task->eval = child_eval;
@@ -718,7 +718,7 @@ ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval eval
// rjf: if this expr has a sibling, push another task to continue the chain
if(t->next_expr != &e_expr_nil)
{
Task *task = push_array(scratch.arena, Task, 1);
BlockTreeBuildTask *task = push_array(scratch.arena, BlockTreeBuildTask, 1);
task->next = t->next;
t->next = task;
task->parent_block = t->parent_block;
@@ -1744,6 +1744,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
//
case E_TypeKind_Modifier:
case E_TypeKind_MetaDescription:
case E_TypeKind_MetaDisplayName:
{
need_pop = 1;
need_new_task = 1;
File diff suppressed because one or more lines are too long
+4 -2
View File
@@ -229,6 +229,8 @@ RD_CmdKind_DisableBreakpoint,
RD_CmdKind_AddWatchPin,
RD_CmdKind_ToggleWatchPin,
RD_CmdKind_AddAutoViewRule,
RD_CmdKind_AddColor,
RD_CmdKind_ImportColors,
RD_CmdKind_SetNextStatement,
RD_CmdKind_AddTarget,
RD_CmdKind_SelectTarget,
@@ -668,8 +670,8 @@ Z(getting_started)\
C_LINKAGE_BEGIN
extern String8 rd_tab_fast_path_view_name_table[20];
extern String8 rd_tab_fast_path_query_name_table[20];
extern RD_VocabInfo rd_vocab_info_table[316];
extern RD_NameSchemaInfo rd_name_schema_info_table[21];
extern RD_VocabInfo rd_vocab_info_table[319];
extern RD_NameSchemaInfo rd_name_schema_info_table[22];
extern Rng1U64 rd_reg_slot_range_table[42];
extern String8 rd_binding_version_remap_old_name_table[8];
extern String8 rd_binding_version_remap_new_name_table[8];
+35 -2
View File
@@ -90,6 +90,7 @@ RD_VocabTable:
{source_location _ "Source Location" _ Null }
{address_location _ "Address Location" _ Null }
{target _ "Target" _ Target }
{color _ "Color" _ Palette }
{executable _ "Executable" _ Module }
{arguments arguments "Arguments" "Arguments" Null }
{exe exes "Executable" _ Module }
@@ -227,6 +228,14 @@ RD_VocabTable:
'main_font': string,
'code_font': string,
//- rjf: colors
@display_name('Color Preset')
'color_preset': string,
@display_name('Color File')
'color_file': path,
@display_name('Colors')
'colors': query,
//- rjf: thread & breakpoint decorations
@default(1) @display_name('Thread Lines') @description("Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.")
'thread_lines': bool,
@@ -346,6 +355,18 @@ RD_VocabTable:
```
}
//- rjf: colors
{
color,
```
@collection_commands(add_color, import_colors) x:
{
@display_name('Tags') tags: string,
color: @color @hex u32,
}
```
}
//- rjf: windows
{
window,
@@ -896,6 +917,10 @@ RD_CmdTable: // | | | |
//- rjf: auto view rule
{AddAutoViewRule 1 1 0 0 "" String null Nil Null 0 0 0 0 0 0 0 Binoculars "add_auto_view_rule" "Add Auto View Rule" "Adds a new auto view rule." "" "$auto_view_rules," }
//- rjf: colors
{AddColor 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "add_color" "Add Color" "Adds a new color." "" "" }
{ImportColors 1 1 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Palette "import_colors" "Import Colors" "Imports all colors from a loaded color theme file or color theme preset." "" "" }
//- rjf: line operations
{SetNextStatement 1 1 1 0 "" Null null Nil Null 0 0 0 0 0 0 0 RightArrow "set_next_statement" "Set Next Statement" "Sets the selected thread's instruction pointer to the cursor's position." "" "$text_pt," }
@@ -1405,7 +1430,15 @@ RD_ThemePresetTable:
}
{ DefaultLight default_light "Default (Light)" }
{ VSDark vs_dark "VS (Dark)" }
{
VSDark vs_dark "VS (Dark)",
```theme:
{
background: 0x1b0000ff,
}
```
}
{ VSLight vs_light "VS (Light)" }
{ SolarizedDark solarized_dark "Solarized (Dark)" }
{ SolarizedLight solarized_light "Solarized (Light)" }
@@ -1414,7 +1447,7 @@ RD_ThemePresetTable:
{ FarManager far_manager "Far Manager" }
}
@table(name display_name name_lower default_dark default_light vs_dark vs_light solarized_dark solarized_light handmade_hero four_coder far_manager desc)
@table(name display_name name_lower default_dark default_light vs_dark vs_light solarized_dark solarized_light handmade_hero four_coder far_manager desc)
RD_ThemeColorTable:
{
{Null "Null" null 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff ""}
+51 -2
View File
@@ -1780,6 +1780,17 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range)
U64 value = e_value_from_string(value_string_casted).u64;
read_data = push_str8_copy(scratch.arena, str8_struct(&value));
}
else if(str8_match(child_type_name, str8_lit("u32"), 0))
{
String8 value_string = cfg->first->string;
if(value_string.size == 0)
{
value_string = md_tag_from_string(child_schema, str8_lit("default"), 0)->first->string;
}
String8 value_string_casted = push_str8f(scratch.arena, "(uint32)(%S)", value_string);
U64 value = e_value_from_string(value_string_casted).u64;
read_data = push_str8_copy(scratch.arena, str8_struct(&value));
}
else if(str8_match(child_type_name, str8_lit("f32"), 0))
{
String8 value_string = cfg->first->string;
@@ -4741,6 +4752,10 @@ rd_view_ui(Rng2F32 rect)
{
CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(row->eval.space);
RD_Cfg *cfg = rd_cfg_from_eval_space(row->eval.space);
if(cfg == &rd_nil_cfg)
{
cfg = rd_cfg_from_eval_space(row->block->eval.space);
}
RD_RegsScope(.cfg = cfg->id, .ctrl_entity = entity->handle)
{
if(cfg != &rd_nil_cfg || entity != &ctrl_entity_nil)
@@ -5483,7 +5498,7 @@ rd_window_frame(void)
// that windows can have their own colors, and have those override higher-up settings.
RD_Cfg *preset_cfg = &rd_nil_cfg;
RD_CfgList colors_cfgs = {0};
RD_Cfg *scan_parents[] = {window, rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("project")), rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("user"))};
RD_Cfg *scan_parents[] = {window, rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("project")), rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("theme")), rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("user"))};
for EachElement(idx, scan_parents)
{
for(RD_Cfg *parent_cfg = scan_parents[idx]; parent_cfg != &rd_nil_cfg; parent_cfg = parent_cfg->parent)
@@ -10864,6 +10879,7 @@ rd_init(CmdLine *cmdln)
cmd_line_has_flag(cmdln, str8_lit("q")));
rd_state->user_path_arena = arena_alloc();
rd_state->project_path_arena = arena_alloc();
rd_state->theme_path_arena = arena_alloc();
rd_state->user_cfg_string_key = hs_hash_from_data(str8_lit("raddbg_user_data_string_key"));
rd_state->project_cfg_string_key = hs_hash_from_data(str8_lit("raddbg_project_data_string_key"));
rd_state->cmdln_cfg_string_key = hs_hash_from_data(str8_lit("raddbg_cmdln_data_string_key"));
@@ -12304,6 +12320,19 @@ rd_frame(void)
{
.info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(call_stack),
}));
e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, str8_lit("colors"),
e_type_key_cons(.kind = E_TypeKind_Set,
.flags = E_TypeFlag_EditableChildren,
.name = str8_lit("colors"),
.irext = E_TYPE_IREXT_FUNCTION_NAME(cfgs_slice),
.access = E_TYPE_ACCESS_FUNCTION_NAME(cfgs_slice),
.expand =
{
.info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(cfgs_query),
.range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(cfgs_slice),
.id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs_slice),
.num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(cfgs_slice),
}));
}
//- rjf: add macro for collections with specific lookup rules (but no unique id rules)
@@ -12846,7 +12875,9 @@ rd_frame(void)
case RD_CmdKind_OpenUser:
case RD_CmdKind_OpenProject:
{
String8 file_root_key = (kind == RD_CmdKind_OpenUser ? str8_lit("user") : str8_lit("project"));
String8 file_root_key = (kind == RD_CmdKind_OpenUser ? str8_lit("user") :
kind == RD_CmdKind_OpenProject ? str8_lit("project") :
str8_lit("other"));
RD_Cfg *file_root = rd_cfg_child_from_string(rd_state->root_cfg, file_root_key);
//- rjf: load the new file's data
@@ -15164,6 +15195,24 @@ rd_frame(void)
rd_cfg_new(project, str8_lit("auto_view_rule"));
}break;
//- rjf: colors
case RD_CmdKind_AddColor:
{
RD_Cfg *parent = rd_cfg_from_id(rd_regs()->cfg);
rd_cfg_new(parent, str8_lit("color"));
}break;
case RD_CmdKind_ImportColors:
{
RD_Cfg *parent = rd_cfg_from_id(rd_regs()->cfg);
RD_CfgList colors = rd_cfg_child_list_from_string(scratch.arena, parent, str8_lit("color"));
for(RD_CfgNode *n = colors.first; n != 0; n = n->next)
{
rd_cfg_release(n->v);
}
// String8 color_preset = rd_setting_from_name(str8_lit("color_preset"));
// String8 color_file = rd_setting_from_name(str8_lit("color_file"));
}break;
//- rjf: watches
case RD_CmdKind_ToggleWatchExpression:
if(rd_regs()->string.size != 0)
+2
View File
@@ -608,6 +608,8 @@ struct RD_State
String8 user_path;
Arena *project_path_arena;
String8 project_path;
Arena *theme_path_arena;
String8 theme_path;
// rjf: serialized config debug string keys
U128 user_cfg_string_key;
+61
View File
@@ -269,6 +269,11 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema)
child_type_key = e_type_key_basic(E_TypeKind_U64);
wrap_child_w_meta_expr = 1;
}
else if(str8_match(child_schema->first->string, str8_lit("u32"), 0))
{
child_type_key = e_type_key_basic(E_TypeKind_U32);
wrap_child_w_meta_expr = 1;
}
else if(str8_match(child_schema->first->string, str8_lit("f32"), 0))
{
child_type_key = e_type_key_basic(E_TypeKind_F32);
@@ -341,6 +346,28 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema)
}
}
//- rjf: extend child type with hex lens
{
MD_Node *hex = md_tag_from_string(child_schema->first, str8_lit("hex"), 0);
if(!md_node_is_nil(hex))
{
child_type_key = e_type_key_cons(.kind = E_TypeKind_Lens,
.name = str8_lit("hex"),
.direct_key = child_type_key);
}
}
//- rjf: extend child type with color lens
{
MD_Node *color = md_tag_from_string(child_schema->first, str8_lit("color"), 0);
if(!md_node_is_nil(color))
{
child_type_key = e_type_key_cons(.kind = E_TypeKind_Lens,
.name = str8_lit("color"),
.direct_key = child_type_key);
}
}
//- rjf: extend child type with ranges
{
MD_Node *range = md_tag_from_string(child_schema->first, str8_lit("range"), 0);
@@ -668,6 +695,40 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs_slice)
return info;
}
E_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs_query)
{
RD_CfgsExpandAccel *accel = push_array(arena, RD_CfgsExpandAccel, 1);
{
Temp scratch = scratch_begin(&arena, 1);
RD_Cfg *root_cfg = rd_cfg_from_eval_space(eval.space);
String8 child_key = e_string_from_id(eval.space.u64s[1]);
String8 child_key_singular = rd_singular_from_code_name_plural(child_key);
if(child_key_singular.size != 0)
{
child_key = child_key_singular;
}
String8List cmds = {0};
MD_NodePtrList schemas = rd_schemas_from_name(child_key);
for(MD_NodePtrNode *n = schemas.first; n != 0; n = n->next)
{
MD_Node *schema = n->v;
MD_Node *collection_cmds_root = md_tag_from_string(schema, str8_lit("collection_commands"), 0);
for MD_EachNode(cmd, collection_cmds_root->first)
{
str8_list_push(scratch.arena, &cmds, cmd->string);
}
}
RD_CfgList children = rd_cfg_child_list_from_string(scratch.arena, root_cfg, child_key);
accel->cmds = str8_array_from_list(arena, &cmds);
accel->cmds_idx_range = r1u64(0, accel->cmds.count);
accel->cfgs = rd_cfg_array_from_list(arena, &children);
accel->cfgs_idx_range = r1u64(accel->cmds.count + 0, accel->cmds.count + accel->cfgs.count);
scratch_end(scratch);
}
E_TypeExpandInfo info = {accel, accel->cfgs.count + accel->cmds.count};
return info;
}
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(cfgs_slice)
{
RD_CfgsExpandAccel *accel = (RD_CfgsExpandAccel *)user_data;
+1
View File
@@ -40,6 +40,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(cfgs);
//~ rjf: Config Slice Type Hooks
E_TYPE_IREXT_FUNCTION_DEF(cfgs_slice);
E_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs_query);
E_TYPE_ACCESS_FUNCTION_DEF(cfgs_slice);
E_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs_slice);
E_TYPE_EXPAND_RANGE_FUNCTION_DEF(cfgs_slice);
+8 -5
View File
@@ -945,7 +945,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
EV_Key key = row->key;
EV_Block *block = row->block;
E_Eval block_eval = row->block->eval;
E_TypeKey block_type_key = block_eval.irtree.type_key;
E_TypeKey block_type_key = e_type_key_unwrap(block_eval.irtree.type_key, E_TypeUnwrapFlag_Meta);
E_TypeKind block_type_kind = e_type_kind_from_key(block_type_key);
E_Type *block_type = e_type_from_key__cached(block_type_key);
RD_Cfg *evalled_cfg = rd_cfg_from_eval_space(row->eval.space);
@@ -1277,7 +1277,9 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
////////////////////////////
//- rjf: @watch_row_build_cells queries
//
else if(row->eval.space.kind == RD_EvalSpaceKind_MetaQuery)
else if(row->eval.space.kind == RD_EvalSpaceKind_MetaQuery ||
(row->eval.space.kind == RD_EvalSpaceKind_MetaCfg &&
e_type_kind_from_key(e_type_key_unwrap(row->eval.irtree.type_key, E_TypeUnwrapFlag_Meta)) == E_TypeKind_Set))
{
rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval, .flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_NoEval|RD_WatchCellFlag_Indented, .pct = 1.f);
}
@@ -1339,8 +1341,9 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row)
row->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ||
row->eval.space.kind == E_SpaceKind_File)
{
if(e_type_kind_from_key(row->eval.irtree.type_key) == E_TypeKind_Array &&
e_type_kind_from_key(e_type_key_direct(row->eval.irtree.type_key)) == E_TypeKind_U8)
E_TypeKey substantive_row_eval_type = e_type_key_unwrap(row->eval.irtree.type_key, E_TypeUnwrapFlag_Meta);
if(e_type_kind_from_key(substantive_row_eval_type) == E_TypeKind_Array &&
e_type_kind_from_key(e_type_key_direct(substantive_row_eval_type)) == E_TypeKind_U8)
{
info.can_expand = 0;
}
@@ -1742,7 +1745,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
// rjf: determine if code
B32 is_code = 1;
{
E_Type *type = e_type_from_key__cached(cell->eval.irtree.type_key);
E_Type *type = e_type_from_key__cached(e_type_key_unwrap(cell->eval.irtree.type_key, E_TypeUnwrapFlag_Meta));
if(type->flags & (E_TypeFlag_IsPlainText|E_TypeFlag_IsPathText))
{
is_code = 0;
+17
View File
@@ -393,6 +393,23 @@ rd_title_fstrs_from_cfg(Arena *arena, RD_Cfg *cfg)
dr_fstrs_push_new(arena, &result, &params, dst_string, .color = dst_color);
}
//- rjf: special case: colors
if(str8_match(cfg->string, str8_lit("color"), 0))
{
String8 tags = rd_cfg_child_from_string(cfg, str8_lit("tags"))->first->string;
String8 color_string = rd_cfg_child_from_string(cfg, str8_lit("color"))->first->string;
U32 color_u32 = e_value_from_stringf("(uint32)(%S)", color_string).u32;
Vec4F32 color = rgba_from_u32(color_u32);
if(tags.size != 0)
{
dr_fstrs_push_new(arena, &result, &params, tags, .color = color);
}
else
{
dr_fstrs_push_new(arena, &result, &params, str8_lit("Color"), .color = rgba_secondary);
}
}
#undef start_secondary
scratch_end(scratch);
}