From f5d2151d35942b957230c3081a928af3619d9400 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Sun, 31 Mar 2019 18:47:34 +0200 Subject: Make SubExpr a newtype --- dhall_generator/src/dhall_expr.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'dhall_generator/src') diff --git a/dhall_generator/src/dhall_expr.rs b/dhall_generator/src/dhall_expr.rs index 41e558b..e2187d6 100644 --- a/dhall_generator/src/dhall_expr.rs +++ b/dhall_generator/src/dhall_expr.rs @@ -4,7 +4,6 @@ use dhall_core::*; use proc_macro2::TokenStream; use quote::quote; use std::collections::BTreeMap; -use std::rc::Rc; pub fn dhall_expr(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let input_str = input.to_string(); @@ -17,7 +16,7 @@ pub fn dhall_expr(input: proc_macro::TokenStream) -> proc_macro::TokenStream { } // Returns an expression of type Expr<_, _>. Expects interpolated variables -// to be of type Rc>. +// to be of type SubExpr<_, _>. fn dhall_to_tokenstream( expr: &DhallExpr, ctx: &Context, @@ -97,7 +96,7 @@ fn dhall_to_tokenstream( } } -// Returns an expression of type Rc> +// Returns an expression of type SubExpr<_, _> fn dhall_to_tokenstream_bx( expr: &DhallExpr, ctx: &Context, @@ -146,7 +145,7 @@ fn label_to_tokenstream(l: &Label) -> TokenStream { } fn map_to_tokenstream( - m: &BTreeMap>>, + m: &BTreeMap>, ctx: &Context, ) -> TokenStream { let (keys, values): (Vec, Vec) = m -- cgit v1.3.1 From bfe3f7f75570540fa184a133653d16e86f22667a Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Sun, 31 Mar 2019 18:47:57 +0200 Subject: rustfmt --- dhall/tests/dhall_type.rs | 5 +---- dhall_generator/src/dhall_type.rs | 4 +--- iter_patterns/src/lib.rs | 3 ++- 3 files changed, 4 insertions(+), 8 deletions(-) (limited to 'dhall_generator/src') diff --git a/dhall/tests/dhall_type.rs b/dhall/tests/dhall_type.rs index faece20..941e3a4 100644 --- a/dhall/tests/dhall_type.rs +++ b/dhall/tests/dhall_type.rs @@ -33,10 +33,7 @@ fn test_dhall_type() { #[derive(Type)] #[allow(dead_code)] struct C(T, Option); - assert_eq!( - >::get_type(), - <(bool, Option)>::get_type() - ); + assert_eq!(>::get_type(), <(bool, Option)>::get_type()); #[derive(Type)] #[allow(dead_code)] diff --git a/dhall_generator/src/dhall_type.rs b/dhall_generator/src/dhall_type.rs index ac8eb4e..270c27c 100644 --- a/dhall_generator/src/dhall_type.rs +++ b/dhall_generator/src/dhall_type.rs @@ -168,9 +168,7 @@ pub fn derive_type_inner( // Ensure that all the fields have a Type impl let mut where_clause = orig_where_clause.clone(); for ty in constraints.iter() { - where_clause - .predicates - .push(parse_quote!(#ty: dhall::Type)); + where_clause.predicates.push(parse_quote!(#ty: dhall::Type)); } let ident = &input.ident; diff --git a/iter_patterns/src/lib.rs b/iter_patterns/src/lib.rs index a4be783..53ebcd2 100644 --- a/iter_patterns/src/lib.rs +++ b/iter_patterns/src/lib.rs @@ -36,7 +36,8 @@ macro_rules! destructure_iter { ) }; // Special variable length pattern with a common unary variant - (@match_forwards, $iter:expr, ($body:expr), $variant:ident ($x:ident).., $($rest:tt)*) => { + (@match_forwards, $iter:expr, ($body:expr), + $variant:ident ($x:ident).., $($rest:tt)*) => { $crate::destructure_iter!(@match_backwards, $iter, ({ -- cgit v1.3.1 From 7374d0524ccd53b256107667b213597c05720d2d Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Sun, 31 Mar 2019 19:08:08 +0200 Subject: Move recursion out of Expr --- dhall/src/binary.rs | 4 +- dhall/src/normalize.rs | 6 +- dhall/src/typecheck.rs | 6 +- dhall/tests/common/mod.rs | 2 +- dhall_core/src/core.rs | 76 +++++++---------- dhall_core/src/parser.rs | 172 +++++++++++++++++++------------------- dhall_core/src/printer.rs | 8 +- dhall_core/src/text.rs | 37 ++++---- dhall_generator/src/dhall_expr.rs | 36 ++++---- dhall_generator/src/dhall_type.rs | 4 +- 10 files changed, 170 insertions(+), 181 deletions(-) (limited to 'dhall_generator/src') diff --git a/dhall/src/binary.rs b/dhall/src/binary.rs index 988891b..1ba1873 100644 --- a/dhall/src/binary.rs +++ b/dhall/src/binary.rs @@ -20,10 +20,10 @@ pub fn decode(data: &[u8]) -> Result { fn cbor_value_to_dhall(data: &cbor::Value) -> Result { use cbor::Value::*; use dhall_core::{BinOp, Builtin, Const}; - use Expr::*; + use ExprF::*; Ok(rc(match data { String(s) => match Builtin::parse(s) { - Some(b) => Expr::Builtin(b), + Some(b) => ExprF::Builtin(b), None => match s.as_str() { "True" => BoolLit(true), "False" => BoolLit(false), diff --git a/dhall/src/normalize.rs b/dhall/src/normalize.rs index 5405e88..c6c294c 100644 --- a/dhall/src/normalize.rs +++ b/dhall/src/normalize.rs @@ -12,7 +12,7 @@ where A: fmt::Debug, { use dhall_core::Builtin::*; - use dhall_core::Expr::*; + use dhall_core::ExprF::*; let f = rc(Builtin(b)); // How many arguments a builtin needs, and which argument // should be normalized and pattern-matched @@ -199,7 +199,7 @@ where // Put the remaining arguments back and eval again. In most cases // ret will not be of a form that can be applied, so this won't go very deep. // In lots of cases, there are no remaining args so this cann will just return ret. - normalize_whnf(&rc(Expr::App(ret, args.split_off(len_consumption)))) + normalize_whnf(&rc(ExprF::App(ret, args.split_off(len_consumption)))) } /// Reduce an expression to its weak head normal form, i.e. normalize @@ -213,7 +213,7 @@ where A: fmt::Debug, { use dhall_core::BinOp::*; - use dhall_core::Expr::*; + use dhall_core::ExprF::*; match e.as_ref() { Let(f, _, r, b) => { let vf0 = &V(f.clone(), 0); diff --git a/dhall/src/typecheck.rs b/dhall/src/typecheck.rs index e769c7f..31702db 100644 --- a/dhall/src/typecheck.rs +++ b/dhall/src/typecheck.rs @@ -12,7 +12,7 @@ use self::TypeMessage::*; fn axiom(c: Const) -> Result> { use dhall_core::Const::*; - use dhall_core::Expr::*; + use dhall_core::ExprF::*; match c { Type => Ok(Kind), Kind => Err(TypeError::new(&Context::new(), rc(Const(Kind)), Untyped)), @@ -53,7 +53,7 @@ where S: ::std::fmt::Debug, T: ::std::fmt::Debug, { - use dhall_core::Expr::*; + use dhall_core::ExprF::*; fn go( ctx: &mut Vec<(Label, Label)>, el: &Expr, @@ -192,7 +192,7 @@ where use dhall_core::BinOp::*; use dhall_core::Builtin::*; use dhall_core::Const::*; - use dhall_core::Expr::*; + use dhall_core::ExprF::*; let mkerr = |msg: TypeMessage<_>| TypeError::new(ctx, e.clone(), msg); let ensure_const = |x: &SubExpr<_, _>, msg: TypeMessage<_>| match x.as_ref() { diff --git a/dhall/tests/common/mod.rs b/dhall/tests/common/mod.rs index 6b893e0..325b80f 100644 --- a/dhall/tests/common/mod.rs +++ b/dhall/tests/common/mod.rs @@ -111,7 +111,7 @@ pub fn run_test(base_path: &str, feature: Feature) { let expected_file_path = base_path + "B.dhall"; let expr = rc(read_dhall_file(&expr_file_path).unwrap()); let expected = rc(read_dhall_file(&expected_file_path).unwrap()); - typecheck::type_of(rc(Expr::Annot(expr, expected))).unwrap(); + typecheck::type_of(rc(ExprF::Annot(expr, expected))).unwrap(); } } } diff --git a/dhall_core/src/core.rs b/dhall_core/src/core.rs index b49515a..2d11068 100644 --- a/dhall_core/src/core.rs +++ b/dhall_core/src/core.rs @@ -173,43 +173,39 @@ pub type DhallExpr = ResolvedExpr; #[derive(Debug, PartialEq, Eq)] pub struct SubExpr(pub Rc>); +pub type Expr = ExprF, Note, Embed>; + /// Syntax tree for expressions +// Having the recursion out of the enum definition enables writing +// much more generic code and improves pattern-matching behind +// smart pointers. #[derive(Debug, Clone, PartialEq, Eq)] -pub enum Expr { +pub enum ExprF { /// `Const c ~ c` Const(Const), /// `Var (V x 0) ~ x`
/// `Var (V x n) ~ x@n` Var(V), /// `Lam x A b ~ λ(x : A) -> b` - Lam(Label, SubExpr, SubExpr), + Lam(Label, SubExpr, SubExpr), /// `Pi "_" A B ~ A -> B` /// `Pi x A B ~ ∀(x : A) -> B` - Pi(Label, SubExpr, SubExpr), + Pi(Label, SubExpr, SubExpr), /// `App f A ~ f A` - App(SubExpr, Vec>), + App(SubExpr, Vec), /// `Let x Nothing r e ~ let x = r in e` /// `Let x (Just t) r e ~ let x : t = r in e` - Let( - Label, - Option>, - SubExpr, - SubExpr, - ), + Let(Label, Option, SubExpr, SubExpr), /// `Annot x t ~ x : t` - Annot(SubExpr, SubExpr), + Annot(SubExpr, SubExpr), /// Built-in values Builtin(Builtin), // Binary operations - BinOp(BinOp, SubExpr, SubExpr), + BinOp(BinOp, SubExpr, SubExpr), /// `BoolLit b ~ b` BoolLit(bool), /// `BoolIf x y z ~ if x then y else z` - BoolIf( - SubExpr, - SubExpr, - SubExpr, - ), + BoolIf(SubExpr, SubExpr, SubExpr), /// `NaturalLit n ~ +n` NaturalLit(Natural), /// `IntegerLit n ~ n` @@ -217,39 +213,31 @@ pub enum Expr { /// `DoubleLit n ~ n` DoubleLit(Double), /// `TextLit t ~ t` - TextLit(InterpolatedText), + TextLit(InterpolatedText), /// [] : List t` - EmptyListLit(SubExpr), + EmptyListLit(SubExpr), /// [x, y, z] - NEListLit(Vec>), + NEListLit(Vec), /// None t - EmptyOptionalLit(SubExpr), + EmptyOptionalLit(SubExpr), /// Some e - NEOptionalLit(SubExpr), + NEOptionalLit(SubExpr), /// `Record [(k1, t1), (k2, t2)] ~ { k1 : t1, k2 : t1 }` - RecordType(BTreeMap>), + RecordType(BTreeMap), /// `RecordLit [(k1, v1), (k2, v2)] ~ { k1 = v1, k2 = v2 }` - RecordLit(BTreeMap>), + RecordLit(BTreeMap), /// `Union [(k1, t1), (k2, t2)] ~ < k1 : t1, k2 : t2 >` - UnionType(BTreeMap>), + UnionType(BTreeMap), /// `UnionLit (k1, v1) [(k2, t2), (k3, t3)] ~ < k1 = t1, k2 : t2, k3 : t3 >` - UnionLit( - Label, - SubExpr, - BTreeMap>, - ), + UnionLit(Label, SubExpr, BTreeMap), /// `Merge x y t ~ merge x y : t` - Merge( - SubExpr, - SubExpr, - Option>, - ), + Merge(SubExpr, SubExpr, Option), /// e.x - Field(SubExpr, Label), + Field(SubExpr, Label), /// e.{ x, y, z } - Projection(SubExpr, Vec