Continue implementing type inference
This commit is contained in:
parent
69da32d414
commit
b3dd610949
@ -142,16 +142,31 @@ impl ExpectedType for FunctionCall {
|
||||
..
|
||||
} = *return_type.clone()
|
||||
{
|
||||
for (constructor, identifier) in self
|
||||
.type_arguments
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.into_iter()
|
||||
.zip(type_parameters.unwrap().into_iter())
|
||||
if let (Some(type_arguments), Some(type_parameters)) =
|
||||
(&self.type_arguments, &type_parameters)
|
||||
{
|
||||
if return_identifier == identifier {
|
||||
for (constructor, identifier) in
|
||||
type_arguments.into_iter().zip(type_parameters.into_iter())
|
||||
{
|
||||
if &return_identifier == identifier {
|
||||
let concrete_type = constructor.clone().construct(&context)?;
|
||||
|
||||
return Ok(Type::Generic {
|
||||
identifier: identifier.clone(),
|
||||
concrete_type: Some(Box::new(concrete_type)),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let (None, Some(type_parameters)) = (&self.type_arguments, type_parameters) {
|
||||
for (expression, identifier) in (&self.value_arguments)
|
||||
.into_iter()
|
||||
.zip(type_parameters.into_iter())
|
||||
{
|
||||
if identifier == return_identifier {
|
||||
let concrete_type = expression.expected_type(context)?;
|
||||
|
||||
return Ok(Type::Generic {
|
||||
identifier,
|
||||
concrete_type: Some(Box::new(concrete_type)),
|
||||
@ -159,6 +174,7 @@ impl ExpectedType for FunctionCall {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(*return_type)
|
||||
} else {
|
||||
|
@ -1,2 +1,3 @@
|
||||
foo = fn |T| (x: T) -> T { x }
|
||||
bar: str = foo::(str)::("hi")
|
||||
baz: str = foo("hi")
|
||||
|
Loading…
Reference in New Issue
Block a user