compose_eval/expression/
index_access.rs

1use crate::vm::Tracked;
2use crate::{Eval, Evaluated, Machine};
3use compose_library::diag::SourceResult;
4use compose_library::{IntoValue, Vm};
5use compose_syntax::ast;
6use compose_syntax::ast::AstNode;
7
8impl Eval for ast::IndexAccess<'_> {
9    fn eval(self, vm: &mut Machine) -> SourceResult<Evaluated> {
10        let target = self.target().eval(vm)?.track_tmp_root(vm);
11        let index = self.index().eval(vm)?.track_tmp_root(vm).value;
12
13        let value =
14            target
15                .value
16                .index(index, self.target().span(), self.index().span(), vm.heap())?;
17
18        Ok(Evaluated::new(value.into_value(), target.mutable))
19    }
20}