the evar table

TODO find a better way to represent this
This commit is contained in:
greg 2017-10-11 02:11:12 -07:00
parent ab53c5394e
commit 0cf56eea4f
1 changed files with 19 additions and 0 deletions

View File

@ -62,6 +62,7 @@ struct TypeContextEntry {
pub struct TypeContext {
symbol_table: HashMap<PathSpecifier, TypeContextEntry>,
evar_table: HashMap<u64, Type>,
existential_type_label_count: u64
}
@ -69,6 +70,7 @@ impl TypeContext {
pub fn new() -> TypeContext {
TypeContext {
symbol_table: HashMap::new(),
evar_table: HashMap::new(),
existential_type_label_count: 0,
}
}
@ -342,6 +344,7 @@ impl TypeContext {
fn unify(&mut self, t1: Type, t2: Type) -> TypeCheckResult {
use self::Type::*;
use self::TypeConst::*;
use self::TypeVar::*;
match (&t1, &t2) {
(&TConst(ref c1), &TConst(ref c2)) if c1 == c2 => Ok(TConst(c1.clone())),
@ -350,6 +353,22 @@ impl TypeContext {
let t6 = self.unify(*t2.clone().clone(), *t4.clone().clone())?;
Ok(TFunc(Box::new(t5), Box::new(t6)))
},
(&TVar(Univ(ref a)), &TVar(Univ(ref b))) => {
if a == b {
Ok(TVar(Univ(a.clone())))
} else {
Err(format!("Couldn't unify universal types {} and {}", a, b))
}
},
(&TVar(Exist(ref a)), &TVar(Exist(ref b))) => {
//the interesting case!!
if a == b {
Ok(TVar(Exist(a.clone())))
} else {
Err(format!("Couldn't unify existential types {} and {}", a, b))
}
},
_ => Err(format!("Types {:?} and {:?} don't unify", t1, t2))
}
}