leo_passes/dead_code_elimination/
ast.rs1use super::DeadCodeEliminatingVisitor;
18
19use leo_ast::*;
20
21impl AstReconstructor for DeadCodeEliminatingVisitor<'_> {
22 type AdditionalInput = ();
23 type AdditionalOutput = ();
24
25 fn reconstruct_path(&mut self, input: Path, _additional: &()) -> (Expression, Self::AdditionalOutput) {
28 self.used_variables.insert(input.identifier().name);
31 (input.into(), Default::default())
32 }
33
34 fn reconstruct_struct_init(
37 &mut self,
38 mut input: leo_ast::StructExpression,
39 _additional: &(),
40 ) -> (Expression, Self::AdditionalOutput) {
41 for member in input.members.iter_mut() {
42 if let Some(expr) = std::mem::take(&mut member.expression) {
43 member.expression = Some(self.reconstruct_expression(expr, &()).0);
44 } else {
45 self.reconstruct_path(Path::from(member.identifier).into_absolute(), &());
47 }
48 }
49
50 (input.into(), Default::default())
51 }
52
53 fn reconstruct_assign(&mut self, _input: AssignStatement) -> (Statement, Self::AdditionalOutput) {
56 panic!("`AssignStatement`s should not exist in the AST at this phase of compilation.")
57 }
58
59 fn reconstruct_block(&mut self, block: Block) -> (Block, Self::AdditionalOutput) {
61 self.statements_before += block.statements.iter().filter(|stmt| !stmt.is_empty()).count() as u32;
64
65 let mut statements: Vec<Statement> =
67 block.statements.into_iter().rev().map(|statement| self.reconstruct_statement(statement).0).collect();
68
69 statements.retain(|stmt| !stmt.is_empty());
70
71 statements.reverse();
73
74 self.statements_after += statements.len() as u32;
75
76 (Block { statements, span: block.span, id: block.id }, Default::default())
77 }
78
79 fn reconstruct_definition(&mut self, mut input: DefinitionStatement) -> (Statement, Self::AdditionalOutput) {
81 let lhs_is_used = match &input.place {
83 DefinitionPlace::Single(identifier) => self.used_variables.contains(&identifier.name),
84 DefinitionPlace::Multiple(identifiers) => {
85 identifiers.iter().any(|identifier| self.used_variables.contains(&identifier.name))
86 }
87 };
88
89 if !lhs_is_used && self.side_effect_free(&input.value) {
90 (Statement::dummy(), Default::default())
92 } else {
93 input.value = self.reconstruct_expression(input.value, &()).0;
95 (input.into(), Default::default())
96 }
97 }
98
99 fn reconstruct_iteration(&mut self, _: IterationStatement) -> (Statement, Self::AdditionalOutput) {
101 panic!("`IterationStatement`s should not be in the AST at this phase of compilation.");
102 }
103
104 fn reconstruct_expression_statement(&mut self, input: ExpressionStatement) -> (Statement, Self::AdditionalOutput) {
105 if self.side_effect_free(&input.expression) {
106 (Statement::dummy(), Default::default())
107 } else {
108 (
109 ExpressionStatement { expression: self.reconstruct_expression(input.expression, &()).0, ..input }
110 .into(),
111 Default::default(),
112 )
113 }
114 }
115}