Update generic types for let-statements
This commit is contained in:
parent
08626c8559
commit
107303aa98
@ -1,9 +1,10 @@
|
|||||||
// Arithmetic, function calls and imports!
|
// Arithmetic, function calls and imports!
|
||||||
|
|
||||||
fn test<T>(value: T) -> T {
|
fn test<T>(value: T) -> T {
|
||||||
return value;
|
let b: T = value;
|
||||||
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> u32 {
|
fn main() -> u32 {
|
||||||
return test<u32>(15);
|
return test<u64>(15) as u32 + test<u32>(5);
|
||||||
}
|
}
|
@ -29,10 +29,15 @@ pub struct Functions {
|
|||||||
assoc_calls: HashMap<(TypeKind, String), Calls>,
|
assoc_calls: HashMap<(TypeKind, String), Calls>,
|
||||||
}
|
}
|
||||||
|
|
||||||
type GenericsPassState<'map, 'st, 'sc> = PassState<'st, 'sc, (), ErrorKind>;
|
#[derive(Default, Clone)]
|
||||||
|
pub struct GenericsPassData {
|
||||||
|
generic_types: HashMap<String, TypeKind>,
|
||||||
|
}
|
||||||
|
|
||||||
|
type GenericsPassState<'map, 'st, 'sc> = PassState<'st, 'sc, GenericsPassData, ErrorKind>;
|
||||||
|
|
||||||
impl Pass for GenericsPass {
|
impl Pass for GenericsPass {
|
||||||
type Data = ();
|
type Data = GenericsPassData;
|
||||||
type TError = ErrorKind;
|
type TError = ErrorKind;
|
||||||
|
|
||||||
fn context(&mut self, context: &mut mir::Context, mut _state: PassState<Self::Data, Self::TError>) -> PassResult {
|
fn context(&mut self, context: &mut mir::Context, mut _state: PassState<Self::Data, Self::TError>) -> PassResult {
|
||||||
@ -142,6 +147,32 @@ impl Pass for GenericsPass {
|
|||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn function(
|
||||||
|
&mut self,
|
||||||
|
func: &mut FunctionDefinition,
|
||||||
|
mut state: PassState<Self::Data, Self::TError>,
|
||||||
|
) -> PassResult {
|
||||||
|
for (name, ty) in &func.generics {
|
||||||
|
state.scope.data.generic_types.insert(name.clone(), ty.clone());
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn stmt(&mut self, stmt: &mut mir::Statement, mut state: PassState<Self::Data, Self::TError>) -> PassResult {
|
||||||
|
match &mut stmt.0 {
|
||||||
|
mir::StmtKind::Let(var_ref, _, _) => match var_ref.0.clone() {
|
||||||
|
TypeKind::CustomType(custom_type_key) => {
|
||||||
|
if let Some(ty) = state.scope.data.generic_types.get(&custom_type_key.0) {
|
||||||
|
var_ref.0 = ty.clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
},
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl mir::Block {
|
impl mir::Block {
|
||||||
|
Loading…
Reference in New Issue
Block a user