aboutsummaryrefslogtreecommitdiff
path: root/rprt-engine/src/explainer.rs
diff options
context:
space:
mode:
authortslil <tslil@posteo.de>2025-10-18 23:58:30 +0100
committertslil <tslil@posteo.de>2025-10-19 00:03:09 +0100
commitf24bc43906b3d310e3d558a01b2d446fe977a4ba (patch)
treec7b9d118a92e3a0929a6f7f57a91ed37577de097 /rprt-engine/src/explainer.rs
parent5cf06bab8d5a8c6115df35f6cec652bfd0fd0922 (diff)
Parse & explain groups!
Diffstat (limited to 'rprt-engine/src/explainer.rs')
-rw-r--r--rprt-engine/src/explainer.rs28
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
+ }
}
}