summaryrefslogtreecommitdiff
path: root/dhall/src/semantics
diff options
context:
space:
mode:
Diffstat (limited to 'dhall/src/semantics')
-rw-r--r--dhall/src/semantics/core/context.rs2
-rw-r--r--dhall/src/semantics/core/value.rs2
-rw-r--r--dhall/src/semantics/error/mod.rs178
-rw-r--r--dhall/src/semantics/mod.rs1
-rw-r--r--dhall/src/semantics/phase/mod.rs2
-rw-r--r--dhall/src/semantics/phase/parse.rs2
-rw-r--r--dhall/src/semantics/phase/resolve.rs2
-rw-r--r--dhall/src/semantics/phase/typecheck.rs2
8 files changed, 6 insertions, 185 deletions
diff --git a/dhall/src/semantics/core/context.rs b/dhall/src/semantics/core/context.rs
index 8861378..9dfd22b 100644
--- a/dhall/src/semantics/core/context.rs
+++ b/dhall/src/semantics/core/context.rs
@@ -1,10 +1,10 @@
use std::collections::HashMap;
use std::rc::Rc;
+use crate::error::TypeError;
use crate::semantics::core::value::Value;
use crate::semantics::core::value_kind::ValueKind;
use crate::semantics::core::var::{AlphaVar, Shift, Subst};
-use crate::semantics::error::TypeError;
use crate::syntax::{Label, V};
#[derive(Debug, Clone)]
diff --git a/dhall/src/semantics/core/value.rs b/dhall/src/semantics/core/value.rs
index ad0861b..9511cc2 100644
--- a/dhall/src/semantics/core/value.rs
+++ b/dhall/src/semantics/core/value.rs
@@ -1,10 +1,10 @@
use std::cell::{Ref, RefCell, RefMut};
use std::rc::Rc;
+use crate::error::{TypeError, TypeMessage};
use crate::semantics::core::context::TypecheckContext;
use crate::semantics::core::value_kind::ValueKind;
use crate::semantics::core::var::{AlphaVar, Shift, Subst};
-use crate::semantics::error::{TypeError, TypeMessage};
use crate::semantics::phase::normalize::{apply_any, normalize_whnf};
use crate::semantics::phase::typecheck::{builtin_to_value, const_to_value};
use crate::semantics::phase::{NormalizedExpr, Typed};
diff --git a/dhall/src/semantics/error/mod.rs b/dhall/src/semantics/error/mod.rs
deleted file mode 100644
index 1288c12..0000000
--- a/dhall/src/semantics/error/mod.rs
+++ /dev/null
@@ -1,178 +0,0 @@
-use std::io::Error as IOError;
-
-use crate::semantics::core::context::TypecheckContext;
-use crate::semantics::core::value::Value;
-use crate::semantics::phase::resolve::ImportStack;
-use crate::semantics::phase::NormalizedExpr;
-use crate::syntax::{BinOp, Import, Label, ParseError, Span};
-
-pub type Result<T> = std::result::Result<T, Error>;
-
-#[derive(Debug)]
-#[non_exhaustive]
-pub enum Error {
- IO(IOError),
- Parse(ParseError),
- Decode(DecodeError),
- Encode(EncodeError),
- Resolve(ImportError),
- Typecheck(TypeError),
-}
-
-#[derive(Debug)]
-pub enum ImportError {
- Recursive(Import<NormalizedExpr>, Box<Error>),
- UnexpectedImport(Import<NormalizedExpr>),
- ImportCycle(ImportStack, Import<NormalizedExpr>),
-}
-
-#[derive(Debug)]
-pub enum DecodeError {
- CBORError(serde_cbor::error::Error),
- WrongFormatError(String),
-}
-
-#[derive(Debug)]
-pub enum EncodeError {
- CBORError(serde_cbor::error::Error),
-}
-
-/// A structured type error that includes context
-#[derive(Debug)]
-pub struct TypeError {
- message: TypeMessage,
- context: TypecheckContext,
-}
-
-/// The specific type error
-#[derive(Debug)]
-pub(crate) enum TypeMessage {
- UnboundVariable(Span),
- InvalidInputType(Value),
- InvalidOutputType(Value),
- NotAFunction(Value),
- TypeMismatch(Value, Value, Value),
- AnnotMismatch(Value, Value),
- InvalidListElement(usize, Value, Value),
- InvalidListType(Value),
- InvalidOptionalType(Value),
- InvalidPredicate(Value),
- IfBranchMismatch(Value, Value),
- IfBranchMustBeTerm(bool, Value),
- InvalidFieldType(Label, Value),
- NotARecord(Label, Value),
- MustCombineRecord(Value),
- MissingRecordField(Label, Value),
- MissingUnionField(Label, Value),
- BinOpTypeMismatch(BinOp, Value),
- InvalidTextInterpolation(Value),
- Merge1ArgMustBeRecord(Value),
- Merge2ArgMustBeUnion(Value),
- MergeEmptyNeedsAnnotation,
- MergeHandlerMissingVariant(Label),
- MergeVariantMissingHandler(Label),
- MergeAnnotMismatch,
- MergeHandlerTypeMismatch,
- MergeHandlerReturnTypeMustNotBeDependent,
- ProjectionMustBeRecord,
- ProjectionMissingEntry,
- Sort,
- RecordTypeDuplicateField,
- RecordTypeMergeRequiresRecordType(Value),
- UnionTypeDuplicateField,
- EquivalenceArgumentMustBeTerm(bool, Value),
- EquivalenceTypeMismatch(Value, Value),
- AssertMismatch(Value, Value),
- AssertMustTakeEquivalence,
-}
-
-impl TypeError {
- pub(crate) fn new(
- context: &TypecheckContext,
- message: TypeMessage,
- ) -> Self {
- TypeError {
- context: context.clone(),
- message,
- }
- }
-}
-
-impl std::fmt::Display for TypeError {
- fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
- use TypeMessage::*;
- let msg = match &self.message {
- UnboundVariable(span) => span.error("Type error: Unbound variable"),
- InvalidInputType(v) => {
- v.span().error("Type error: Invalid function input")
- }
- InvalidOutputType(v) => {
- v.span().error("Type error: Invalid function output")
- }
- NotAFunction(v) => v.span().error("Type error: Not a function"),
- TypeMismatch(x, y, z) => {
- x.span()
- .error("Type error: Wrong type of function argument")
- + "\n"
- + &z.span().error(format!(
- "This argument has type {:?}",
- z.get_type().unwrap()
- ))
- + "\n"
- + &y.span().error(format!(
- "But the function expected an argument of type {:?}",
- y
- ))
- }
- _ => "Type error: Unhandled error".to_string(),
- };
- write!(f, "{}", msg)
- }
-}
-
-impl std::error::Error for TypeError {}
-
-impl std::fmt::Display for Error {
- fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
- match self {
- Error::IO(err) => write!(f, "{}", err),
- Error::Parse(err) => write!(f, "{}", err),
- Error::Decode(err) => write!(f, "{:?}", err),
- Error::Encode(err) => write!(f, "{:?}", err),
- Error::Resolve(err) => write!(f, "{:?}", err),
- Error::Typecheck(err) => write!(f, "{}", err),
- }
- }
-}
-
-impl std::error::Error for Error {}
-impl From<IOError> for Error {
- fn from(err: IOError) -> Error {
- Error::IO(err)
- }
-}
-impl From<ParseError> for Error {
- fn from(err: ParseError) -> Error {
- Error::Parse(err)
- }
-}
-impl From<DecodeError> for Error {
- fn from(err: DecodeError) -> Error {
- Error::Decode(err)
- }
-}
-impl From<EncodeError> for Error {
- fn from(err: EncodeError) -> Error {
- Error::Encode(err)
- }
-}
-impl From<ImportError> for Error {
- fn from(err: ImportError) -> Error {
- Error::Resolve(err)
- }
-}
-impl From<TypeError> for Error {
- fn from(err: TypeError) -> Error {
- Error::Typecheck(err)
- }
-}
diff --git a/dhall/src/semantics/mod.rs b/dhall/src/semantics/mod.rs
index 6438408..1eeef86 100644
--- a/dhall/src/semantics/mod.rs
+++ b/dhall/src/semantics/mod.rs
@@ -1,4 +1,3 @@
pub mod core;
-pub mod error;
pub mod phase;
pub mod to_expr;
diff --git a/dhall/src/semantics/phase/mod.rs b/dhall/src/semantics/phase/mod.rs
index 6229d15..9359c0b 100644
--- a/dhall/src/semantics/phase/mod.rs
+++ b/dhall/src/semantics/phase/mod.rs
@@ -1,10 +1,10 @@
use std::fmt::Display;
use std::path::Path;
+use crate::error::{EncodeError, Error, ImportError, TypeError};
use crate::semantics::core::value::Value;
use crate::semantics::core::value_kind::ValueKind;
use crate::semantics::core::var::{AlphaVar, Shift, Subst};
-use crate::semantics::error::{EncodeError, Error, ImportError, TypeError};
use crate::semantics::to_expr::ToExprOptions;
use crate::syntax::binary;
use crate::syntax::{Builtin, Const, Expr};
diff --git a/dhall/src/semantics/phase/parse.rs b/dhall/src/semantics/phase/parse.rs
index 4c8ad7b..00db422 100644
--- a/dhall/src/semantics/phase/parse.rs
+++ b/dhall/src/semantics/phase/parse.rs
@@ -2,7 +2,7 @@ use std::fs::File;
use std::io::Read;
use std::path::Path;
-use crate::semantics::error::Error;
+use crate::error::Error;
use crate::semantics::phase::resolve::ImportRoot;
use crate::semantics::phase::Parsed;
use crate::syntax::binary;
diff --git a/dhall/src/semantics/phase/resolve.rs b/dhall/src/semantics/phase/resolve.rs
index 86dc7ae..cc4a024 100644
--- a/dhall/src/semantics/phase/resolve.rs
+++ b/dhall/src/semantics/phase/resolve.rs
@@ -1,7 +1,7 @@
use std::collections::HashMap;
use std::path::{Path, PathBuf};
-use crate::semantics::error::{Error, ImportError};
+use crate::error::{Error, ImportError};
use crate::semantics::phase::{Normalized, NormalizedExpr, Parsed, Resolved};
use crate::syntax;
use crate::syntax::{FilePath, ImportLocation, URL};
diff --git a/dhall/src/semantics/phase/typecheck.rs b/dhall/src/semantics/phase/typecheck.rs
index 96a0b4b..5041235 100644
--- a/dhall/src/semantics/phase/typecheck.rs
+++ b/dhall/src/semantics/phase/typecheck.rs
@@ -1,11 +1,11 @@
use std::cmp::max;
use std::collections::HashMap;
+use crate::error::{TypeError, TypeMessage};
use crate::semantics::core::context::TypecheckContext;
use crate::semantics::core::value::Value;
use crate::semantics::core::value_kind::ValueKind;
use crate::semantics::core::var::{Shift, Subst};
-use crate::semantics::error::{TypeError, TypeMessage};
use crate::semantics::phase::normalize::merge_maps;
use crate::semantics::phase::Normalized;
use crate::syntax;