summaryrefslogtreecommitdiff
path: root/dhall
diff options
context:
space:
mode:
authorNadrieril2020-04-05 22:56:45 +0100
committerNadrieril2020-04-05 22:56:45 +0100
commit12b81d55e1343fc30138d1a13cd48fa2e05744df (patch)
treeb99dadebeab8094c129cc5d872cfd561f9aa78f3 /dhall
parentfc965361346461fbd52bb132caa874778d9fe913 (diff)
Fix import bug
Diffstat (limited to 'dhall')
-rw-r--r--dhall/build.rs7
-rw-r--r--dhall/src/semantics/resolve/env.rs20
2 files changed, 12 insertions, 15 deletions
diff --git a/dhall/build.rs b/dhall/build.rs
index ec31192..784ce93 100644
--- a/dhall/build.rs
+++ b/dhall/build.rs
@@ -330,12 +330,7 @@ fn generate_tests() -> std::io::Result<()> {
module_name: "type_inference_success",
directory: "type-inference/success/",
variant: "TypeInferenceSuccess",
- exclude_path: Rc::new(|path: &str| {
- false
- // Too slow, but also not all features implemented
- // For now needs support for hashed imports
- || path == "prelude"
- }),
+ too_slow_path: Rc::new(|path: &str| path == "prelude"),
output_type: Some(FileType::Text),
..default_feature.clone()
},
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());