about summary refs log tree commit diff
path: root/tvix/eval/src/compiler.rs
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-08-09T14·44+0300
committertazjin <tazjin@tvl.su>2022-08-13T18·28+0000
commita93933b487cf710400c9126d97450264138695df (patch)
tree3b8f747de27f73acb6c87893233335b60ca9a6c5 /tvix/eval/src/compiler.rs
parent3577841bdedddffb411c07ed050b25b986d1d0d6 (diff)
feat(tvix): implement string interpolation r/4434
This adds a new instruction which assembles an interpolated string
from a specified number of fragments, which are already going to be
located on the stack in the right position.

This will raise a type error if any of the fragments do not evaluate
to a string.

Change-Id: I5756248fa3e9fcc3d063c14db40b332f7e20a588
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6098
Tested-by: BuildkiteCI
Reviewed-by: grfn <grfn@gws.fyi>
Diffstat (limited to 'tvix/eval/src/compiler.rs')
-rw-r--r--tvix/eval/src/compiler.rs8
1 files changed, 7 insertions, 1 deletions
diff --git a/tvix/eval/src/compiler.rs b/tvix/eval/src/compiler.rs
index 5ad8215b10..5da8444488 100644
--- a/tvix/eval/src/compiler.rs
+++ b/tvix/eval/src/compiler.rs
@@ -32,6 +32,12 @@ impl Compiler {
                 self.compile_string(op)
             }
 
+            // The interpolation node is just a wrapper around the
+            // inner value of a fragment, it only requires unwrapping.
+            rnix::SyntaxKind::NODE_STRING_INTERPOL => {
+                self.compile(node.first_child().expect("TODO (should not be possible)"))
+            }
+
             rnix::SyntaxKind::NODE_BIN_OP => {
                 let op = rnix::types::BinOp::cast(node).expect("TODO (should not be possible)");
                 self.compile_binop(op)
@@ -112,7 +118,7 @@ impl Compiler {
         }
 
         if count != 1 {
-            todo!("assemble string interpolation instruction")
+            self.chunk.add_op(OpCode::OpInterpolate(count));
         }
 
         Ok(())