leo_passes/flattening/
program.rs1use super::{FlatteningVisitor, ReturnGuard};
18
19use leo_ast::{AstReconstructor, Expression, Function, ProgramReconstructor, ProgramScope, ReturnStatement, Statement};
20
21impl ProgramReconstructor for FlatteningVisitor<'_> {
22 fn reconstruct_program_scope(&mut self, input: ProgramScope) -> ProgramScope {
24 self.program = input.program_id.name.name;
25 ProgramScope {
26 program_id: input.program_id,
27 structs: input.structs.into_iter().map(|(i, c)| (i, self.reconstruct_struct(c))).collect(),
28 mappings: input.mappings.into_iter().map(|(id, mapping)| (id, self.reconstruct_mapping(mapping))).collect(),
29 functions: input.functions.into_iter().map(|(i, f)| (i, self.reconstruct_function(f))).collect(),
30 consts: input
31 .consts
32 .into_iter()
33 .map(|(i, c)| match self.reconstruct_const(c) {
34 (Statement::Const(declaration), _) => (i, declaration),
35 _ => panic!("`reconstruct_const` can only return `Statement::Const`"),
36 })
37 .collect(),
38 span: input.span,
39 }
40 }
41
42 fn reconstruct_function(&mut self, function: Function) -> Function {
44 self.is_async = function.variant.is_async_function();
46
47 let mut block = self.reconstruct_block(function.block).0;
49
50 let returns = std::mem::take(&mut self.returns);
52 let expression_returns: Vec<(Option<Expression>, ReturnStatement)> = returns
53 .into_iter()
54 .map(|(guard, statement)| match guard {
55 ReturnGuard::None => (None, statement),
56 ReturnGuard::Unconstructed(plain) | ReturnGuard::Constructed { plain, .. } => {
57 (Some(plain.into()), statement)
58 }
59 })
60 .collect();
61
62 self.fold_returns(&mut block, expression_returns);
63
64 Function {
65 annotations: function.annotations,
66 variant: function.variant,
67 identifier: function.identifier,
68 const_parameters: function.const_parameters,
69 input: function.input,
70 output: function.output,
71 output_type: function.output_type,
72 block,
73 span: function.span,
74 id: function.id,
75 }
76 }
77}