diff options
author | Vincent Ambo <mail@tazj.in> | 2022-09-16T16·48+0300 |
---|---|---|
committer | tazjin <tazjin@tvl.su> | 2022-09-16T18·13+0000 |
commit | e86acd32122424f5ca2e8ee630d03991b9f9126b (patch) | |
tree | 0dc269b8d03ead60a834dcaebd623637262e2f94 | |
parent | 20230e1e2ddea5fd6e65d6d263444c46dc5e43db (diff) |
feat(tvix/eval): implement legacy let syntax r/4877
... and emit a warning if anyone decides to use. Change-Id: Iaa6fe9fa932340e6d0fa9f357155e78823702576 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6611 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
-rw-r--r-- | tvix/eval/src/compiler/mod.rs | 16 | ||||
-rw-r--r-- | tvix/eval/src/warnings.rs | 6 |
2 files changed, 18 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? diff --git a/tvix/eval/src/warnings.rs b/tvix/eval/src/warnings.rs index 6f4f54160167..ddb7510c8ab7 100644 --- a/tvix/eval/src/warnings.rs +++ b/tvix/eval/src/warnings.rs @@ -10,6 +10,7 @@ pub enum WarningKind { UselessInherit, UnusedBinding, ShadowedGlobal(&'static str), + DeprecatedLegacyLet, /// Tvix internal warning for features triggered by users that are /// not actually implemented yet, but do not cause runtime failures. @@ -75,6 +76,10 @@ impl EvalWarning { format!("declared variable '{}' shadows a built-in global!", name) } + WarningKind::DeprecatedLegacyLet => { + "legacy `let` syntax used, please rewrite this as `let .. in ...`".to_string() + } + WarningKind::NotImplemented(what) => { format!("feature not yet implemented in tvix: {}", what) } @@ -89,6 +94,7 @@ impl EvalWarning { WarningKind::UselessInherit => "W002", WarningKind::UnusedBinding => "W003", WarningKind::ShadowedGlobal(_) => "W004", + WarningKind::DeprecatedLegacyLet => "W005", WarningKind::NotImplemented(_) => "W999", } } |