work on new eval-viz layer stringification which factors out measurement/limiting/etc., but just walks an eval tree and stringifies each part; start working on new types <-> lookup-rule stuff

This commit is contained in:
Ryan Fleury
2025-04-07 16:11:27 -07:00
parent b1f17b217c
commit 9bfa4f87e3
15 changed files with 278 additions and 72 deletions
+15 -16
View File
@@ -44,8 +44,7 @@ typed_data_rebase_ptrs(Type *type, String8 data, void *base_ptr)
switch(t->type->kind)
{
default:{}break;
case TypeKind_Ptr:
if(!(t->type->flags & TypeFlag_IsExternal))
case TypeKind_Ptr:
{
*(U64 *)t->ptr = ((U64)(*(U8 **)t->ptr - (U8 *)base_ptr));
}break;
@@ -173,13 +172,13 @@ serialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerialize
task->containing_type = t->containing_type;
task->containing_ptr = t->containing_ptr;
SLLQueuePush(first_task, last_task, task);
}
// rjf: catch-all: write pointer value
else
{
str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count));
}
}
// rjf: catch-all: write pointer value
else
{
str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count));
}
}break;
//- rjf: arrays -> descend to underlying type, + count
@@ -345,14 +344,14 @@ deserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSeriali
task->containing_type = t->containing_type;
task->containing_ptr = t->containing_ptr;
SLLQueuePush(first_task, last_task, task);
}
// rjf: catch-all: read pointer value
else
{
}
// rjf: catch-all: read pointer value
else
{
MemoryCopy(t->dst, t_src, t->type->size*t->count);
read_off += t->type->size*t->count;
}
read_off += t->type->size*t->count;
}
}break;
//- rjf: arrays -> descend to underlying type, + count
+3 -4
View File
@@ -100,10 +100,9 @@ TypeKind;
typedef U32 TypeFlags;
enum
{
TypeFlag_IsExternal = (1<<0),
TypeFlag_IsPlainText = (1<<1),
TypeFlag_IsCodeText = (1<<2),
TypeFlag_IsPathText = (1<<3),
TypeFlag_IsPlainText = (1<<0),
TypeFlag_IsCodeText = (1<<1),
TypeFlag_IsPathText = (1<<2),
};
typedef U32 MemberFlags;
+1
View File
@@ -73,6 +73,7 @@ E_TypeKindTable:
{Variadic "variadic" 0 }
{Set "set" 0 }
{Lens "lens" 0 }
{LensSpec "lens_spec" 0 }
}
@table(name op_kind precedence op_pre op_sep op_pos)
+4 -5
View File
@@ -274,11 +274,10 @@ enum
{
E_TypeFlag_Const = (1<<0),
E_TypeFlag_Volatile = (1<<1),
E_TypeFlag_External = (1<<2),
E_TypeFlag_IsPlainText = (1<<3),
E_TypeFlag_IsCodeText = (1<<4),
E_TypeFlag_IsPathText = (1<<5),
E_TypeFlag_EditableChildren = (1<<6),
E_TypeFlag_IsPlainText = (1<<2),
E_TypeFlag_IsCodeText = (1<<3),
E_TypeFlag_IsPathText = (1<<4),
E_TypeFlag_EditableChildren = (1<<5),
};
typedef struct E_Member E_Member;
+13 -2
View File
@@ -98,7 +98,7 @@ e_select_ir_ctx(E_IRCtx *ctx)
for EachElement(idx, builtin_view_rule_names)
{
E_Expr *expr = e_push_expr(e_ir_state->arena, E_ExprKind_LeafOffset, 0);
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Lens, .name = builtin_view_rule_names[idx]);
expr->type_key = e_type_key_cons(.kind = E_TypeKind_LensSpec, .name = builtin_view_rule_names[idx]);
e_string2expr_map_insert(e_ir_state->arena, ctx->macro_map, builtin_view_rule_names[idx], expr);
}
}
@@ -2421,7 +2421,7 @@ E_IRGEN_FUNCTION_DEF(default)
// rjf: calling a lens? -> generate IR for the first argument; wrap the type in
// a lens type, which preserves the name & arguments of the lens call expression
if(lhs_type->kind == E_TypeKind_Lens)
if(lhs_type->kind == E_TypeKind_LensSpec)
{
Temp scratch = scratch_begin(&arena, 1);
@@ -3347,6 +3347,17 @@ e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree, E_Type
////////////////////////////////
//~ rjf: Expression & IR-Tree => Rules
internal E_LookupRule *
e_lookup_rule_from_type_key(E_TypeKey type_key)
{
E_LookupRule *rule = &e_lookup_rule__default;
// rjf: unpack type
E_Type *type = e_type_from_key__cached(type_key);
return rule;
}
internal E_LookupRuleExprPair
e_lookup_rule_expr_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree)
{
+1
View File
@@ -288,6 +288,7 @@ internal E_Expr *e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *r
////////////////////////////////
//~ rjf: Expression & IR-Tree => Rules
internal E_LookupRule *e_lookup_rule_from_type_key(E_TypeKey type_key);
internal E_LookupRuleExprPair e_lookup_rule_expr_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree);
#if 0 // TODO(rjf): @eval
-1
View File
@@ -483,7 +483,6 @@ e_type_key_cons_base(Type *type)
{
E_TypeKey direct_type = e_type_key_cons_base(type->direct);
E_TypeFlags flags = 0;
if(type->flags & TypeFlag_IsExternal) { flags |= E_TypeFlag_External; }
if(type->flags & TypeFlag_IsPlainText){ flags |= E_TypeFlag_IsPlainText; }
if(type->flags & TypeFlag_IsCodeText) { flags |= E_TypeFlag_IsCodeText; }
if(type->flags & TypeFlag_IsPathText) { flags |= E_TypeFlag_IsPathText; }
+4 -2
View File
@@ -14,7 +14,7 @@ str8_lit_comp("CharLiteral"),
str8_lit_comp("Symbol"),
};
String8 e_type_kind_basic_string_table[57] =
String8 e_type_kind_basic_string_table[58] =
{
str8_lit_comp(""),
str8_lit_comp("void"),
@@ -73,9 +73,10 @@ str8_lit_comp("bitfield"),
str8_lit_comp("variadic"),
str8_lit_comp("set"),
str8_lit_comp("lens"),
str8_lit_comp("lens_spec"),
};
U8 e_type_kind_basic_byte_size_table[57] =
U8 e_type_kind_basic_byte_size_table[58] =
{
0,
0,
@@ -134,6 +135,7 @@ U8 e_type_kind_basic_byte_size_table[57] =
0,
0,
0,
0,
};
String8 e_expr_kind_strings[48] =
+3 -2
View File
@@ -76,6 +76,7 @@ E_TypeKind_Bitfield,
E_TypeKind_Variadic,
E_TypeKind_Set,
E_TypeKind_Lens,
E_TypeKind_LensSpec,
E_TypeKind_COUNT,
E_TypeKind_FirstBasic = E_TypeKind_Void,
E_TypeKind_LastBasic = E_TypeKind_ComplexF128,
@@ -161,8 +162,8 @@ E_InterpretationCode_COUNT,
C_LINKAGE_BEGIN
extern String8 e_token_kind_strings[6];
extern String8 e_type_kind_basic_string_table[57];
extern U8 e_type_kind_basic_byte_size_table[57];
extern String8 e_type_kind_basic_string_table[58];
extern U8 e_type_kind_basic_byte_size_table[58];
extern String8 e_expr_kind_strings[48];
extern E_OpInfo e_expr_kind_op_info_table[48];
extern String8 e_interpretation_code_display_strings[11];
+171 -18
View File
@@ -1367,14 +1367,14 @@ ev_string_from_hresult_code(U32 code)
}
internal String8
ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, U32 min_digits, E_Eval eval)
ev_string_from_simple_typed_eval(Arena *arena, EV_StringParams *params, E_Eval eval)
{
String8 result = {0};
E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key);
E_TypeKind type_kind = e_type_kind_from_key(type_key);
U64 type_byte_size = e_type_byte_size_from_key(type_key);
U8 digit_group_separator = 0;
if(!(flags & EV_StringFlag_ReadOnlyDisplayRules))
if(!(params->flags & EV_StringFlag_ReadOnlyDisplayRules))
{
digit_group_separator = 0;
}
@@ -1385,19 +1385,19 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
case E_TypeKind_Handle:
{
result = str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator);
result = str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator);
}break;
case E_TypeKind_HResult:
{
if(flags & EV_StringFlag_ReadOnlyDisplayRules)
if(params->flags & EV_StringFlag_ReadOnlyDisplayRules)
{
Temp scratch = scratch_begin(&arena, 1);
U32 hresult_value = (U32)eval.value.u64;
U32 is_error = !!(hresult_value & (1ull<<31));
U32 error_code = (hresult_value);
U32 facility = (hresult_value & 0x7ff0000) >> 16;
String8 value_string = str8_from_s64(scratch.arena, eval.value.u64, radix, min_digits, digit_group_separator);
String8 value_string = str8_from_s64(scratch.arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator);
String8 facility_string = ev_string_from_hresult_facility_code(facility);
String8 error_string = ev_string_from_hresult_code(error_code);
result = push_str8f(arena, "%S%s%s%S%s%s%S%s",
@@ -1413,7 +1413,7 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
}
else
{
result = str8_from_s64(arena, eval.value.u64, radix, min_digits, digit_group_separator);
result = str8_from_s64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator);
}
}break;
@@ -1428,11 +1428,11 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
String8 char_str = ev_string_from_ascii_value(arena, eval.value.s64);
if(char_str.size != 0)
{
if(flags & EV_StringFlag_ReadOnlyDisplayRules)
if(params->flags & EV_StringFlag_ReadOnlyDisplayRules)
{
String8 imm_string = (type_is_unsigned
? str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator)
: str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator));
? str8_from_u64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator)
: str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator));
result = push_str8f(arena, "'%S' (%S)", char_str, imm_string);
}
else
@@ -1443,8 +1443,8 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
else
{
result = (type_is_unsigned
? str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator)
: str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator));
? str8_from_u64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator)
: str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator));
}
}break;
@@ -1453,7 +1453,7 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
case E_TypeKind_S32:
case E_TypeKind_S64:
{
result = str8_from_s64(arena, eval.value.s64, radix, min_digits, digit_group_separator);
result = str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator);
}break;
case E_TypeKind_U8:
@@ -1461,14 +1461,14 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
case E_TypeKind_U32:
case E_TypeKind_U64:
{
result = str8_from_u64(arena, eval.value.u64, radix, min_digits, digit_group_separator);
result = str8_from_u64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator);
}break;
case E_TypeKind_U128:
{
Temp scratch = scratch_begin(&arena, 1);
String8 upper64 = str8_from_u64(scratch.arena, eval.value.u128.u64[0], radix, min_digits, digit_group_separator);
String8 lower64 = str8_from_u64(scratch.arena, eval.value.u128.u64[1], radix, min_digits, digit_group_separator);
String8 upper64 = str8_from_u64(scratch.arena, eval.value.u128.u64[0], params->radix, params->min_digits, digit_group_separator);
String8 lower64 = str8_from_u64(scratch.arena, eval.value.u128.u64[1], params->radix, params->min_digits, digit_group_separator);
result = push_str8f(arena, "%S:%S", upper64, lower64);
scratch_end(scratch);
}break;
@@ -1477,7 +1477,7 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
case E_TypeKind_F64:{f64 = eval.value.f64;}goto f64_path;
f64_path:;
{
result = push_str8f(arena, "%.*f", min_digits ? min_digits : 16, f64);
result = push_str8f(arena, "%.*f", params->min_digits ? params->min_digits : 16, f64);
U64 num_to_chop = 0;
for(U64 num_trimmed = 0; num_trimmed < result.size; num_trimmed += 1)
{
@@ -1512,8 +1512,8 @@ ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix,
break;
}
}
String8 numeric_value_string = str8_from_u64(scratch.arena, eval.value.u64, radix, min_digits, digit_group_separator);
if(flags & EV_StringFlag_ReadOnlyDisplayRules)
String8 numeric_value_string = str8_from_u64(scratch.arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator);
if(params->flags & EV_StringFlag_ReadOnlyDisplayRules)
{
if(constant_name.size != 0)
{
@@ -1581,6 +1581,159 @@ ev_escaped_from_raw_string(Arena *arena, String8 raw)
return result;
}
//- rjf: tree stringification iterator
internal EV_StringIter *
ev_string_iter_begin(Arena *arena, E_Eval eval, EV_StringParams *params)
{
EV_StringIter *it = push_array(arena, EV_StringIter, 1);
it->top_task = push_array(arena, EV_StringIterTask, 1);
it->top_task->eval = eval;
MemoryCopyStruct(&it->top_task->params, params);
return it;
}
internal B32
ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)
{
B32 result = 0;
//- rjf: make progress on top task
MemoryZeroStruct(out_string);
B32 need_pop = 1;
B32 need_new_task = 0;
EV_StringIterTask new_task = {0};
if(it->top_task != 0)
{
result = 1;
//- rjf: unpack task
U64 task_idx = it->top_task->idx;
EV_StringParams *params = &it->top_task->params;
E_Eval eval = it->top_task->eval;
E_TypeKey type_key = eval.irtree.type_key;
E_TypeKind type_kind = e_type_kind_from_key(type_key);
//- rjf: type evaluations -> display type string
if(eval.irtree.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.irtree.type_key))
{
*out_string = e_type_string_from_key(arena, type_key);
}
//- rjf: non-type evaluations
else switch(type_kind)
{
//- rjf: default - leaf cases
default:
{
E_Eval value_eval = e_value_eval_from_eval(eval);
*out_string = ev_string_from_simple_typed_eval(arena, params, value_eval);
}break;
//- rjf: lenses
case E_TypeKind_Lens:
switch(task_idx)
{
default:{}break;
// rjf: step 0 -> generate lens description, then descend to same evaluation w/ direct type
case 0:
{
Temp scratch = scratch_begin(&arena, 1);
String8List strings = {0};
{
E_Type *type = e_type_from_key__cached(type_key);
str8_list_pushf(scratch.arena, &strings, "%S(", type->name);
for EachIndex(idx, type->count)
{
String8 string = e_string_from_expr(scratch.arena, type->args[idx]);
str8_list_push(scratch.arena, &strings, string);
if(idx+1 < type->count)
{
str8_list_pushf(scratch.arena, &strings, ", ");
}
}
str8_list_pushf(scratch.arena, &strings, ") <- (");
}
*out_string = str8_list_join(arena, &strings, 0);
need_new_task = 1;
new_task.params = *params;
new_task.eval = eval;
new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key);
scratch_end(scratch);
}break;
// rjf: step 1 -> close
case 1:
{
*out_string = str8_lit(")");
}break;
}break;
//- rjf: pointers
case E_TypeKind_Function:
case E_TypeKind_Ptr:
case E_TypeKind_LRef:
case E_TypeKind_RRef:
{
}break;
//- rjf: arrays
case E_TypeKind_Array:
{
}break;
//- rjf: non-string-arrays/structs/sets
case E_TypeKind_Struct:
case E_TypeKind_Union:
case E_TypeKind_Class:
case E_TypeKind_IncompleteStruct:
case E_TypeKind_IncompleteUnion:
case E_TypeKind_IncompleteClass:
case E_TypeKind_Set:
arrays_and_sets_and_structs:
{
}break;
}
}
//- rjf: bump task counter
if(it->top_task != 0)
{
it->top_task->idx += 1;
}
//- rjf: if result is good, and we have a new task? -> push
if(result && need_new_task)
{
EV_StringIterTask *new_t = it->free_task;
if(new_t != 0)
{
SLLStackPop(it->free_task);
}
else
{
new_t = push_array(arena, EV_StringIterTask, 1);
}
MemoryCopyStruct(new_t, &new_task);
SLLStackPush(it->top_task, new_t);
new_t->idx = 0;
}
//- rjf: if result is good, but we don't have a new task? -> pop
else if(result && need_pop)
{
EV_StringIterTask *task = it->top_task;
SLLStackPop(it->top_task);
SLLStackPush(it->free_task, task);
}
return result;
}
////////////////////////////////
//~ rjf: Expression & IR-Tree => Expand Rule
@@ -237,6 +237,32 @@ enum
{
EV_StringFlag_ReadOnlyDisplayRules = (1<<0),
EV_StringFlag_PrettyNames = (1<<1),
EV_StringFlag_DisableAddresses = (1<<2),
EV_StringFlag_DisableStrings = (1<<3),
};
typedef struct EV_StringParams EV_StringParams;
struct EV_StringParams
{
EV_StringFlags flags;
U32 radix;
U32 min_digits;
};
typedef struct EV_StringIterTask EV_StringIterTask;
struct EV_StringIterTask
{
EV_StringIterTask *next;
EV_StringParams params;
E_Eval eval;
U64 idx;
};
typedef struct EV_StringIter EV_StringIter;
struct EV_StringIter
{
EV_StringIterTask *top_task;
EV_StringIterTask *free_task;
};
////////////////////////////////
@@ -341,9 +367,13 @@ internal B32 ev_row_is_editable(EV_Row *row);
internal String8 ev_string_from_ascii_value(Arena *arena, U8 val);
internal String8 ev_string_from_hresult_facility_code(U32 code);
internal String8 ev_string_from_hresult_code(U32 code);
internal String8 ev_string_from_simple_typed_eval(Arena *arena, EV_StringFlags flags, U32 radix, U32 min_digits, E_Eval eval);
internal String8 ev_string_from_simple_typed_eval(Arena *arena, EV_StringParams *params, E_Eval eval);
internal String8 ev_escaped_from_raw_string(Arena *arena, String8 raw);
//- rjf: tree stringification iterator
internal EV_StringIter *ev_string_iter_begin(Arena *arena, E_Eval eval, EV_StringParams *params);
internal B32 ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string);
////////////////////////////////
//~ rjf: Expression & IR-Tree => Expand Rule
+27 -19
View File
@@ -6839,7 +6839,8 @@ rd_window_frame(void)
E_Eval eval = e_eval_from_string(scratch.arena, rd_state->drag_drop_regs->expr);
if(eval.irtree.mode != E_Mode_Null)
{
String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), EV_StringFlag_ReadOnlyDisplayRules, 10, ui_top_font(), ui_top_font_size(), ui_top_font_size()*20.f, eval);
EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules, .radix = 10};
String8 value_string = rd_value_string_from_eval_NEW(scratch.arena, str8_zero(), &string_params, ui_top_font(), ui_top_font_size(), ui_top_font_size()*20.f, eval);
rd_code_label(1.f, 0, ui_color_from_name(str8_lit("text")), value_string);
}
}
@@ -10419,7 +10420,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
U32 min_digits = 0;
B32 no_addr = 0;
B32 no_string = 0;
B32 has_array = 0;
#if 0 // TODO(rjf): @eval
for(E_Expr *tag = root_eval.exprs.last->first_tag; tag != &e_expr_nil; tag = tag->next)
{
@@ -10430,7 +10430,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
else if(str8_match(tag->string, str8_lit("oct"), 0)) {radix = 8; }
else if(str8_match(tag->string, str8_lit("no_addr"), 0)) {no_addr = 1;}
else if(str8_match(tag->string, str8_lit("no_string"), 0)) {no_string = 1;}
else if(str8_match(tag->string, str8_lit("array"), 0)) {has_array = 1;}
else if(str8_match(tag->string, str8_lit("digits"), 0))
{
E_Expr *num_expr = tag->first->next;
@@ -10440,22 +10439,12 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
}
}
#endif
//- rjf: force no_addr in non-address-spaces
if(eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ||
eval.space.kind == RD_EvalSpaceKind_MetaCfg)
{
E_TypeKind kind = e_type_kind_from_key(eval.irtree.type_key);
if(kind != E_TypeKind_Ptr)
{
no_addr = 1;
}
else
{
E_Type *type = e_type_from_key__cached(eval.irtree.type_key);
if(!(type->flags & E_TypeFlag_External))
{
no_addr = 1;
}
}
no_addr = 1;
}
//- rjf: force no_string, if we are looking at padding members
@@ -10507,7 +10496,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
default:
{
E_Eval value_eval = e_value_eval_from_eval(eval);
String8 string = ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval);
String8 string = {0}; // ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval);
space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x;
str8_list_push(arena, out, string);
}break;
@@ -10624,7 +10613,7 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f
space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, left_paren).x;
str8_list_push(arena, out, left_paren);
}
String8 string = ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval);
String8 string = {0}; // ev_string_from_simple_typed_eval(arena, flags, radix, min_digits, value_eval);
space_taken += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x;
str8_list_push(arena, out, string);
if(did_content)
@@ -10889,6 +10878,25 @@ rd_value_string_from_eval(Arena *arena, String8 filter, EV_StringFlags flags, U3
return result;
}
internal String8
rd_value_string_from_eval_NEW(Arena *arena, String8 filter, EV_StringParams *params, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval)
{
Temp scratch = scratch_begin(&arena, 1);
String8List strs = {0};
{
EV_StringIter *iter = ev_string_iter_begin(scratch.arena, eval, params);
F32 space_taken_px = 0;
for(String8 string = {0}; ev_string_iter_next(scratch.arena, iter, &string) && space_taken_px < max_size;)
{
str8_list_push(scratch.arena, &strs, string);
space_taken_px += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x;
}
}
String8 result = str8_list_join(arena, &strs, 0);
scratch_end(scratch);
return result;
}
////////////////////////////////
//~ rjf: Hover Eval
@@ -13922,7 +13930,7 @@ rd_frame(void)
for EachElement(idx, view_ui_rule_table)
{
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
expr->type_key = e_type_key_cons(.kind = E_TypeKind_Lens, .name = view_ui_rule_table[idx].name);
expr->type_key = e_type_key_cons(.kind = E_TypeKind_LensSpec, .name = view_ui_rule_table[idx].name);
e_string2expr_map_insert(scratch.arena, e_ir_state->ctx->macro_map, view_ui_rule_table[idx].name, expr);
}
}
+1
View File
@@ -1007,6 +1007,7 @@ internal void rd_window_frame(void);
internal F32 rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval root_eval, E_Eval eval, String8List *out);
internal String8 rd_value_string_from_eval(Arena *arena, String8 filter, EV_StringFlags flags, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval);
internal String8 rd_value_string_from_eval_NEW(Arena *arena, String8 filter, EV_StringParams *params, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval);
////////////////////////////////
//~ rjf: Hover Eval
+2 -1
View File
@@ -1503,7 +1503,8 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla
}
//- rjf: generate strings/flags based on that expression & fill
result.string = rd_value_string_from_eval(arena, rd_view_query_input(), string_flags, default_radix, font, font_size, max_size_px, result.eval);
EV_StringParams string_params = {.flags = string_flags, .radix = default_radix};
result.string = rd_value_string_from_eval_NEW(arena, rd_view_query_input(), &string_params, font, font_size, max_size_px, result.eval);
result.flags |= !!(ev_type_key_is_editable(result.eval.irtree.type_key) && result.eval.irtree.mode == E_Mode_Offset) * RD_WatchCellFlag_CanEdit;
E_Type *type = e_type_from_key__cached(result.eval.irtree.type_key);
if(type->flags & (E_TypeFlag_IsPlainText|E_TypeFlag_IsPathText))
+2 -1
View File
@@ -1978,7 +1978,8 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
String8 eval_string = {0};
if(!e_type_key_match(e_type_key_zero(), eval.irtree.type_key))
{
eval_string = rd_value_string_from_eval(scratch.arena, str8_zero(), EV_StringFlag_ReadOnlyDisplayRules, 10, params->font, params->font_size, params->font_size*60.f, eval);
EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules, .radix = 10};
eval_string = rd_value_string_from_eval_NEW(scratch.arena, str8_zero(), &string_params, params->font, params->font_size, params->font_size*60.f, eval);
}
ui_spacer(ui_em(1.5f, 1.f));
ui_set_next_pref_width(ui_children_sum(1));