use crate::Pass;
use leo_ast::{CompositeExpression, CompositeType, ProgramReconstructor as _};
use leo_errors::Result;
use leo_span::Symbol;
mod ast;
mod program;
mod visitor;
use visitor::*;
#[derive(Debug)]
pub struct MonomorphizationOutput {
pub unresolved_calls: Vec<leo_ast::CallExpression>,
pub unresolved_composite_exprs: Vec<CompositeExpression>,
pub unresolved_composite_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(),
function_map: indexmap::IndexMap::new(),
composite_map: indexmap::IndexMap::new(),
monomorphized_functions: indexmap::IndexSet::new(),
reconstructed_composites: indexmap::IndexMap::new(),
monomorphized_composites: indexmap::IndexSet::new(),
unresolved_calls: Vec::new(),
unresolved_composite_exprs: Vec::new(),
unresolved_composite_types: Vec::new(),
changed: false,
};
ast.ast = visitor.reconstruct_program(ast.ast);
visitor.state.handler.last_err()?;
visitor.state.ast = ast;
Ok(MonomorphizationOutput {
unresolved_calls: visitor.unresolved_calls,
unresolved_composite_exprs: visitor.unresolved_composite_exprs,
unresolved_composite_types: visitor.unresolved_composite_types,
changed: visitor.changed,
})
}
}