use crate::Pass;
use leo_ast::{CompositeType, ProgramReconstructor as _, StructExpression};
use leo_errors::Result;
use leo_span::Symbol;
mod ast;
mod program;
mod visitor;
use visitor::*;
pub struct MonomorphizationOutput {
pub unresolved_calls: Vec<leo_ast::CallExpression>,
pub unresolved_struct_exprs: Vec<StructExpression>,
pub unresolved_struct_types: Vec<CompositeType>,
pub changed: bool,
}
pub struct Monomorphization;
impl Pass for Monomorphization {
type Input = ();
type Output = MonomorphizationOutput;
const NAME: &str = "Monomorphization";
fn do_pass(_input: Self::Input, state: &mut crate::CompilerState) -> Result<Self::Output> {
let mut ast = std::mem::take(&mut state.ast);
let mut visitor = MonomorphizationVisitor {
state,
program: Symbol::intern(""),
reconstructed_functions: indexmap::IndexMap::new(),
monomorphized_functions: indexmap::IndexSet::new(),
reconstructed_structs: indexmap::IndexMap::new(),
monomorphized_structs: indexmap::IndexSet::new(),
unresolved_calls: Vec::new(),
unresolved_struct_exprs: Vec::new(),
unresolved_struct_types: Vec::new(),
changed: false,
};
ast.ast = visitor.reconstruct_program(ast.ast);
visitor.state.handler.last_err().map_err(|e| *e)?;
visitor.state.ast = ast;
Ok(MonomorphizationOutput {
unresolved_calls: visitor.unresolved_calls,
unresolved_struct_exprs: visitor.unresolved_struct_exprs,
unresolved_struct_types: visitor.unresolved_struct_types,
changed: visitor.changed,
})
}
}