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;
21mod index_access;
22
23pub use closure::eval_lambda;
24
25impl Eval for Expr<'_> {
26    fn eval(self, vm: &mut Machine) -> SourceResult<Evaluated> {
27        let span = self.span();
28        let v = match self {
29            Expr::Int(i) => i.eval(vm),
30            Expr::Binary(b) => b.eval(vm),
31            Expr::LetBinding(l) => l.eval(vm),
32            Expr::Ident(i) => i.eval(vm),
33            Expr::CodeBlock(c) => c.eval(vm),
34            Expr::Unit(_) => Ok(Evaluated::unit()),
35            Expr::Str(s) => s.eval(vm),
36            Expr::Unary(u) => u.eval(vm),
37            Expr::Bool(b) => b.eval(vm),
38            Expr::FuncCall(f) => f.eval(vm),
39            Expr::FieldAccess(f) => f.eval(vm),
40            Expr::PathAccess(p) => p.eval(vm),
41            Expr::Parenthesized(p) => p.eval(vm),
42            Expr::Conditional(c) => c.eval(vm),
43            Expr::WhileLoop(w) => w.eval(vm),
44            Expr::ForLoop(f) => f.eval(vm),
45            Expr::Array(a) => a.eval(vm),
46            Expr::Range(r) => r.eval(vm),
47            Expr::Map(m) => m.eval(vm),
48            Expr::Lambda(l) => l.eval(vm),
49            Expr::IndexAccess(i) => i.eval(vm),
50        }?
51        .spanned(span)
52        .track_tmp_root(vm);
53
54        Ok(v)
55    }
56}