feat(minifier): dce all conditional expressions (#4135)

This commit is contained in:
Boshen 2024-07-09 18:28:33 +08:00 committed by GitHub
parent cb1af043b8
commit c6c16a5fc9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 11 additions and 9 deletions

View file

@ -44,20 +44,16 @@ impl<'a> RemoveDeadCode<'a> {
}
}
pub fn remove_conditional(&mut self, stmt: &mut Statement<'a>) {
let Statement::ExpressionStatement(expression_stmt) = stmt else { return };
let Expression::ConditionalExpression(conditional_expr) = &mut expression_stmt.expression
else {
pub fn remove_conditional(&mut self, expr: &mut Expression<'a>) {
let Expression::ConditionalExpression(conditional_expr) = expr else {
return;
};
match self.test_expression(&mut conditional_expr.test) {
Some(true) => {
expression_stmt.expression =
self.ast.move_expression(&mut conditional_expr.consequent);
*expr = self.ast.move_expression(&mut conditional_expr.consequent);
}
Some(false) => {
expression_stmt.expression =
self.ast.move_expression(&mut conditional_expr.alternate);
*expr = self.ast.move_expression(&mut conditional_expr.alternate);
}
_ => {}
}
@ -67,7 +63,10 @@ impl<'a> RemoveDeadCode<'a> {
impl<'a> VisitMut<'a> for RemoveDeadCode<'a> {
fn visit_statement(&mut self, stmt: &mut Statement<'a>) {
self.remove_if(stmt);
self.remove_conditional(stmt);
walk_mut::walk_statement(self, stmt);
}
fn visit_expression(&mut self, expr: &mut Expression<'a>) {
self.remove_conditional(expr);
}
}

View file

@ -42,6 +42,9 @@ fn remove_dead_code() {
test("!!false ? foo : bar;", "bar");
test("!!true ? foo : bar;", "foo");
test("const foo = true ? A : B", "const foo=A");
test("const foo = false ? A : B", "const foo=B");
// Shadowed `undefined` as a variable should not be erased.
test(
"function foo(undefined) { if (!undefined) { } }",