leo_passes/dead_code_elimination/
program.rs1use super::DeadCodeEliminatingVisitor;
18
19use leo_ast::{AstReconstructor, Constructor, Function, ProgramReconstructor, UpgradeVariant};
20use leo_errors::StaticAnalyzerError;
21
22impl ProgramReconstructor for DeadCodeEliminatingVisitor<'_> {
23 fn reconstruct_program_scope(&mut self, mut input: leo_ast::ProgramScope) -> leo_ast::ProgramScope {
24 self.program_name = input.program_id.name.name;
25 input.functions = input.functions.into_iter().map(|(i, f)| (i, self.reconstruct_function(f))).collect();
26 input.constructor = input.constructor.map(|c| self.reconstruct_constructor(c));
27 input
28 }
29
30 fn reconstruct_function(&mut self, mut input: Function) -> Function {
31 self.used_variables.clear();
33 input.block = self.reconstruct_block(input.block).0;
35 input
36 }
37
38 fn reconstruct_constructor(&mut self, mut input: Constructor) -> Constructor {
39 self.used_variables.clear();
41 input.block = self.reconstruct_block(input.block).0;
43 if input
45 .get_upgrade_variant_with_network(self.state.network)
46 .expect("Type checking guarantees that the upgrade variant is valid")
47 == UpgradeVariant::Custom
48 && input.block.statements.is_empty()
49 {
50 self.state.handler.emit_err(StaticAnalyzerError::custom_error(
51 "The `@custom` constructor has no statements after dead code elimination.",
52 Some("Add a non-trivial implementation"),
53 input.span,
54 ))
55 }
56 input
57 }
58}