mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-15 08:32:22 -07:00
full evaluation expression string computation, use for expression drag/drop - resolve parent expression chain in order
This commit is contained in:
+43
-1
@@ -900,12 +900,54 @@ e_full_expr_string_from_key(Arena *arena, E_Key key)
|
||||
if(!e_key_match(bundle->parent_key, e_key_zero()))
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
//- NOTE(rjf): any individual eval does not contain all information for
|
||||
// reconstructing an entire "flattened" expression string. this is because
|
||||
// one evaluation may be e.g. `$.x`, in the context of `foobar`, and so
|
||||
// the full thing is evaluated as equivalent to `foobar.x`. In that case,
|
||||
// `foobar` is referred to via the "parent key" of the evaluation for
|
||||
// `$.x`.
|
||||
//
|
||||
// because parents may themselves have parents, e.g. `$.x` in the context
|
||||
// of `$` in the context of `foobar`, we need to apply the parent
|
||||
// expression strings to each parent.
|
||||
//
|
||||
// we do this in order, from oldest ancestor to the passed-in evaluation
|
||||
// key, so we gather the fully-resolved string at the end of the chain.
|
||||
|
||||
//- rjf: gather the entire chain of parents (in order of deepest ancestor -> shallowest)
|
||||
typedef struct ParentResolveTask ParentResolveTask;
|
||||
struct ParentResolveTask
|
||||
{
|
||||
ParentResolveTask *next;
|
||||
E_Key key;
|
||||
E_CacheBundle *bundle;
|
||||
};
|
||||
ParentResolveTask start_task = {0, bundle};
|
||||
ParentResolveTask *first_task = &start_task;
|
||||
ParentResolveTask *last_task = first_task;
|
||||
for(ParentResolveTask *t = first_task, *next = 0; t != 0; (t = next, next = 0))
|
||||
{
|
||||
if(!e_key_match(t->bundle->parent_key, e_key_zero()))
|
||||
{
|
||||
ParentResolveTask *task = push_array(scratch.arena, ParentResolveTask, 1);
|
||||
SLLQueuePushFront(first_task, last_task, task);
|
||||
task->bundle = e_cache_bundle_from_key(t->bundle->parent_key);
|
||||
next = task;
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: walk the chain of tasks, from deepest -> shallowest, producing a
|
||||
// more fully resolved string at each step
|
||||
String8 parent_string = {0};
|
||||
for(ParentResolveTask *t = first_task; t != 0; t = t->next)
|
||||
{
|
||||
E_Parse parse = e_parse_from_bundle(t->bundle);
|
||||
parent_string = e_string_from_expr(scratch.arena, parse.expr, parent_string);
|
||||
}
|
||||
|
||||
//- rjf: take final string as result
|
||||
result = push_str8_copy(arena, parent_string);
|
||||
|
||||
scratch_end(scratch);
|
||||
}
|
||||
return result;
|
||||
|
||||
@@ -2323,6 +2323,7 @@ rd_view_from_eval(RD_Cfg *parent, E_Eval eval)
|
||||
rd_cfg_child_from_string_or_alloc(view, str8_lit("selected"));
|
||||
{
|
||||
MD_NodePtrList schemas = rd_schemas_from_name(schema_name);
|
||||
|
||||
E_Expr *primary_expr = eval.expr;
|
||||
E_Expr **args = 0;
|
||||
U64 args_count = 0;
|
||||
@@ -4747,7 +4748,7 @@ rd_view_ui(Rng2F32 rect)
|
||||
cell->eval.space.kind == E_SpaceKind_File ||
|
||||
cell->eval.space.kind == E_SpaceKind_Null)
|
||||
{
|
||||
RD_RegsScope(.expr = e_string_from_expr(scratch.arena, cell->eval.expr, e_string_from_expr(scratch.arena, row->eval.expr, str8_zero())))
|
||||
RD_RegsScope(.expr = e_full_expr_string_from_key(scratch.arena, cell->eval.key))
|
||||
rd_drag_begin(RD_RegSlot_Expr);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user