summaryrefslogtreecommitdiff
path: root/src/eval/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval/mod.rs')
-rw-r--r--src/eval/mod.rs25
1 files changed, 12 insertions, 13 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs
index c480ddfe..d1307b6d 100644
--- a/src/eval/mod.rs
+++ b/src/eval/mod.rs
@@ -218,24 +218,23 @@ pub trait Eval {
}
impl Eval for Tree {
- type Output = NodeMap;
+ type Output = ExprMap;
fn eval(&self, ctx: &mut EvalContext) -> Self::Output {
- let mut map = NodeMap::new();
-
- for node in self {
- let value = if let Some(call) = node.desugar() {
- call.eval(ctx)
- } else if let Node::Expr(expr) = node {
- expr.eval(ctx)
- } else {
- continue;
- };
+ struct ExprVisitor<'a, 'b> {
+ ctx: &'a mut EvalContext<'b>,
+ map: ExprMap,
+ }
- map.insert(node as *const _, value);
+ impl<'ast> Visit<'ast> for ExprVisitor<'_, '_> {
+ fn visit_expr(&mut self, node: &'ast Expr) {
+ self.map.insert(node as *const _, node.eval(self.ctx));
+ }
}
- map
+ let mut visitor = ExprVisitor { ctx, map: ExprMap::new() };
+ visitor.visit_tree(self);
+ visitor.map
}
}