Merge branch 'master' of github.com:neunenak/schala
This commit is contained in:
commit
32e077c407
@ -111,6 +111,7 @@ pub enum TypeVariable {
|
|||||||
pub enum UVar {
|
pub enum UVar {
|
||||||
Integer,
|
Integer,
|
||||||
Float,
|
Float,
|
||||||
|
String,
|
||||||
Boolean,
|
Boolean,
|
||||||
Unit,
|
Unit,
|
||||||
Function(Box<TypeVariable>, Box<TypeVariable>),
|
Function(Box<TypeVariable>, Box<TypeVariable>),
|
||||||
@ -163,6 +164,7 @@ impl TypeContext {
|
|||||||
},
|
},
|
||||||
(&IntLiteral(_), _) => Univ(UVar::Integer),
|
(&IntLiteral(_), _) => Univ(UVar::Integer),
|
||||||
(&FloatLiteral(_), _) => Univ(UVar::Float),
|
(&FloatLiteral(_), _) => Univ(UVar::Float),
|
||||||
|
(&StringLiteral(_), _) => Univ(UVar::String),
|
||||||
(&BoolLiteral(_), _) => Univ(UVar::Boolean),
|
(&BoolLiteral(_), _) => Univ(UVar::Boolean),
|
||||||
(&Variable(ref name), _) => self.lookup(name).map(|entry| entry.type_var)
|
(&Variable(ref name), _) => self.lookup(name).map(|entry| entry.type_var)
|
||||||
.ok_or(format!("Couldn't find {}", name))?,
|
.ok_or(format!("Couldn't find {}", name))?,
|
||||||
@ -209,3 +211,25 @@ impl TypeContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::{TypeContext, TypeVariable, UVar};
|
||||||
|
use super::TypeVariable::*;
|
||||||
|
use schala_lang::parsing::{parse, tokenize};
|
||||||
|
|
||||||
|
macro_rules! type_test {
|
||||||
|
($input:expr, $correct:expr) => {
|
||||||
|
{
|
||||||
|
let mut tc = TypeContext::new();
|
||||||
|
let ast = parse(tokenize($input)).0.unwrap() ;
|
||||||
|
assert_eq!($correct, tc.type_check(&ast).unwrap())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn basic_inference() {
|
||||||
|
type_test!("30", Univ(UVar::Integer))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user