compose_eval/expression/
mod.rs

1use crate::vm::{Machine, Tracked};
2use crate::{Eval, Evaluated};
3use compose_library::diag::{SourceResult};
4use compose_syntax::ast::{AstNode, Expr};
5
6mod assignment;
7mod atomic;
8mod binary;
9mod bindings;
10mod block;
11mod call;
12mod closure;
13mod control_flow;
14mod field_access;
15mod parenthesized;
16mod path_access;
17mod unary;
18mod array;
19mod range;
20mod map;
21
22pub use closure::eval_lambda;
23
24impl Eval for Expr<'_> {
25    fn eval(self, vm: &mut Machine) -> SourceResult<Evaluated> {
26        let span = self.span();
27        let v = match self {
28            Expr::Int(i) => i.eval(vm),
29            Expr::Binary(b) => b.eval(vm),
30            Expr::LetBinding(l) => l.eval(vm),
31            Expr::Ident(i) => i.eval(vm),
32            Expr::CodeBlock(c) => c.eval(vm),
33            Expr::Unit(_) => Ok(Evaluated::unit()),
34            Expr::Str(s) => s.eval(vm),
35            Expr::Unary(u) => u.eval(vm),
36            Expr::Bool(b) => b.eval(vm),
37            Expr::FuncCall(f) => f.eval(vm),
38            Expr::FieldAccess(f) => f.eval(vm),
39            Expr::PathAccess(p) => p.eval(vm),
40            Expr::Parenthesized(p) => p.eval(vm),
41            Expr::Conditional(c) => c.eval(vm),
42            Expr::WhileLoop(w) => w.eval(vm),
43            Expr::ForLoop(f) => f.eval(vm),
44            Expr::Array(a) => a.eval(vm),
45            Expr::Range(r) => r.eval(vm),
46            Expr::Map(m) => m.eval(vm),
47            Expr::Lambda(l) => l.eval(vm),
48        }?
49        .spanned(span)
50        .track_tmp_root(vm);
51
52        Ok(v)
53    }
54}