|
2 | 2 |
|
3 | 3 | mod convert_to_dotted_properties; |
4 | 4 | mod fold_constants; |
| 5 | +mod inline; |
5 | 6 | mod minimize_conditional_expression; |
6 | 7 | mod minimize_conditions; |
7 | 8 | mod minimize_expression_in_boolean_context; |
@@ -102,10 +103,12 @@ impl<'a> PeepholeOptimizations { |
102 | 103 |
|
103 | 104 | impl<'a> Traverse<'a, MinifierState<'a>> for PeepholeOptimizations { |
104 | 105 | fn enter_program(&mut self, _program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) { |
| 106 | + ctx.state.symbol_values.clear(); |
105 | 107 | ctx.state.changed = false; |
106 | 108 | } |
107 | 109 |
|
108 | 110 | fn exit_program(&mut self, program: &mut Program<'a>, ctx: &mut TraverseCtx<'a>) { |
| 111 | + // Remove unused references by visiting the AST again and diff the collected references. |
109 | 112 | let refs_before = |
110 | 113 | ctx.scoping().resolved_references().flatten().copied().collect::<FxHashSet<_>>(); |
111 | 114 | let mut counter = ReferencesCounter::default(); |
@@ -155,18 +158,26 @@ impl<'a> Traverse<'a, MinifierState<'a>> for PeepholeOptimizations { |
155 | 158 | ctx: &mut TraverseCtx<'a>, |
156 | 159 | ) { |
157 | 160 | let mut ctx = Ctx::new(ctx); |
158 | | - |
159 | 161 | self.substitute_variable_declaration(decl, &mut ctx); |
160 | 162 | } |
161 | 163 |
|
162 | | - fn exit_expression(&mut self, expr: &mut Expression<'a>, ctx: &mut TraverseCtx<'a>) { |
| 164 | + fn exit_variable_declarator( |
| 165 | + &mut self, |
| 166 | + decl: &mut VariableDeclarator<'a>, |
| 167 | + ctx: &mut TraverseCtx<'a>, |
| 168 | + ) { |
163 | 169 | let mut ctx = Ctx::new(ctx); |
| 170 | + self.init_symbol_value(decl, &mut ctx); |
| 171 | + } |
164 | 172 |
|
| 173 | + fn exit_expression(&mut self, expr: &mut Expression<'a>, ctx: &mut TraverseCtx<'a>) { |
| 174 | + let mut ctx = Ctx::new(ctx); |
165 | 175 | self.fold_constants_exit_expression(expr, &mut ctx); |
166 | 176 | self.minimize_conditions_exit_expression(expr, &mut ctx); |
167 | 177 | self.remove_dead_code_exit_expression(expr, &mut ctx); |
168 | 178 | self.replace_known_methods_exit_expression(expr, &mut ctx); |
169 | 179 | self.substitute_exit_expression(expr, &mut ctx); |
| 180 | + self.inline_identifier_reference(expr, &mut ctx); |
170 | 181 | } |
171 | 182 |
|
172 | 183 | fn exit_unary_expression(&mut self, expr: &mut UnaryExpression<'a>, ctx: &mut TraverseCtx<'a>) { |
|
0 commit comments