diff options
author | Nadrieril | 2020-04-05 22:56:45 +0100 |
---|---|---|
committer | Nadrieril | 2020-04-05 22:56:45 +0100 |
commit | 12b81d55e1343fc30138d1a13cd48fa2e05744df (patch) | |
tree | b99dadebeab8094c129cc5d872cfd561f9aa78f3 /dhall/src/semantics/resolve | |
parent | fc965361346461fbd52bb132caa874778d9fe913 (diff) |
Fix import bug
Diffstat (limited to 'dhall/src/semantics/resolve')
-rw-r--r-- | dhall/src/semantics/resolve/env.rs | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/dhall/src/semantics/resolve/env.rs b/dhall/src/semantics/resolve/env.rs index d7ff0ae..6346a6d 100644 --- a/dhall/src/semantics/resolve/env.rs +++ b/dhall/src/semantics/resolve/env.rs @@ -71,7 +71,7 @@ impl ImportEnv { pub fn handle_import( &mut self, - location: ImportLocation, + mut location: ImportLocation, do_resolve: impl FnOnce(&mut Self) -> Result<TypedHir, Error>, ) -> Result<TypedHir, Error> { if self.stack.contains(&location) { @@ -82,14 +82,16 @@ impl ImportEnv { Ok(match self.cache.get(&location) { Some(expr) => expr.clone(), None => { - // Push the current location on the stack - self.stack.push(location); - - // Resolve the import recursively - let expr = do_resolve(self)?; - - // Remove location from the stack. - let location = self.stack.pop().unwrap(); + let expr = { + // Push the current location on the stack + self.stack.push(location); + // Resolve the import recursively + // WARNING: do not propagate errors here or the stack will get messed up. + let result = do_resolve(self); + // Remove location from the stack. + location = self.stack.pop().unwrap(); + result + }?; // Add the resolved import to the cache self.cache.insert(location, expr.clone()); |