Skip to content

Commit fd997d3

Browse files
kdy1Austaras
andauthoredFeb 2, 2024
feat(es/minifier): Respect more options (#8582)
**Description:** This PR makes the ES minifier respect more options. Changes: - `reduce_vars` now enables IIFE invoker. - `reduce_vars` now enables seq inliner. - `top_retain` is now respected by seq inliner. - `arguments` is now ignored by seq inliner. --------- Co-authored-by: austaras <austaras@outlook.com>
1 parent 507c469 commit fd997d3

File tree

36 files changed

+175
-208
lines changed

36 files changed

+175
-208
lines changed
 

‎crates/swc_ecma_minifier/src/compress/optimize/iife.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,9 @@ impl Optimizer<'_> {
430430
pub(super) fn invoke_iife(&mut self, e: &mut Expr) {
431431
trace_op!("iife: invoke_iife");
432432

433-
if self.options.inline == 0 {
433+
if self.options.inline == 0
434+
&& !(self.options.reduce_vars && self.options.reduce_fns && self.options.evaluate)
435+
{
434436
let skip = match e {
435437
Expr::Call(v) => !v.callee.span().is_dummy(),
436438
_ => true,

‎crates/swc_ecma_minifier/src/compress/optimize/mod.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use crate::{
3131
maybe_par,
3232
mode::Mode,
3333
option::{CompressOptions, MangleOptions},
34-
program_data::ProgramData,
34+
program_data::{ProgramData, VarUsageInfo},
3535
util::{
3636
contains_eval, contains_leaping_continue_with_label, make_number, ExprOptExt, ModuleItemExt,
3737
},
@@ -323,7 +323,7 @@ impl From<&Function> for FnMetadata {
323323

324324
impl Optimizer<'_> {
325325
fn may_remove_ident(&self, id: &Ident) -> bool {
326-
if self.ctx.is_exported {
326+
if let Some(VarUsageInfo { exported: true, .. }) = self.data.vars.get(&id.clone().to_id()) {
327327
return false;
328328
}
329329

@@ -2041,6 +2041,7 @@ impl VisitMut for Optimizer<'_> {
20412041

20422042
let ctx = Ctx {
20432043
top_level: false,
2044+
in_fn_like: true,
20442045
is_lhs_of_assign: false,
20452046
is_exact_lhs_of_assign: false,
20462047
..self.ctx
@@ -2062,7 +2063,14 @@ impl VisitMut for Optimizer<'_> {
20622063
}
20632064
}
20642065

2065-
e.visit_mut_children_with(self);
2066+
let ctx = Ctx {
2067+
top_level: false,
2068+
in_fn_like: true,
2069+
is_lhs_of_assign: false,
2070+
is_exact_lhs_of_assign: false,
2071+
..self.ctx
2072+
};
2073+
e.visit_mut_children_with(&mut *self.with_ctx(ctx));
20662074
}
20672075

20682076
#[cfg_attr(feature = "debug", tracing::instrument(skip_all))]

‎crates/swc_ecma_minifier/src/compress/optimize/sequences.rs

+21-2
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,16 @@ impl Optimizer<'_> {
557557
options: &CompressOptions,
558558
) -> Option<Vec<Mergable<'a>>> {
559559
Some(match s {
560-
Stmt::Expr(e) => vec![Mergable::Expr(&mut e.expr)],
560+
Stmt::Expr(e) => {
561+
if self.options.sequences()
562+
|| self.options.collapse_vars
563+
|| self.options.side_effects
564+
{
565+
vec![Mergable::Expr(&mut e.expr)]
566+
} else {
567+
return None;
568+
}
569+
}
561570
Stmt::Decl(Decl::Var(v)) => {
562571
if options.reduce_vars || options.collapse_vars {
563572
v.decls.iter_mut().map(Mergable::Var).collect()
@@ -612,7 +621,7 @@ impl Optimizer<'_> {
612621
where
613622
T: ModuleItemExt,
614623
{
615-
if !self.options.sequences() && !self.options.collapse_vars {
624+
if !self.options.sequences() && !self.options.collapse_vars && !self.options.reduce_vars {
616625
log_abort!("sequences: [x] Disabled");
617626
return;
618627
}
@@ -1513,6 +1522,16 @@ impl Optimizer<'_> {
15131522
)
15141523
};
15151524

1525+
// Respect top_retain
1526+
if let Some(a_id) = a.id() {
1527+
if a_id.0 == "arguments"
1528+
|| (matches!(a, Mergable::Var(_) | Mergable::FnDecl(_))
1529+
&& !self.may_remove_ident(&Ident::from(a_id)))
1530+
{
1531+
return Ok(false);
1532+
}
1533+
}
1534+
15161535
if match &*b {
15171536
Expr::Arrow(..)
15181537
| Expr::Fn(..)

‎crates/swc_ecma_minifier/tests/TODO.txt

-10
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ collapse_vars/issue_1858/input.js
4343
collapse_vars/issue_2187_2/input.js
4444
collapse_vars/issue_2203_2/input.js
4545
collapse_vars/issue_2203_4/input.js
46-
collapse_vars/issue_2298/input.js
4746
collapse_vars/issue_2319_1/input.js
4847
collapse_vars/issue_2319_3/input.js
4948
collapse_vars/issue_2436_1/input.js
@@ -119,11 +118,8 @@ drop_unused/issue_2660_2/input.js
119118
drop_unused/issue_2665/input.js
120119
drop_unused/issue_2846/input.js
121120
drop_unused/issue_t161_top_retain_10/input.js
122-
drop_unused/issue_t161_top_retain_11/input.js
123121
drop_unused/issue_t161_top_retain_12/input.js
124122
drop_unused/issue_t161_top_retain_15/input.js
125-
drop_unused/issue_t161_top_retain_8/input.js
126-
drop_unused/issue_t161_top_retain_9/input.js
127123
drop_unused/issue_t183/input.js
128124
drop_unused/keep_assign/input.js
129125
drop_unused/reassign_const/input.js
@@ -159,7 +155,6 @@ functions/issue_2107/input.js
159155
functions/issue_2114_1/input.js
160156
functions/issue_2114_2/input.js
161157
functions/issue_2601_2/input.js
162-
functions/issue_2604_2/input.js
163158
functions/issue_2620_2/input.js
164159
functions/issue_2620_3/input.js
165160
functions/issue_2630_2/input.js
@@ -297,13 +292,8 @@ reduce_vars/iife/input.js
297292
reduce_vars/iife_new/input.js
298293
reduce_vars/inner_var_for_2/input.js
299294
reduce_vars/inverted_var/input.js
300-
reduce_vars/issue_1595_3/input.js
301-
reduce_vars/issue_1670_2/input.js
302-
reduce_vars/issue_1670_4/input.js
303-
reduce_vars/issue_1670_5/input.js
304295
reduce_vars/issue_1850_2/input.js
305296
reduce_vars/issue_2485/input.js
306-
reduce_vars/issue_2757_1/input.js
307297
reduce_vars/issue_2799_2/input.js
308298
reduce_vars/issue_2836/input.js
309299
reduce_vars/issue_2860_2/input.js

‎crates/swc_ecma_minifier/tests/fixture/next/56408/output.js

+78-85
Large diffs are not rendered by default.

‎crates/swc_ecma_minifier/tests/passing.txt

+10
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ collapse_vars/issue_2203_1/input.js
188188
collapse_vars/issue_2203_3/input.js
189189
collapse_vars/issue_2250_1/input.js
190190
collapse_vars/issue_2250_2/input.js
191+
collapse_vars/issue_2298/input.js
191192
collapse_vars/issue_2313_1/input.js
192193
collapse_vars/issue_2313_2/input.js
193194
collapse_vars/issue_2319_2/input.js
@@ -459,6 +460,7 @@ drop_unused/issue_3192/input.js
459460
drop_unused/issue_805_1/input.js
460461
drop_unused/issue_805_2/input.js
461462
drop_unused/issue_t161_top_retain_1/input.js
463+
drop_unused/issue_t161_top_retain_11/input.js
462464
drop_unused/issue_t161_top_retain_13/input.js
463465
drop_unused/issue_t161_top_retain_14/input.js
464466
drop_unused/issue_t161_top_retain_2/input.js
@@ -467,6 +469,8 @@ drop_unused/issue_t161_top_retain_4/input.js
467469
drop_unused/issue_t161_top_retain_5/input.js
468470
drop_unused/issue_t161_top_retain_6/input.js
469471
drop_unused/issue_t161_top_retain_7/input.js
472+
drop_unused/issue_t161_top_retain_8/input.js
473+
drop_unused/issue_t161_top_retain_9/input.js
470474
drop_unused/keep_fnames/input.js
471475
drop_unused/unused_block_decls/input.js
472476
drop_unused/unused_block_decls_in_catch/input.js
@@ -624,6 +628,7 @@ functions/issue_2531_2/input.js
624628
functions/issue_2531_3/input.js
625629
functions/issue_2601_1/input.js
626630
functions/issue_2604_1/input.js
631+
functions/issue_2604_2/input.js
627632
functions/issue_2616/input.js
628633
functions/issue_2620_1/input.js
629634
functions/issue_2620_4/input.js
@@ -1308,10 +1313,14 @@ reduce_vars/issue_1533_1/input.js
13081313
reduce_vars/issue_1533_2/input.js
13091314
reduce_vars/issue_1595_1/input.js
13101315
reduce_vars/issue_1595_2/input.js
1316+
reduce_vars/issue_1595_3/input.js
13111317
reduce_vars/issue_1595_4/input.js
13121318
reduce_vars/issue_1606/input.js
13131319
reduce_vars/issue_1670_1/input.js
1320+
reduce_vars/issue_1670_2/input.js
13141321
reduce_vars/issue_1670_3/input.js
1322+
reduce_vars/issue_1670_4/input.js
1323+
reduce_vars/issue_1670_5/input.js
13151324
reduce_vars/issue_1670_6/input.js
13161325
reduce_vars/issue_1814_1/input.js
13171326
reduce_vars/issue_1814_2/input.js
@@ -1352,6 +1361,7 @@ reduce_vars/issue_2496/input.js
13521361
reduce_vars/issue_2598/input.js
13531362
reduce_vars/issue_2669/input.js
13541363
reduce_vars/issue_2670/input.js
1364+
reduce_vars/issue_2757_1/input.js
13551365
reduce_vars/issue_2757_2/input.js
13561366
reduce_vars/issue_2774/input.js
13571367
reduce_vars/issue_2799_1/input.js

‎crates/swc_ecma_minifier/tests/terser/compress/drop_unused/issue_t161_top_retain_14/output.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ class Alpha {
44
}
55
}
66
let x = 2, z = 4;
7-
console.log(2, 3, 4, 6, 8, 12, 2, 3, 4, new Alpha().num(), new class {
7+
console.log(2, 3, z, 6, 2 * z, 3 * z, 2, 3, z, new Alpha().num(), new class {
88
num() {
99
return 3;
1010
}
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1-
console.log(2, 3);
1+
function f() {
2+
return 2;
3+
}
4+
console.log(f(), 3);
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
function f() {
2-
var a = (function () {
2+
return (function() {
33
return x();
4-
})();
5-
return a(42);
4+
})()(42);
65
}

‎crates/swc_ecma_minifier/tests/terser/compress/functions/issue_2663_3/output.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
(function(outputs) {
22
var handlers = [];
33
for(var i = 0; i < outputs.length; i++){
4-
var output = outputs[i];
54
var handleEventClosure = function(eventName) {
65
return function() {
76
return console.log(eventName);
87
};
9-
}(output.eventName);
8+
}(outputs[i].eventName);
109
handlers.push(handleEventClosure);
1110
}
1211
return handlers;
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
(function() {
22
(function() {
3-
{
4-
const data = function(data) {
5-
return data[data[0]];
6-
}([
7-
1,
8-
2,
9-
3
10-
]);
11-
console.log(data);
12-
}
3+
console.log(function(data) {
4+
return data[data[0]];
5+
}([
6+
1,
7+
2,
8+
3
9+
]));
1310
})();
1411
})();
Original file line numberDiff line numberDiff line change
@@ -1,5 +1 @@
1-
(function () {
2-
(function () {
3-
f(1).bar = 1;
4-
})();
5-
})();
1+
f(1).bar = 1;
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
(function () {
2-
(function () {
3-
var b = "long piece of string";
4-
f(b).bar = b;
5-
})();
1+
(function() {
2+
var b;
3+
b = "long piece of string", f(b).bar = b;
64
})();
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
11
var b = 10;
2-
!function() {
3-
b = 100;
4-
}(), console.log(100, b);
2+
console.log(100, b = 100);
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
!(function () {
1+
!function() {
22
var a;
33
console.log(a);
4-
})();
4+
}();
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
!(function () {
1+
!function() {
22
var a;
33
console.log(a);
4-
})();
4+
}();

‎crates/swc_ecma_minifier/tests/terser/compress/reduce_vars/defun_reference/output.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@ function f() {
33
x();
44
return a;
55
}
6-
var a = function() {
7-
y();
8-
return 2;
9-
}();
6+
var a = (y(), 2);
107
var b = 2;
118
return a + 2;
129
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1 @@
1-
!(function () {
2-
var a = 1,
3-
b = 0;
4-
!(function () {
5-
b++;
6-
return;
7-
a = 2;
8-
})();
9-
console.log(a);
10-
})();
1+
console.log(1);
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
!(function () {
2-
console.log("test".indexOf("e"));
3-
})();
1+
console.log("test".indexOf("e"));

‎crates/swc_ecma_minifier/tests/terser/compress/reduce_vars/inner_var_for_in_1/output.js

+3-7
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
function f() {
2-
var a = 1,
3-
b = 2;
4-
for (b in (function () {
5-
return x(1, b, c);
6-
})()) {
7-
var c = 3,
8-
d = 4;
2+
var a = 1, b = 2;
3+
for(b in x(1, b, c)){
4+
var c = 3, d = 4;
95
x(1, b, c, d);
106
}
117
x(1, b, c, d);
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
(function(a) {
2-
return g(3);
3-
})(0);
1+
g(3);
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
(function (a) {
2-
return g(3);
3-
})();
1+
g(3);
Original file line numberDiff line numberDiff line change
@@ -1,4 +1 @@
1-
(function () {
2-
var a;
3-
void 0 === a ? console.log("PASS") : console.log("FAIL");
4-
})();
1+
console.log("PASS");
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
(function () {
2-
console.log("PASS");
3-
})();
1+
console.log("PASS");
Original file line numberDiff line numberDiff line change
@@ -1,4 +1 @@
1-
(function () {
2-
var a;
3-
void 0 === a ? console.log("PASS") : console.log("FAIL");
4-
})();
1+
console.log("PASS");
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
(function () {
2-
console.log("PASS");
3-
})();
1+
console.log("PASS");
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
(function () {
2-
console.log(1);
3-
})();
1+
console.log(1);
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
const a = 42;
22
!function() {
3-
!function(a) {
4-
console.log(a++, 42);
5-
}(0);
3+
var a;
4+
a = 0, console.log(a++, 42);
65
}();
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
const a = "32";
22
!function() {
3-
!function(a) {
4-
console.log("321", a++);
5-
}(0);
3+
var a;
4+
a = 0, console.log("321", a++);
65
}();
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
var b = 1;
2-
var a = b += 1, b = NaN;
1+
var b;
2+
var a = b = 2, b = NaN;
33
console.log(a, b);
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
11
var x = 3;
2-
do (function() {
3-
console.log("bar:", --x);
4-
})();
2+
do console.log("bar:", --x);
53
while (x)
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
for(;;)(function() {
2-
console.log("bar:");
3-
})();
1+
for(;;)console.log("bar:");
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
!(function () {
2-
console.log(2);
3-
})();
1+
console.log(2);
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
!function() {
2-
console.log(2);
3-
}();
1+
console.log(2);
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
!function() {
22
var a;
3-
!function(b) {
4-
console.log(a = 2, b);
5-
}(a);
3+
var b;
4+
b = a, console.log(a = 2, b);
65
}();
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
!(function () {
2-
var a = (function () {})((a = 1));
1+
!function() {
2+
var a = void (a = 1);
33
console.log(a);
4-
})();
4+
}();

0 commit comments

Comments
 (0)
Please sign in to comment.