leo_passes/loop_unrolling/
mod.rs1use crate::Pass;
18
19use leo_ast::ProgramReconstructor;
20use leo_errors::Result;
21use leo_span::{Span, Symbol};
22
23mod duplicate;
24
25mod range_iterator;
26use range_iterator::*;
27
28mod statement;
29
30mod program;
31
32mod visitor;
33use visitor::*;
34
35pub struct UnrollingOutput {
36 pub loop_not_unrolled: Option<Span>,
38 pub loop_unrolled: bool,
40}
41
42pub struct Unrolling;
43
44impl Pass for Unrolling {
45 type Input = ();
46 type Output = UnrollingOutput;
47
48 const NAME: &str = "Unrolling";
49
50 fn do_pass(_input: Self::Input, state: &mut crate::CompilerState) -> Result<Self::Output> {
51 let mut ast = std::mem::take(&mut state.ast);
52 let mut visitor =
53 UnrollingVisitor { state, program: Symbol::intern(""), loop_not_unrolled: None, loop_unrolled: false };
54 ast.ast = visitor.reconstruct_program(ast.ast);
55 visitor.state.handler.last_err().map_err(|e| *e)?;
56 visitor.state.ast = ast;
57 Ok(UnrollingOutput { loop_not_unrolled: visitor.loop_not_unrolled, loop_unrolled: visitor.loop_unrolled })
58 }
59}