summaryrefslogtreecommitdiff
path: root/dhall
diff options
context:
space:
mode:
authorNadrieril2020-02-17 18:06:34 +0000
committerNadrieril2020-02-17 18:06:34 +0000
commit06714f925a6588ef5c262bb7a9cf3f9e40f13120 (patch)
treec4fa4f953fa6563af405ebe7c4b2461c7118a45a /dhall
parent8da4445e6d06cf79d43112042b69c798f86884f3 (diff)
Factor out desugaring from resolve
Diffstat (limited to 'dhall')
-rw-r--r--dhall/src/semantics/resolve/resolve.rs53
1 files changed, 31 insertions, 22 deletions
diff --git a/dhall/src/semantics/resolve/resolve.rs b/dhall/src/semantics/resolve/resolve.rs
index e3db014..22fb1a0 100644
--- a/dhall/src/semantics/resolve/resolve.rs
+++ b/dhall/src/semantics/resolve/resolve.rs
@@ -1,3 +1,4 @@
+use std::borrow::Cow;
use std::path::{Path, PathBuf};
use crate::error::ErrorBuilder;
@@ -49,6 +50,35 @@ fn load_import(env: &mut ImportEnv, f: &Path) -> Result<Hir, Error> {
.to_hir())
}
+/// Desugar the first level of the expression.
+fn desugar(expr: &Expr) -> Cow<'_, Expr> {
+ match expr.kind() {
+ ExprKind::Completion(ty, compl) => {
+ let ty_field_default = Expr::new(
+ ExprKind::Field(ty.clone(), "default".into()),
+ expr.span(),
+ );
+ let merged = Expr::new(
+ ExprKind::BinOp(
+ BinOp::RightBiasedRecordMerge,
+ ty_field_default,
+ compl.clone(),
+ ),
+ expr.span(),
+ );
+ let ty_field_type = Expr::new(
+ ExprKind::Field(ty.clone(), "Type".into()),
+ expr.span(),
+ );
+ Cow::Owned(Expr::new(
+ ExprKind::Annot(merged, ty_field_type),
+ expr.span(),
+ ))
+ }
+ _ => Cow::Borrowed(expr),
+ }
+}
+
/// Traverse the expression, handling import alternatives and passing
/// found imports to the provided function. Also resolving names.
fn traverse_resolve_expr(
@@ -56,6 +86,7 @@ fn traverse_resolve_expr(
expr: &Expr,
f: &mut impl FnMut(Import) -> Result<Hir, Error>,
) -> Result<Hir, Error> {
+ let expr = desugar(expr);
Ok(match expr.kind() {
ExprKind::Var(var) => match name_env.unlabel_var(&var) {
Some(v) => Hir::new(HirKind::Var(v), expr.span()),
@@ -77,28 +108,6 @@ fn traverse_resolve_expr(
}
}
}
- // Desugar
- ExprKind::Completion(ty, compl) => {
- let ty_field_default = Expr::new(
- ExprKind::Field(ty.clone(), "default".into()),
- expr.span(),
- );
- let merged = Expr::new(
- ExprKind::BinOp(
- BinOp::RightBiasedRecordMerge,
- ty_field_default,
- compl.clone(),
- ),
- expr.span(),
- );
- let ty_field_type = Expr::new(
- ExprKind::Field(ty.clone(), "Type".into()),
- expr.span(),
- );
- let desugared =
- Expr::new(ExprKind::Annot(merged, ty_field_type), expr.span());
- traverse_resolve_expr(name_env, &desugared, f)?
- }
kind => {
let kind = kind.traverse_ref_maybe_binder(|l, e| {
if let Some(l) = l {