about summary refs log tree commit diff
path: root/tvix/eval/src/compiler.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tvix/eval/src/compiler.rs')
-rw-r--r--tvix/eval/src/compiler.rs26
1 files changed, 23 insertions, 3 deletions
diff --git a/tvix/eval/src/compiler.rs b/tvix/eval/src/compiler.rs
index c5ec664dc2cf..63a02f68c013 100644
--- a/tvix/eval/src/compiler.rs
+++ b/tvix/eval/src/compiler.rs
@@ -13,7 +13,7 @@
 //! the code in this module, `debug_assert!` has been used to catch
 //! mistakes early during development.
 
-use std::path::Path;
+use std::path::{Path, PathBuf};
 
 use crate::chunk::Chunk;
 use crate::errors::{Error, EvalResult};
@@ -35,6 +35,7 @@ pub struct CompilationResult {
 struct Compiler {
     chunk: Chunk,
     warnings: Vec<EvalWarning>,
+    root_dir: PathBuf,
 }
 
 impl Compiler {
@@ -175,7 +176,11 @@ impl Compiler {
                 buf
             }
 
-            rnix::value::Anchor::Relative => todo!("resolve relative to file location"),
+            rnix::value::Anchor::Relative => {
+                let mut buf = self.root_dir.clone();
+                buf.push(path);
+                buf
+            }
 
             // This confusingly named variant is actually
             // angle-bracket lookups, which in C++ Nix desugar
@@ -624,8 +629,23 @@ impl Compiler {
     }
 }
 
-pub fn compile(ast: rnix::AST) -> EvalResult<CompilationResult> {
+pub fn compile(ast: rnix::AST, location: Option<PathBuf>) -> EvalResult<CompilationResult> {
+    let mut root_dir = match location {
+        Some(dir) => Ok(dir),
+        None => std::env::current_dir().map_err(|e| {
+            Error::PathResolution(format!("could not determine current directory: {}", e))
+        }),
+    }?;
+
+    // If the path passed from the caller points to a file, the
+    // filename itself needs to be truncated as this must point to a
+    // directory.
+    if root_dir.is_file() {
+        root_dir.pop();
+    }
+
     let mut c = Compiler {
+        root_dir,
         chunk: Chunk::default(),
         warnings: vec![],
     };