Skip to content

Commit fd997d3

Browse files
kdy1Austaras
andauthored
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

Lines changed: 3 additions & 1 deletion
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

Lines changed: 11 additions & 3 deletions
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

Lines changed: 21 additions & 2 deletions
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

Lines changed: 0 additions & 10 deletions
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

0 commit comments

Comments
 (0)