diff options
Diffstat (limited to 'tvix/eval/src/compiler/mod.rs')
-rw-r--r-- | tvix/eval/src/compiler/mod.rs | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs index 90bc263bc8be..713ae2fdb2c7 100644 --- a/tvix/eval/src/compiler/mod.rs +++ b/tvix/eval/src/compiler/mod.rs @@ -188,10 +188,7 @@ impl Compiler<'_, '_> { // their value on the stack. ast::Expr::Paren(paren) => self.compile(slot, paren.expr().unwrap()), - ast::Expr::LegacyLet(_) => { - let span = self.span_for(&expr); - self.emit_error(span, ErrorKind::NotImplemented("legacy let syntax")); - } + ast::Expr::LegacyLet(legacy_let) => self.compile_legacy_let(slot, legacy_let), ast::Expr::Root(_) => unreachable!("there cannot be more than one root"), ast::Expr::Error(_) => unreachable!("compile is only called on validated trees"), @@ -997,6 +994,17 @@ impl Compiler<'_, '_> { self.push_op(OpCode::OpCall, &node); } + fn compile_legacy_let(&mut self, slot: LocalIdx, node: ast::LegacyLet) { + self.scope_mut().begin_scope(); + self.compile_recursive_scope(slot, true, &node); + self.push_op(OpCode::OpAttrs(Count(node.entries().count())), &node); + self.emit_constant(Value::String(SmolStr::new_inline("body").into()), &node); + self.push_op(OpCode::OpAttrsSelect, &node); + + let warning_span = self.span_for(&node); + self.emit_warning(warning_span, WarningKind::DeprecatedLegacyLet); + } + /// Compile an expression into a runtime thunk which should be /// lazily evaluated when accessed. // TODO: almost the same as Compiler::compile_lambda; unify? |