diff options
| author | tslil <tslil@posteo.de> | 2025-10-18 23:58:30 +0100 |
|---|---|---|
| committer | tslil <tslil@posteo.de> | 2025-10-19 00:03:09 +0100 |
| commit | f24bc43906b3d310e3d558a01b2d446fe977a4ba (patch) | |
| tree | c7b9d118a92e3a0929a6f7f57a91ed37577de097 /rprt-engine/src/explainer.rs | |
| parent | 5cf06bab8d5a8c6115df35f6cec652bfd0fd0922 (diff) | |
Parse & explain groups!
Diffstat (limited to 'rprt-engine/src/explainer.rs')
| -rw-r--r-- | rprt-engine/src/explainer.rs | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/rprt-engine/src/explainer.rs b/rprt-engine/src/explainer.rs index 38bd41b..b62bee4 100644 --- a/rprt-engine/src/explainer.rs +++ b/rprt-engine/src/explainer.rs @@ -201,9 +201,9 @@ fn build_tree_from_expr( g_pos } Composite::Hook { kind, left, right } => { - let left_offset = offset + 1; // Account for opening '(' + let left_offset = offset + 1; let left_pos = build_tree_from_expr(left, depth + 1, left_offset, nodes); - let right_offset = left_offset + format_width(left) + 1; // +1 for hook operator (< or >) + let right_offset = left_offset + format_width(left) + 1; let right_pos = build_tree_from_expr(right, depth + 1, right_offset, nodes); nodes.push(TreeNode { @@ -216,6 +216,30 @@ fn build_tree_from_expr( }); left_pos } + Composite::Group { operations } => { + let mut children = Vec::new(); + let mut current_offset = offset + 1; + + for (i, op) in operations.iter().enumerate() { + if i > 0 { + current_offset += 3; + } + let pos = build_tree_from_expr(op, depth + 1, current_offset, nodes); + children.push(pos); + current_offset += format_width(op); + } + + let node_pos = children.first().copied().unwrap_or(offset); + nodes.push(TreeNode { + pos: node_pos, + depth, + children, + is_leaf: false, + hook_kind: None, + train_arity: None, + }); + node_pos + } } } |
