#![allow(dead_code)] #![allow(unreachable_code)] #![allow(unused_imports)] use std::borrow::Cow; use std::cmp::max; use std::collections::HashMap; use crate::error::{TypeError, TypeMessage}; use crate::semantics::core::context::TyCtx; use crate::semantics::nze::{NameEnv, NzVar, QuoteEnv}; use crate::semantics::phase::normalize::{merge_maps, NzEnv}; use crate::semantics::phase::typecheck::{ builtin_to_value, const_to_value, type_of_builtin, }; use crate::semantics::phase::Normalized; use crate::semantics::{ AlphaVar, Binder, Closure, TyExpr, TyExprKind, Type, Value, ValueKind, }; use crate::syntax; use crate::syntax::{ BinOp, Builtin, Const, Expr, ExprKind, InterpolatedTextContents, Label, Span, UnspannedExpr, V, }; #[derive(Debug, Clone)] pub(crate) struct TyEnv { names: NameEnv, items: NzEnv, } impl TyEnv { pub fn new() -> Self { TyEnv { names: NameEnv::new(), items: NzEnv::new(), } } pub fn from_nzenv_alpha(items: &NzEnv) -> Self { TyEnv { names: NameEnv::from_binders( std::iter::repeat("_".into()).take(items.size()), ), items: items.clone(), } } pub fn as_quoteenv(&self) -> QuoteEnv { self.items.as_quoteenv() } pub fn as_nzenv(&self) -> &NzEnv { &self.items } pub fn as_nameenv(&self) -> &NameEnv { &self.names } pub fn insert_type(&self, x: &Label, t: Type) -> Self { TyEnv { names: self.names.insert(x), items: self.items.insert_type(t), } } pub fn insert_value(&self, x: &Label, e: Value) -> Self { TyEnv { names: self.names.insert(x), items: self.items.insert_value(e), } } pub fn lookup(&self, var: &V