From 4b29fa3a9e329814c98df3463841eeb288f1630c Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Tue, 17 Mar 2020 23:47:35 +0000 Subject: Remove never_type feature --- dhall/src/lib.rs | 1 - dhall/src/semantics/nze/normalize.rs | 27 ++++++++++++++------------- dhall/src/semantics/tck/typecheck.rs | 4 +--- dhall/src/syntax/ast/expr.rs | 6 ++++-- 4 files changed, 19 insertions(+), 19 deletions(-) (limited to 'dhall') diff --git a/dhall/src/lib.rs b/dhall/src/lib.rs index d7d7f05..058411c 100644 --- a/dhall/src/lib.rs +++ b/dhall/src/lib.rs @@ -1,5 +1,4 @@ #![doc(html_root_url = "https://docs.rs/dhall/0.3.0")] -#![feature(never_type)] #![allow( clippy::int_plus_one, // Comes from pest_consume macro clippy::module_inception, diff --git a/dhall/src/semantics/nze/normalize.rs b/dhall/src/semantics/nze/normalize.rs index 08e3e87..79d55e8 100644 --- a/dhall/src/semantics/nze/normalize.rs +++ b/dhall/src/semantics/nze/normalize.rs @@ -58,20 +58,21 @@ pub(crate) fn squash_textlit( ret } -pub(crate) fn merge_maps( +pub(crate) fn merge_maps( map1: &HashMap, map2: &HashMap, mut f: F, -) -> Result, Err> +) -> HashMap where - F: FnMut(&K, &V, &V) -> Result, + F: FnMut(&K, &V, &V) -> V, K: std::hash::Hash + Eq + Clone, V: Clone, { let mut kvs = HashMap::new(); for (x, v2) in map2 { let newv = if let Some(v1) = map1.get(x) { - f(x, v1, v2)? + // Collision: the key is present in both maps + f(x, v1, v2) } else { v2.clone() }; @@ -81,7 +82,7 @@ where // Insert only if key not already present kvs.entry(x.clone()).or_insert_with(|| v1.clone()); } - Ok(kvs) + kvs } // Small helper enum to avoid repetition @@ -175,29 +176,29 @@ fn apply_binop<'a>(o: BinOp, x: &'a Nir, y: &'a Nir) -> Option> { Ret::NirRef(y) } (RecursiveRecordMerge, RecordLit(kvs1), RecordLit(kvs2)) => { - let kvs = merge_maps::<_, _, _, !>(kvs1, kvs2, |_, v1, v2| { - Ok(Nir::from_partial_expr(ExprKind::BinOp( + let kvs = merge_maps(kvs1, kvs2, |_, v1, v2| { + Nir::from_partial_expr(ExprKind::BinOp( RecursiveRecordMerge, v1.clone(), v2.clone(), - ))) - })?; + )) + }); Ret::NirKind(RecordLit(kvs)) } (RecursiveRecordTypeMerge, RecordType(kts_x), RecordType(kts_y)) => { - let kts = merge_maps::<_, _, _, !>( + let kts = merge_maps( kts_x, kts_y, // If the Label exists for both records, then we hit the recursive case. |_, l: &Nir, r: &Nir| { - Ok(Nir::from_partial_expr(ExprKind::BinOp( + Nir::from_partial_expr(ExprKind::BinOp( RecursiveRecordTypeMerge, l.clone(), r.clone(), - ))) + )) }, - )?; + ); Ret::NirKind(RecordType(kts)) } diff --git a/dhall/src/semantics/tck/typecheck.rs b/dhall/src/semantics/tck/typecheck.rs index 365df25..173b76d 100644 --- a/dhall/src/semantics/tck/typecheck.rs +++ b/dhall/src/semantics/tck/typecheck.rs @@ -346,9 +346,7 @@ fn type_one_layer( // Union the two records, prefering // the values found in the RHS. - let kts = merge_maps::<_, _, _, !>(kts_x, kts_y, |_, _, r_t| { - Ok(r_t.clone()) - })?; + let kts = merge_maps(kts_x, kts_y, |_, _, r_t| r_t.clone()); let u = max(x.ty().ty(), y.ty().ty()); Nir::from_kind(NirKind::RecordType(kts)).to_type(u) diff --git a/dhall/src/syntax/ast/expr.rs b/dhall/src/syntax/ast/expr.rs index ce0a3d2..8023771 100644 --- a/dhall/src/syntax/ast/expr.rs +++ b/dhall/src/syntax/ast/expr.rs @@ -257,10 +257,12 @@ impl Expr { } } -pub fn trivial_result(x: Result) -> T { +// Empty enum to indicate that no error can occur +enum X {} +fn trivial_result(x: Result) -> T { match x { Ok(x) => x, - Err(e) => e, + Err(e) => match e {}, } } -- cgit v1.2.3