use crate::{
metadata::{
diagnostics::DiagnosticCategory,
loader::{LoaderContext, MetadataLoader},
tables::{ImplMapRaw, TableId},
},
Result,
};
pub(crate) struct ImplMapLoader;
impl MetadataLoader for ImplMapLoader {
fn load(&self, context: &LoaderContext) -> Result<()> {
let (Some(header), Some(strings)) = (context.meta, context.strings) else {
return Ok(());
};
let Some(table) = header.table::<ImplMapRaw>() else {
return Ok(());
};
table.par_iter().try_for_each(|row| {
let token_msg = || format!("impl map 0x{:08x}", row.token.value());
let Some(owned) = context.handle_result(
row.to_owned(
|coded_index| context.get_ref(coded_index),
strings,
context.module_ref,
),
DiagnosticCategory::Method,
token_msg,
)?
else {
return Ok(());
};
context.handle_error(owned.apply(), DiagnosticCategory::Method, token_msg)?;
context.handle_error(
context.imports.add_method(
owned.import_name.clone(),
&owned.token,
owned.member_forwarded.clone(),
&owned.import_scope,
),
DiagnosticCategory::Method,
token_msg,
)?;
Ok(())
})
}
fn table_id(&self) -> Option<TableId> {
Some(TableId::ImplMap)
}
fn dependencies(&self) -> &'static [TableId] {
&[
TableId::MethodDef,
TableId::ModuleRef,
TableId::Module,
TableId::MemberRef,
]
}
}