summaryrefslogtreecommitdiff
path: root/dhall/src
diff options
context:
space:
mode:
authorNadrieril2019-09-03 16:24:07 +0200
committerNadrieril2019-09-03 17:01:25 +0200
commit79595b1ae1a12fa2414d4b6c3c4bb2f7a0a9c094 (patch)
tree8c2220cae7b37a03d787ed4a13c903bf8f58cdbf /dhall/src
parent250525a05e1af17bb46ceb72879f471e54fb5091 (diff)
Resolve imports by mutating Expr instead of cloning it
Diffstat (limited to 'dhall/src')
-rw-r--r--dhall/src/phase/resolve.rs41
1 files changed, 22 insertions, 19 deletions
diff --git a/dhall/src/phase/resolve.rs b/dhall/src/phase/resolve.rs
index a58f5e4..32e90c8 100644
--- a/dhall/src/phase/resolve.rs
+++ b/dhall/src/phase/resolve.rs
@@ -58,18 +58,16 @@ fn load_import(
}
fn do_resolve_expr(
- Parsed(expr, root): Parsed,
+ parsed: Parsed,
import_cache: &mut ImportCache,
import_stack: &ImportStack,
) -> Result<Resolved, ImportError> {
- let resolve = |import: &Import| -> Result<Normalized, ImportError> {
- if import_stack.contains(import) {
- return Err(ImportError::ImportCycle(
- import_stack.clone(),
- import.clone(),
- ));
+ let Parsed(mut expr, root) = parsed;
+ let mut resolve = |import: Import| -> Result<Normalized, ImportError> {
+ if import_stack.contains(&import) {
+ return Err(ImportError::ImportCycle(import_stack.clone(), import));
}
- match import_cache.get(import) {
+ match import_cache.get(&import) {
Some(expr) => Ok(expr.clone()),
None => {
// Copy the import stack and push the current import
@@ -77,16 +75,20 @@ fn do_resolve_expr(
import_stack.push(import.clone());
// Resolve the import recursively
- let expr =
- resolve_import(import, &root, import_cache, &import_stack)?;
+ let expr = resolve_import(
+ &import,
+ &root,
+ import_cache,
+ &import_stack,
+ )?;
// Add the import to the cache
- import_cache.insert(import.clone(), expr.clone());
+ import_cache.insert(import, expr.clone());
Ok(expr)
}
}
};
- let expr = expr.traverse_resolve(resolve)?;
+ expr.traverse_resolve_mut(&mut resolve)?;
Ok(Resolved(expr))
}
@@ -95,12 +97,13 @@ pub(crate) fn resolve(e: Parsed) -> Result<Resolved, ImportError> {
}
pub(crate) fn skip_resolve_expr(
- Parsed(expr, _root): Parsed,
+ parsed: Parsed,
) -> Result<Resolved, ImportError> {
- let resolve = |import: &Import| -> Result<Normalized, ImportError> {
- Err(ImportError::UnexpectedImport(import.clone()))
+ let mut expr = parsed.0;
+ let mut resolve = |import: Import| -> Result<Normalized, ImportError> {
+ Err(ImportError::UnexpectedImport(import))
};
- let expr = expr.traverse_resolve(resolve)?;
+ expr.traverse_resolve_mut(&mut resolve)?;
Ok(Resolved(expr))
}
@@ -131,9 +134,9 @@ mod spec_tests {
// import_success!(success_alternativeEnvNatural, "alternativeEnvNatural");
// import_success!(success_alternativeEnvSimple, "alternativeEnvSimple");
// import_success!(success_alternativeHashMismatch, "alternativeHashMismatch");
- // import_success!(success_alternativeNatural, "alternativeNatural");
- // import_success!(success_alternativeParseError, "alternativeParseError");
- // import_success!(success_alternativeTypeError, "alternativeTypeError");
+ import_success!(success_alternativeNatural, "alternativeNatural");
+ import_success!(success_alternativeParseError, "alternativeParseError");
+ import_success!(success_alternativeTypeError, "alternativeTypeError");
// import_success!(success_asLocation, "asLocation");
// import_success!(success_asText, "asText");
// import_success!(success_customHeaders, "customHeaders");