Fix linker type-replacement for imported functions

This commit is contained in:
Sofia 2025-08-05 22:23:57 +03:00
parent 1dd4bbbb05
commit 0ee9d3bf7d
2 changed files with 16 additions and 12 deletions

View File

@ -2,5 +2,8 @@ import triple_import_vec2::Vec2;
struct Ship {
position: Vec2,
velocity: Vec2,
}
}
impl Ship {
pub fn foo(&self, vec: Vec2) {}
}

View File

@ -543,14 +543,14 @@ impl<'map> Pass for LinkerPass<'map> {
function: &mut FunctionDefinition,
state: PassState<Self::Data, Self::TError>,
) -> PassResult {
if matches!(function.kind, FunctionDefinitionKind::Local(_, _)) {
let mod_id = state.scope.module_id.unwrap();
let foreign_types = &state.scope.data.foreign_types.get(&mod_id);
if let Some(foreign_types) = foreign_types {
function.return_type = function.return_type.update_imported(*foreign_types);
for param in function.parameters.iter_mut() {
param.ty = param.ty.update_imported(foreign_types);
}
let mod_id = state.scope.module_id.unwrap();
let foreign_types = &state.scope.data.foreign_types.get(&mod_id);
if let Some(foreign_types) = foreign_types {
dbg!(state.scope.module_id, foreign_types, &function.parameters);
function.return_type = function.return_type.update_imported(*foreign_types);
for param in function.parameters.iter_mut() {
param.ty = param.ty.update_imported(foreign_types);
dbg!(&param.ty);
}
}
Ok(())
@ -585,8 +585,9 @@ impl<'map> Pass for LinkerPass<'map> {
super::ExprKind::Borrow(..) => {}
super::ExprKind::Deref(..) => {}
super::ExprKind::CastTo(_, type_kind) => *type_kind = type_kind.update_imported(foreign_types),
super::ExprKind::AssociatedFunctionCall(type_kind, _) => {
*type_kind = type_kind.update_imported(foreign_types)
super::ExprKind::AssociatedFunctionCall(type_kind, fn_call) => {
*type_kind = type_kind.update_imported(foreign_types);
fn_call.return_type = fn_call.return_type.update_imported(foreign_types);
}
super::ExprKind::Struct(key, _) => {
*key = if let Some(mod_id) = foreign_types.get(&key) {