#![allow(non_snake_case)] use std::borrow::Borrow; use std::fmt; use crate::expr::*; use crate::traits::DynamicType; use dhall_core; use dhall_core::context::Context; use dhall_core::*; use dhall_generator as dhall; use self::TypeMessage::*; impl Resolved { pub fn typecheck(self) -> Result> { type_of(self.0.clone()) } pub fn typecheck_with(self, ty: &Type) -> Result> { let expr: SubExpr<_, _> = self.0.clone(); let ty: SubExpr<_, _> = ty.as_normalized()?.as_expr().absurd(); type_of(dhall::subexpr!(expr: ty)) } /// Pretends this expression has been typechecked. Use with care. pub fn skip_typecheck(self) -> Typed { Typed(self.0, None) } } impl Typed { fn get_type_move(self) -> Result> { self.1.ok_or(TypeError::new( &Context::new(), self.0, TypeMessage::Untyped, )) } } impl Normalized { // Expose the outermost constructor fn unroll_ref(&self) -> &Expr { self.as_expr().as_ref() } fn shift(&self, delta: isize, var: &V