can theoretically infer generics now (even tho they don't exist yet lmao)
This commit is contained in:
@@ -30,6 +30,7 @@ fn start() {
|
|||||||
x = add(x, 1);
|
x = add(x, 1);
|
||||||
};
|
};
|
||||||
println("after");
|
println("after");
|
||||||
|
let infer_me: slice<_> = "hello";
|
||||||
print(tester());
|
print(tester());
|
||||||
let test: Test = Test {
|
let test: Test = Test {
|
||||||
a: 10,
|
a: 10,
|
||||||
|
|||||||
@@ -127,12 +127,23 @@ pub fn match_types(dest: &Type, src: &Type) -> Option<Type> {
|
|||||||
if dest_id != src_id {
|
if dest_id != src_id {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
None
|
let mut args = Vec::new();
|
||||||
// TODO
|
let mut changed = false;
|
||||||
// let mut args = Vec::new();
|
for (darg, sarg) in dest_args.iter().zip(src_args) {
|
||||||
// for (darg, sarg) in dest_args.iter().zip(src_args) {
|
if let Some(ty) = match_types(darg, sarg) {
|
||||||
// }
|
args.push(ty);
|
||||||
// Some(Type::Struct { id: *dest_id, args })
|
changed = true;
|
||||||
|
} else if darg != sarg {
|
||||||
|
return None;
|
||||||
|
} else {
|
||||||
|
args.push(darg.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if changed {
|
||||||
|
Some(Type::Struct { id: *dest_id, args })
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
}
|
}
|
||||||
(
|
(
|
||||||
Type::Fn {
|
Type::Fn {
|
||||||
@@ -147,13 +158,13 @@ pub fn match_types(dest: &Type, src: &Type) -> Option<Type> {
|
|||||||
// TODO
|
// TODO
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
(Type::Ref(dest), Type::Ref(src)) => Some(match_types(dest, src)?),
|
(Type::Ref(dest), Type::Ref(src)) => Some(match_types(dest, src)?.rf()),
|
||||||
(Type::Slice(dest), Type::Slice(src)) => Some(match_types(dest, src)?),
|
(Type::Slice(dest), Type::Slice(src)) => Some(match_types(dest, src)?.slice()),
|
||||||
(Type::Array(dest, dlen), Type::Array(src, slen)) => {
|
(Type::Array(dest, dlen), Type::Array(src, slen)) => {
|
||||||
if dlen != slen {
|
if dlen != slen {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
match_types(dest, src)
|
Some(match_types(dest, src)?.arr(*dlen))
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,12 @@ impl UProgram {
|
|||||||
spans: vec![var.origin],
|
spans: vec![var.origin],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
if var.ty == Type::Infer {
|
||||||
|
output.err(CompilerMsg {
|
||||||
|
msg: format!("Var {:?} cannot be inferred", id),
|
||||||
|
spans: vec![var.origin],
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
output
|
output
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ impl PType {
|
|||||||
let inner = self.args[0].lower(namespace, output);
|
let inner = self.args[0].lower(namespace, output);
|
||||||
Type::Slice(Box::new(inner))
|
Type::Slice(Box::new(inner))
|
||||||
}
|
}
|
||||||
|
"_" => Type::Infer,
|
||||||
_ => {
|
_ => {
|
||||||
output.err(CompilerMsg::from_span(span, "Type not found".to_string()));
|
output.err(CompilerMsg::from_span(span, "Type not found".to_string()));
|
||||||
Type::Error
|
Type::Error
|
||||||
|
|||||||
Reference in New Issue
Block a user