Finished basic constant type inference

This commit is contained in:
greg 2018-02-21 14:14:24 -08:00
parent 55629e6d9d
commit d5df868f10

View File

@ -50,16 +50,19 @@ impl TypeContext {
} }
fn type_infer(&mut self, expr: &parsing::Expression) -> TypeResult<Type> { fn type_infer(&mut self, expr: &parsing::Expression) -> TypeResult<Type> {
use self::parsing::Expression; use self::parsing::Expression;
use self::parsing::ExpressionType::*;
use self::Type::*; use self::TConst::*;
match expr { match expr {
&Expression(ref e, Some(ref anno)) => { &Expression(ref e, Some(ref anno)) => {
let anno_ty = self.type_from_anno(anno)?; let anno_ty = self.type_from_anno(anno)?;
let expr = Expression(*e, None); let ty = self.type_infer_exprtype(&e)?;
let ty = self.type_infer(&expr)?;
self.unify(ty, anno_ty) self.unify(ty, anno_ty)
}, },
&Expression(ref e, None) => match e { &Expression(ref e, None) => self.type_infer_exprtype(e)
}
}
fn type_infer_exprtype(&mut self, expr: &parsing::ExpressionType) -> TypeResult<Type> {
use self::parsing::ExpressionType::*;
use self::Type::*; use self::TConst::*;
match expr {
&IntLiteral(_) => Ok(Const(Int)), &IntLiteral(_) => Ok(Const(Int)),
&FloatLiteral(_) => Ok(Const(Float)), &FloatLiteral(_) => Ok(Const(Float)),
&StringLiteral(_) => Ok(Const(StringT)), &StringLiteral(_) => Ok(Const(StringT)),
@ -67,7 +70,6 @@ impl TypeContext {
_ => Err(format!("Type not yet implemented")) _ => Err(format!("Type not yet implemented"))
} }
} }
}
fn type_from_anno(&mut self, anno: &parsing::TypeName) -> TypeResult<Type> { fn type_from_anno(&mut self, anno: &parsing::TypeName) -> TypeResult<Type> {
use self::Type::*; use self::TConst::*; use self::Type::*; use self::TConst::*;
Ok(Unit) Ok(Unit)