Skip to content

Commit

Permalink
fix(es/minifier): should not drop statements which has side-effects
Browse files Browse the repository at this point in the history
  • Loading branch information
hyf0 committed Nov 18, 2022
1 parent a4ed624 commit e8f930d
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 9 deletions.
25 changes: 16 additions & 9 deletions crates/swc_ecma_minifier/src/compress/optimize/mod.rs
Expand Up @@ -1918,15 +1918,22 @@ where
#[cfg(feature = "debug")]
let start = dump(&n.expr, true);

let expr = self.ignore_return_value(&mut n.expr);
n.expr = expr.map(Box::new).unwrap_or_else(|| {
report_change!("visit_mut_expr_stmt: Dropped an expression statement");

#[cfg(feature = "debug")]
dump_change_detail!("Removed {}", start);

undefined(DUMMY_SP)
});
let is_object_lit_with_spread = n
.expr
.as_object()
.map(|object_lit| object_lit.props.iter().any(|prop| prop.is_spread()))
.unwrap_or(false);

if !is_object_lit_with_spread {
let expr = self.ignore_return_value(&mut n.expr);
n.expr = expr.map(Box::new).unwrap_or_else(|| {
report_change!("visit_mut_expr_stmt: Dropped an expression statement");
#[cfg(feature = "debug")]
dump_change_detail!("Removed {}", start);

undefined(DUMMY_SP)
});
}
} else {
match &mut *n.expr {
Expr::Seq(e) => {
Expand Down
@@ -0,0 +1,4 @@
{
"toplevel": true,
"unused": true
}
10 changes: 10 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/6422/2/input.js
@@ -0,0 +1,10 @@
import assert from 'assert'
let result = 'FAIL';
const unused = {
...{
get prop() {
result = 'PASS';
}
}
};
assert.strictEqual(result, 'PASS');
10 changes: 10 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/6422/2/output.js
@@ -0,0 +1,10 @@
import assert from 'assert';
let result = 'FAIL';
({
...{
get prop () {
result = 'PASS';
}
}
});
assert.strictEqual(result, 'PASS');
@@ -0,0 +1,4 @@
{
"toplevel": true,
"unused": true
}
18 changes: 18 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/6422/3/input.js
@@ -0,0 +1,18 @@
import assert from 'assert'
let result = 0;
const unused = {
...{
get prop() {
result = 1;
}
},
[assert.strictEqual(result, 1)]: null,
[result = 2]: null,
[assert.strictEqual(result, 2)]: null,
...{
get prop() {
result = 3;
}
}
};
assert.strictEqual(result, 3);
18 changes: 18 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/6422/3/output.js
@@ -0,0 +1,18 @@
import assert from 'assert';
let result = 0;
({
...{
get prop () {
result = 1;
}
},
[assert.strictEqual(result, 1)]: null,
[result = 2]: null,
[assert.strictEqual(result, 2)]: null,
...{
get prop () {
result = 3;
}
}
});
assert.strictEqual(result, 3);

0 comments on commit e8f930d

Please sign in to comment.