use leo_ast::*;
use crate::Unroller;
impl ProgramReconstructor for Unroller<'_> {
fn reconstruct_program_scope(&mut self, input: ProgramScope) -> ProgramScope {
input.consts.into_iter().for_each(|(_, c)| {
self.reconstruct_const(c);
});
ProgramScope {
program_id: input.program_id,
structs: input.structs,
mappings: input.mappings,
functions: input.functions.into_iter().map(|(i, f)| (i, self.reconstruct_function(f))).collect(),
consts: Vec::new(),
span: input.span,
}
}
fn reconstruct_function(&mut self, function: Function) -> Function {
let function_index = self.symbol_table.borrow().lookup_fn_symbol(function.identifier.name).unwrap().id;
let previous_function_index = self.enter_scope(function_index);
let previous_scope_index = self.enter_scope(self.scope_index);
let block = self.reconstruct_block(function.block).0;
self.exit_scope(previous_scope_index);
let finalize = function.finalize.map(|finalize| {
let previous_scope_index = self.enter_scope(self.scope_index);
let block = self.reconstruct_block(finalize.block).0;
self.exit_scope(previous_scope_index);
Finalize {
identifier: finalize.identifier,
input: finalize.input,
output: finalize.output,
output_type: finalize.output_type,
block,
span: finalize.span,
id: finalize.id,
}
});
let reconstructed_function = Function {
annotations: function.annotations,
variant: function.variant,
identifier: function.identifier,
input: function.input,
output: function.output,
output_type: function.output_type,
block,
finalize,
span: function.span,
id: function.id,
};
self.exit_scope(previous_function_index);
reconstructed_function
}
}