summaryrefslogtreecommitdiff
path: root/dhall
diff options
context:
space:
mode:
authorFintan Halpenny2019-09-06 12:43:52 +0200
committerFintan Halpenny2019-09-06 12:43:52 +0200
commit4424d3ece5db10527ae446a685a579ae768ef943 (patch)
tree688d29c25f12c2c5347e3d24db8b9b7fb83c7b04 /dhall
parent52c91e08db68e05f760ebfd465b84fe4107731df (diff)
parentbcaeab3b7b114d8782be9589ad673ab9ab8c59fd (diff)
Merge remote-tracking branch 'origin/master' into fintan/canonicalize
Diffstat (limited to 'dhall')
-rw-r--r--dhall/src/core/value.rs11
-rw-r--r--dhall/src/core/valuef.rs27
-rw-r--r--dhall/src/core/var.rs12
-rw-r--r--dhall/src/phase/mod.rs4
-rw-r--r--dhall/src/phase/resolve.rs41
5 files changed, 33 insertions, 62 deletions
diff --git a/dhall/src/core/value.rs b/dhall/src/core/value.rs
index 3cccb1d..b4b6b08 100644
--- a/dhall/src/core/value.rs
+++ b/dhall/src/core/value.rs
@@ -212,17 +212,6 @@ impl Value {
WHNF | NF => {}
}
}
- pub(crate) fn normalize_nf(&self) {
- let borrow = self.as_internal();
- match borrow.form {
- Unevaled | WHNF => {
- drop(borrow);
- self.as_internal_mut().normalize_nf();
- }
- // Already in NF
- NF => {}
- }
- }
pub(crate) fn app(&self, v: Value) -> Value {
let body_t = match &*self.get_type_not_sort().as_whnf() {
diff --git a/dhall/src/core/valuef.rs b/dhall/src/core/valuef.rs
index 7ecec86..4e457e6 100644
--- a/dhall/src/core/valuef.rs
+++ b/dhall/src/core/valuef.rs
@@ -110,17 +110,11 @@ impl ValueF {
ValueF::UnionConstructor(l.clone(), kts.clone()).to_expr(opts),
v.to_expr(opts),
)),
- ValueF::TextLit(elts) => {
- use InterpolatedTextContents::{Expr, Text};
- rc(ExprF::TextLit(
- elts.iter()
- .map(|contents| match contents {
- Expr(e) => Expr(e.to_expr(opts)),
- Text(s) => Text(s.clone()),
- })
- .collect(),
- ))
- }
+ ValueF::TextLit(elts) => rc(ExprF::TextLit(
+ elts.iter()
+ .map(|contents| contents.map_ref(|e| e.to_expr(opts)))
+ .collect(),
+ )),
ValueF::Equivalence(x, y) => rc(ExprF::BinOp(
dhall_syntax::BinOp::Equivalence,
x.to_expr(opts),
@@ -187,11 +181,7 @@ impl ValueF {
}
ValueF::TextLit(elts) => {
for x in elts.iter_mut() {
- use InterpolatedTextContents::{Expr, Text};
- match x {
- Expr(n) => n.normalize_mut(),
- Text(_) => {}
- }
+ x.map_mut(Value::normalize_mut);
}
}
ValueF::Equivalence(x, y) => {
@@ -199,10 +189,7 @@ impl ValueF {
y.normalize_mut();
}
ValueF::PartialExpr(e) => {
- // TODO: need map_mut
- e.map_ref(|v| {
- v.normalize_nf();
- });
+ e.map_mut(Value::normalize_mut);
}
}
}
diff --git a/dhall/src/core/var.rs b/dhall/src/core/var.rs
index ce4d137..3795f10 100644
--- a/dhall/src/core/var.rs
+++ b/dhall/src/core/var.rs
@@ -224,11 +224,7 @@ where
impl<T: Shift> Shift for dhall_syntax::InterpolatedTextContents<T> {
fn shift(&self, delta: isize, var: &AlphaVar) -> Option<Self> {
- use dhall_syntax::InterpolatedTextContents::{Expr, Text};
- Some(match self {
- Expr(x) => Expr(x.shift(delta, var)?),
- Text(s) => Text(s.clone()),
- })
+ Some(self.traverse_ref(|x| Ok(x.shift(delta, var)?))?)
}
}
@@ -283,11 +279,7 @@ impl<S, T: Subst<S>> Subst<S> for Vec<T> {
impl<S, T: Subst<S>> Subst<S> for dhall_syntax::InterpolatedTextContents<T> {
fn subst_shift(&self, var: &AlphaVar, val: &S) -> Self {
- use dhall_syntax::InterpolatedTextContents::{Expr, Text};
- match self {
- Expr(x) => Expr(x.subst_shift(var, val)),
- Text(s) => Text(s.clone()),
- }
+ self.map_ref(|x| x.subst_shift(var, val))
}
}
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 4034a5c..cccc7a7 100644
--- a/dhall/src/phase/resolve.rs
+++ b/dhall/src/phase/resolve.rs
@@ -59,18 +59,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
@@ -78,16 +76,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))
}
@@ -96,12 +98,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))
}
@@ -201,9 +204,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");