Finished basic constant type inference
This commit is contained in:
parent
55629e6d9d
commit
d5df868f10
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user