use crate::ir::{GenericBase, ImportedKind, IrModule, ResolvedType};
pub(super) fn externalise_imported_refs(
ty: &mut ResolvedType,
imported: &IrModule,
module_path: &[String],
) {
match ty {
ResolvedType::Struct(id) => {
if let Some(s) = imported.get_struct(*id) {
*ty = ResolvedType::External {
module_path: module_path.to_vec(),
name: s.name.clone(),
kind: ImportedKind::Struct,
type_args: vec![],
};
}
}
ResolvedType::Enum(id) => {
if let Some(e) = imported.get_enum(*id) {
*ty = ResolvedType::External {
module_path: module_path.to_vec(),
name: e.name.clone(),
kind: ImportedKind::Enum,
type_args: vec![],
};
}
}
ResolvedType::Trait(id) => {
if let Some(t) = imported.get_trait(*id) {
*ty = ResolvedType::External {
module_path: module_path.to_vec(),
name: t.name.clone(),
kind: ImportedKind::Trait,
type_args: vec![],
};
}
}
ResolvedType::Generic { base, args } => {
let (base_name, kind) = match base {
GenericBase::Struct(id) => imported
.get_struct(*id)
.map(|s| (s.name.clone(), ImportedKind::Struct)),
GenericBase::Enum(id) => imported
.get_enum(*id)
.map(|e| (e.name.clone(), ImportedKind::Enum)),
GenericBase::Trait(id) => imported
.get_trait(*id)
.map(|t| (t.name.clone(), ImportedKind::Trait)),
}
.unwrap_or_else(|| (String::new(), ImportedKind::Struct));
for a in args.iter_mut() {
externalise_imported_refs(a, imported, module_path);
}
*ty = ResolvedType::External {
module_path: module_path.to_vec(),
name: base_name,
kind,
type_args: std::mem::take(args),
};
}
ResolvedType::Tuple(fields) => {
for (_, t) in fields {
externalise_imported_refs(t, imported, module_path);
}
}
ResolvedType::Closure {
param_tys,
return_ty,
} => {
for (_, t) in param_tys {
externalise_imported_refs(t, imported, module_path);
}
externalise_imported_refs(return_ty, imported, module_path);
}
ResolvedType::External { type_args, .. } => {
for a in type_args {
externalise_imported_refs(a, imported, module_path);
}
}
ResolvedType::Primitive(_) | ResolvedType::TypeParam(_) | ResolvedType::Error => {}
}
}