diff options
| author | Nadrieril | 2020-12-06 21:41:03 +0000 | 
|---|---|---|
| committer | Nadrieril | 2020-12-07 19:34:38 +0000 | 
| commit | 6287b7a7f9e421877ee13fefa586395fec844c99 (patch) | |
| tree | 65129001dbd7e56561df656dc8eee8f441a05b25 /dhall/src/semantics | |
| parent | 9991bd4891774c4dd598decae02ee860554d2ab7 (diff) | |
Thread cx through typecheck
Diffstat (limited to 'dhall/src/semantics')
| -rw-r--r-- | dhall/src/semantics/resolve/hir.rs | 9 | ||||
| -rw-r--r-- | dhall/src/semantics/resolve/resolve.rs | 6 | ||||
| -rw-r--r-- | dhall/src/semantics/tck/env.rs | 16 | ||||
| -rw-r--r-- | dhall/src/semantics/tck/typecheck.rs | 19 | 
4 files changed, 33 insertions, 17 deletions
diff --git a/dhall/src/semantics/resolve/hir.rs b/dhall/src/semantics/resolve/hir.rs index 8869915..c2d1883 100644 --- a/dhall/src/semantics/resolve/hir.rs +++ b/dhall/src/semantics/resolve/hir.rs @@ -1,7 +1,7 @@  use crate::error::TypeError;  use crate::semantics::{type_with, NameEnv, Nir, NzEnv, Tir, TyEnv, Type};  use crate::syntax::{Expr, ExprKind, Span, V}; -use crate::ToExprOptions; +use crate::{Ctxt, ToExprOptions};  /// Stores an alpha-normalized variable.  #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] @@ -76,8 +76,11 @@ impl Hir {      ) -> Result<Tir<'hir>, TypeError> {          type_with(env, self, None)      } -    pub fn typecheck_noenv<'hir>(&'hir self) -> Result<Tir<'hir>, TypeError> { -        self.typecheck(&TyEnv::new()) +    pub fn typecheck_noenv<'hir>( +        &'hir self, +        cx: Ctxt<'_>, +    ) -> Result<Tir<'hir>, TypeError> { +        self.typecheck(&TyEnv::new(cx))      }      /// Eval the Hir. It will actually get evaluated only as needed on demand. diff --git a/dhall/src/semantics/resolve/resolve.rs b/dhall/src/semantics/resolve/resolve.rs index 955e2fa..cf72f80 100644 --- a/dhall/src/semantics/resolve/resolve.rs +++ b/dhall/src/semantics/resolve/resolve.rs @@ -250,7 +250,7 @@ impl ImportLocation {              ImportMode::Location => {                  let expr = self.kind.to_location();                  let hir = skip_resolve_expr(&expr)?; -                let ty = hir.typecheck_noenv()?.ty().clone(); +                let ty = hir.typecheck_noenv(env.cx())?.ty().clone();                  (hir, ty)              }          }; @@ -463,8 +463,8 @@ fn resolve_with_env<'cx>(      Ok(Resolved(resolved))  } -pub fn resolve(parsed: Parsed) -> Result<Resolved, Error> { -    Ctxt::with_new(|cx| resolve_with_env(&mut ImportEnv::new(cx), parsed)) +pub fn resolve(cx: Ctxt<'_>, parsed: Parsed) -> Result<Resolved, Error> { +    resolve_with_env(&mut ImportEnv::new(cx), parsed)  }  pub fn skip_resolve_expr(expr: &Expr) -> Result<Hir, Error> { diff --git a/dhall/src/semantics/tck/env.rs b/dhall/src/semantics/tck/env.rs index 1fa66f0..fc0ce9f 100644 --- a/dhall/src/semantics/tck/env.rs +++ b/dhall/src/semantics/tck/env.rs @@ -1,5 +1,6 @@  use crate::semantics::{AlphaVar, NameEnv, Nir, NzEnv, NzVar, Type, ValEnv};  use crate::syntax::Label; +use crate::Ctxt;  /// Environment for indexing variables.  #[derive(Debug, Clone, Copy, Default)] @@ -9,7 +10,8 @@ pub struct VarEnv {  /// Environment for typing expressions.  #[derive(Debug, Clone)] -pub struct TyEnv { +pub struct TyEnv<'cx> { +    cx: Ctxt<'cx>,      names: NameEnv,      items: ValEnv<Type>,  } @@ -38,13 +40,17 @@ impl VarEnv {      }  } -impl TyEnv { -    pub fn new() -> Self { +impl<'cx> TyEnv<'cx> { +    pub fn new(cx: Ctxt<'cx>) -> Self {          TyEnv { +            cx,              names: NameEnv::new(),              items: ValEnv::new(),          }      } +    pub fn cx(&self) -> Ctxt<'cx> { +        self.cx +    }      pub fn as_varenv(&self) -> VarEnv {          self.names.as_varenv()      } @@ -57,12 +63,14 @@ impl TyEnv {      pub fn insert_type(&self, x: &Label, ty: Type) -> Self {          TyEnv { +            cx: self.cx,              names: self.names.insert(x),              items: self.items.insert_type(ty),          }      }      pub fn insert_value(&self, x: &Label, e: Nir, ty: Type) -> Self {          TyEnv { +            cx: self.cx,              names: self.names.insert(x),              items: self.items.insert_value(e, ty),          } @@ -72,7 +80,7 @@ impl TyEnv {      }  } -impl<'a> From<&'a TyEnv> for NzEnv { +impl<'a, 'cx> From<&'a TyEnv<'cx>> for NzEnv {      fn from(x: &'a TyEnv) -> Self {          x.to_nzenv()      } diff --git a/dhall/src/semantics/tck/typecheck.rs b/dhall/src/semantics/tck/typecheck.rs index 498bd76..7e8c0e1 100644 --- a/dhall/src/semantics/tck/typecheck.rs +++ b/dhall/src/semantics/tck/typecheck.rs @@ -5,6 +5,7 @@ use crate::error::{ErrorBuilder, TypeError, TypeMessage};  use crate::operations::typecheck_operation;  use crate::semantics::{Hir, HirKind, Nir, NirKind, Tir, TyEnv, Type};  use crate::syntax::{Const, ExprKind, InterpolatedTextContents, NumKind, Span}; +use crate::Ctxt;  fn function_check(a: Const, b: Const) -> Const {      if b == Const::Type { @@ -29,7 +30,7 @@ pub fn mk_span_err<T, S: ToString>(span: Span, msg: S) -> Result<T, TypeError> {  /// When all sub-expressions have been typed, check the remaining toplevel  /// layer.  fn type_one_layer( -    env: &TyEnv, +    env: &TyEnv<'_>,      ekind: ExprKind<Tir<'_>>,      span: Span,  ) -> Result<Type, TypeError> { @@ -58,7 +59,7 @@ fn type_one_layer(          }),          ExprKind::Builtin(b) => {              let t_hir = type_of_builtin(b); -            typecheck(&t_hir)?.eval_to_type(env)? +            typecheck(env.cx(), &t_hir)?.eval_to_type(env)?          }          ExprKind::TextLit(interpolated) => {              let text_type = Type::from_builtin(Builtin::Text); @@ -171,7 +172,7 @@ fn type_one_layer(  // We pass the annotation to avoid duplicating the annot checking logic. I hope one day we can use  // it to handle the annotations in merge/toMap/etc. uniformly.  pub fn type_with<'hir>( -    env: &TyEnv, +    env: &TyEnv<'_>,      hir: &'hir Hir,      annot: Option<Type>,  ) -> Result<Tir<'hir>, TypeError> { @@ -267,15 +268,19 @@ pub fn type_with<'hir>(  /// Typecheck an expression and return the expression annotated with its type if type-checking  /// succeeded, or an error if type-checking failed. -pub fn typecheck<'hir>(hir: &'hir Hir) -> Result<Tir<'hir>, TypeError> { -    type_with(&TyEnv::new(), hir, None) +pub fn typecheck<'hir>( +    cx: Ctxt<'_>, +    hir: &'hir Hir, +) -> Result<Tir<'hir>, TypeError> { +    type_with(&TyEnv::new(cx), hir, None)  }  /// Like `typecheck`, but additionally checks that the expression's type matches the provided type.  pub fn typecheck_with<'hir>( +    cx: Ctxt<'_>,      hir: &'hir Hir,      ty: &Hir,  ) -> Result<Tir<'hir>, TypeError> { -    let ty = typecheck(ty)?.eval_to_type(&TyEnv::new())?; -    type_with(&TyEnv::new(), hir, Some(ty)) +    let ty = typecheck(cx, ty)?.eval_to_type(&TyEnv::new(cx))?; +    type_with(&TyEnv::new(cx), hir, Some(ty))  }  | 
