pub(crate) mod cross_layer_taint;
pub(crate) mod effect_summary;
pub(crate) mod finalize_visitor;
use crate::Pass;
use effect_summary::AutomatonState;
use leo_ast::UnitVisitor;
use leo_errors::Result;
use leo_span::Symbol;
use indexmap::IndexMap;
pub struct CeiAnalyzing;
impl Pass for CeiAnalyzing {
type Input = ();
type Output = ();
const NAME: &str = "CeiAnalyzing";
fn do_pass(_input: Self::Input, state: &mut crate::CompilerState) -> Result<Self::Output> {
let ast = std::mem::take(&mut state.ast);
let effect_summaries = effect_summary::compute_effect_summaries(state);
let mut cei_visitor = finalize_visitor::FinalizeCeiVisitor {
state,
current_program: Symbol::intern(""),
effect_summaries,
automaton_state: AutomatonState::BeforeInteraction,
interaction_span: None,
current_variant: None,
in_finalize: false,
};
ast.visit(|program| cei_visitor.visit_program(program), |_library| {});
let mut taint_visitor = cross_layer_taint::CrossLayerTaintVisitor {
state: cei_visitor.state,
current_program: Symbol::intern(""),
taint_map: IndexMap::new(),
in_transition: false,
implicit_taint: cross_layer_taint::TaintInfo::default(),
};
ast.visit(|program| taint_visitor.visit_program(program), |_library| {});
taint_visitor.state.handler.last_err()?;
taint_visitor.state.ast = ast;
Ok(())
}
}