From 08e1d8ece4314b56d64fa08595c2e043b97896d1 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Mon, 6 Apr 2020 17:19:31 +0100 Subject: Split off operations from main expr enum --- dhall/src/semantics/resolve/resolve.rs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'dhall/src/semantics/resolve') diff --git a/dhall/src/semantics/resolve/resolve.rs b/dhall/src/semantics/resolve/resolve.rs index 6e50fa6..3e0022f 100644 --- a/dhall/src/semantics/resolve/resolve.rs +++ b/dhall/src/semantics/resolve/resolve.rs @@ -11,7 +11,7 @@ use crate::syntax; use crate::syntax::map::DupTreeMap; use crate::syntax::{ BinOp, Builtin, Expr, ExprKind, FilePath, FilePrefix, Hash, ImportMode, - ImportTarget, Span, UnspannedExpr, URL, + ImportTarget, OpKind, Span, UnspannedExpr, URL, }; use crate::{Parsed, Resolved}; @@ -179,12 +179,13 @@ impl ImportLocation { }; let asloc_ty = make_aslocation_uniontype(); - let expr = mkexpr(ExprKind::Field(asloc_ty, field_name.into())); + let expr = + mkexpr(ExprKind::Op(OpKind::Field(asloc_ty, field_name.into()))); match arg { - Some(arg) => mkexpr(ExprKind::App( + Some(arg) => mkexpr(ExprKind::Op(OpKind::App( expr, mkexpr(ExprKind::TextLit(arg.into())), - )), + ))), None => expr, } } @@ -261,21 +262,21 @@ fn resolve_one_import( /// Desugar the first level of the expression. fn desugar(expr: &Expr) -> Cow<'_, Expr> { match expr.kind() { - ExprKind::Completion(ty, compl) => { + ExprKind::Op(OpKind::Completion(ty, compl)) => { let ty_field_default = Expr::new( - ExprKind::Field(ty.clone(), "default".into()), + ExprKind::Op(OpKind::Field(ty.clone(), "default".into())), expr.span(), ); let merged = Expr::new( - ExprKind::BinOp( + ExprKind::Op(OpKind::BinOp( BinOp::RightBiasedRecordMerge, ty_field_default, compl.clone(), - ), + )), expr.span(), ); let ty_field_type = Expr::new( - ExprKind::Field(ty.clone(), "Type".into()), + ExprKind::Op(OpKind::Field(ty.clone(), "Type".into())), expr.span(), ); Cow::Owned(Expr::new( @@ -304,7 +305,7 @@ fn traverse_resolve_expr( .format(), )?, }, - ExprKind::BinOp(BinOp::ImportAlt, l, r) => { + ExprKind::Op(OpKind::BinOp(BinOp::ImportAlt, l, r)) => { match traverse_resolve_expr(name_env, l, f) { Ok(l) => l, Err(_) => { -- cgit v1.3.1 From fff4c46e09d4edf25eba737f4d71bfdb1dbf4a82 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Mon, 6 Apr 2020 22:11:54 +0100 Subject: Extract operation-related code to a new module --- dhall/src/lib.rs | 1 + dhall/src/operations.rs | 865 +++++++++++++++++++++++++++++++++ dhall/src/semantics/builtins.rs | 5 +- dhall/src/semantics/nze/nir.rs | 3 +- dhall/src/semantics/nze/normalize.rs | 301 +----------- dhall/src/semantics/resolve/resolve.rs | 3 +- dhall/src/semantics/tck/typecheck.rs | 515 +------------------- dhall/src/syntax/ast/expr.rs | 65 +-- dhall/src/syntax/binary/decode.rs | 3 +- dhall/src/syntax/binary/encode.rs | 5 +- dhall/src/syntax/text/parser.rs | 2 +- dhall/src/syntax/text/printer.rs | 11 +- serde_dhall/src/value.rs | 3 +- 13 files changed, 900 insertions(+), 882 deletions(-) create mode 100644 dhall/src/operations.rs (limited to 'dhall/src/semantics/resolve') diff --git a/dhall/src/lib.rs b/dhall/src/lib.rs index 98ad4f0..e00177c 100644 --- a/dhall/src/lib.rs +++ b/dhall/src/lib.rs @@ -11,6 +11,7 @@ mod tests; pub mod error; +pub mod operations; pub mod semantics; pub mod syntax; diff --git a/dhall/src/operations.rs b/dhall/src/operations.rs new file mode 100644 index 0000000..363cd10 --- /dev/null +++ b/dhall/src/operations.rs @@ -0,0 +1,865 @@ +use itertools::Itertools; +use std::borrow::Cow; +use std::cmp::max; +use std::collections::HashMap; + +use crate::error::{ErrorBuilder, TypeError}; +use crate::semantics::{ + merge_maps, mk_span_err, mkerr, ret_kind, ret_op, ret_ref, Binder, Closure, + Hir, HirKind, Nir, NirKind, Ret, TextLit, Tir, TyEnv, Type, +}; +use crate::syntax::map::DupTreeSet; +use crate::syntax::{ + trivial_result, BinOp, Builtin, Const, ExprKind, Label, NumKind, Span, +}; + +/// Operations +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum OpKind { + /// `f a` + App(SubExpr, SubExpr), + /// Binary operations + BinOp(BinOp, SubExpr, SubExpr), + /// `if x then y else z` + BoolIf(SubExpr, SubExpr, SubExpr), + /// `merge x y : t` + Merge(SubExpr, SubExpr, Option), + /// `toMap x : t` + ToMap(SubExpr, Option), + /// `e.x` + Field(SubExpr, Label), + /// `e.{ x, y, z }` + Projection(SubExpr, DupTreeSet