use crate::ast::*;
use crate::Error;
mod aliases;
mod deinline_import_export;
mod gensym;
mod names;
mod types;
#[derive(PartialEq, Eq, Hash, Copy, Clone, Debug)]
pub enum Ns {
Func,
Table,
Global,
Memory,
Module,
Instance,
Event,
Type,
}
impl Ns {
fn from_export(kind: &ExportKind) -> Ns {
match kind {
ExportKind::Func => Ns::Func,
ExportKind::Table => Ns::Table,
ExportKind::Global => Ns::Global,
ExportKind::Memory => Ns::Memory,
ExportKind::Instance => Ns::Instance,
ExportKind::Module => Ns::Module,
ExportKind::Event => Ns::Event,
ExportKind::Type => Ns::Type,
}
}
}
pub fn resolve<'a>(module: &mut Module<'a>) -> Result<Names<'a>, Error> {
let fields = match &mut module.kind {
ModuleKind::Text(fields) => fields,
_ => return Ok(Default::default()),
};
gensym::reset();
deinline_import_export::run(fields);
aliases::run(fields);
for i in 1..fields.len() {
let span = match &fields[i] {
ModuleField::Import(i) => i.span,
_ => continue,
};
let name = match &fields[i - 1] {
ModuleField::Memory(_) => "memory",
ModuleField::Func(_) => "function",
ModuleField::Table(_) => "table",
ModuleField::Global(_) => "global",
_ => continue,
};
return Err(Error::new(span, format!("import after {}", name)));
}
types::expand(fields);
let resolver = names::resolve(module.id, fields)?;
Ok(Names { resolver })
}
#[derive(Default)]
pub struct Names<'a> {
resolver: names::Resolver<'a>,
}
impl<'a> Names<'a> {
pub fn resolve_func(&self, idx: &mut Index<'a>) -> Result<(), Error> {
self.resolver.resolve(idx, Ns::Func)?;
Ok(())
}
pub fn resolve_memory(&self, idx: &mut Index<'a>) -> Result<(), Error> {
self.resolver.resolve(idx, Ns::Memory)?;
Ok(())
}
pub fn resolve_table(&self, idx: &mut Index<'a>) -> Result<(), Error> {
self.resolver.resolve(idx, Ns::Table)?;
Ok(())
}
pub fn resolve_global(&self, idx: &mut Index<'a>) -> Result<(), Error> {
self.resolver.resolve(idx, Ns::Global)?;
Ok(())
}
}