Update generic types for let-statements
This commit is contained in:
parent
08626c8559
commit
107303aa98
@ -1,9 +1,10 @@
|
||||
// Arithmetic, function calls and imports!
|
||||
|
||||
fn test<T>(value: T) -> T {
|
||||
return value;
|
||||
let b: T = value;
|
||||
return b;
|
||||
}
|
||||
|
||||
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>,
|
||||
}
|
||||
|
||||
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 {
|
||||
type Data = ();
|
||||
type Data = GenericsPassData;
|
||||
type TError = ErrorKind;
|
||||
|
||||
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(())
|
||||
}
|
||||
|
||||
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 {
|
||||
|
Loading…
Reference in New Issue
Block a user