diff options
author | Nadrieril Feneanar | 2019-09-03 17:29:49 +0200 |
---|---|---|
committer | GitHub | 2019-09-03 17:29:49 +0200 |
commit | b263635ce54a28dc4598e0f2832a456eca7521fa (patch) | |
tree | 06377aaa05944f90280cc9eb6be1847c1a1cf01b /dhall/src/phase | |
parent | 249f31c030dc8cf8c2c8065409b3f7e87639aad3 (diff) | |
parent | d0cc3ceb96870a6d951aab5afec1140404e67492 (diff) |
Merge pull request #111 from Nadrieril/resolve-mut
Resolve imports by mutating Expr instead of cloning it
Diffstat (limited to '')
-rw-r--r-- | dhall/src/phase/mod.rs | 4 | ||||
-rw-r--r-- | dhall/src/phase/resolve.rs | 41 |
2 files changed, 24 insertions, 21 deletions
diff --git a/dhall/src/phase/mod.rs b/dhall/src/phase/mod.rs index 2c5505c..337ce3d 100644 --- a/dhall/src/phase/mod.rs +++ b/dhall/src/phase/mod.rs @@ -16,8 +16,8 @@ pub(crate) mod parse; pub(crate) mod resolve; pub(crate) mod typecheck; -pub type ParsedExpr = Expr<!>; -pub type DecodedExpr = Expr<!>; +pub type ParsedExpr = Expr<Normalized>; +pub type DecodedExpr = Expr<Normalized>; pub type ResolvedExpr = Expr<Normalized>; pub type NormalizedExpr = Expr<Normalized>; 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"); |