🤔 Add a type inference engine, along with typed literals. #4
@@ -324,16 +324,32 @@ mod tests {
|
||||
let stmt = syntax::Statement::parse(1, "x = 1 + 1 + 1;").expect("basic parse");
|
||||
let (stmts, constraints) = infer_statement(stmt);
|
||||
assert_eq!(stmts.len(), 2);
|
||||
let ir::Statement::Binding(_args, name1, temp_ty1, ir::Expression::Primitive(_, primty1, ir::Primitive::Plus, primargs1)) = stmts.get(0).expect("item two") else {
|
||||
let ir::Statement::Binding(
|
||||
_args,
|
||||
name1,
|
||||
temp_ty1,
|
||||
ir::Expression::Primitive(_, primty1, ir::Primitive::Plus, primargs1),
|
||||
) = stmts.get(0).expect("item two")
|
||||
else {
|
||||
panic!("Failed to match first statement");
|
||||
};
|
||||
let ir::Statement::Binding(_args, name2, temp_ty2, ir::Expression::Primitive(_, primty2, ir::Primitive::Plus, primargs2)) = stmts.get(1).expect("item two") else {
|
||||
let ir::Statement::Binding(
|
||||
_args,
|
||||
name2,
|
||||
temp_ty2,
|
||||
ir::Expression::Primitive(_, primty2, ir::Primitive::Plus, primargs2),
|
||||
) = stmts.get(1).expect("item two")
|
||||
else {
|
||||
panic!("Failed to match second statement");
|
||||
};
|
||||
let &[ir::ValueOrRef::Value(_, ref left1ty, _), ir::ValueOrRef::Value(_, ref right1ty, _)] = &primargs1[..] else {
|
||||
let &[ir::ValueOrRef::Value(_, ref left1ty, _), ir::ValueOrRef::Value(_, ref right1ty, _)] =
|
||||
&primargs1[..]
|
||||
else {
|
||||
panic!("Failed to match first arguments");
|
||||
};
|
||||
let &[ir::ValueOrRef::Ref(_, _, ref left2name), ir::ValueOrRef::Value(_, ref right2ty, _)] = &primargs2[..] else {
|
||||
let &[ir::ValueOrRef::Ref(_, _, ref left2name), ir::ValueOrRef::Value(_, ref right2ty, _)] =
|
||||
&primargs2[..]
|
||||
else {
|
||||
panic!("Failed to match first arguments");
|
||||
};
|
||||
assert_ne!(name1, name2);
|
||||
|
||||
Reference in New Issue
Block a user