Skip to content

Commit 95761b7

Browse files
authoredMar 13, 2024··
fix(es/minifier): Make Finalizer handle hoisted_props correctly (#8738)
**Related issue:** - Closes #8737
1 parent 391d6f6 commit 95761b7

File tree

10 files changed

+193
-11
lines changed

10 files changed

+193
-11
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
{
2+
"jsc": {
3+
"parser": {
4+
"syntax": "ecmascript",
5+
"jsx": false
6+
},
7+
"target": "es5",
8+
"loose": false,
9+
"minify": {
10+
"compress": {
11+
"arguments": false,
12+
"arrows": true,
13+
"booleans": true,
14+
"booleans_as_integers": false,
15+
"collapse_vars": true,
16+
"comparisons": true,
17+
"computed_props": true,
18+
"conditionals": true,
19+
"dead_code": true,
20+
"directives": true,
21+
"drop_console": false,
22+
"drop_debugger": true,
23+
"evaluate": true,
24+
"expression": false,
25+
"hoist_funs": false,
26+
"hoist_props": true,
27+
"hoist_vars": false,
28+
"if_return": true,
29+
"join_vars": true,
30+
"keep_classnames": false,
31+
"keep_fargs": true,
32+
"keep_fnames": false,
33+
"keep_infinity": false,
34+
"loops": true,
35+
"negate_iife": true,
36+
"properties": true,
37+
"reduce_funcs": false,
38+
"reduce_vars": false,
39+
"side_effects": true,
40+
"switches": true,
41+
"typeofs": true,
42+
"unsafe": false,
43+
"unsafe_arrows": false,
44+
"unsafe_comps": false,
45+
"unsafe_Function": false,
46+
"unsafe_math": false,
47+
"unsafe_symbols": false,
48+
"unsafe_methods": false,
49+
"unsafe_proto": false,
50+
"unsafe_regexp": false,
51+
"unsafe_undefined": false,
52+
"unused": true,
53+
"const_to_let": true,
54+
"pristine_globals": true
55+
},
56+
"mangle": false
57+
}
58+
},
59+
"module": {
60+
"type": "es6"
61+
},
62+
"isModule": true
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
d(() => {
2+
var obj = {
3+
key: "some string",
4+
};
5+
6+
var b = () => {
7+
switch (a) {
8+
default:
9+
break;
10+
}
11+
return obj.key;
12+
};
13+
return () => b;
14+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
d(function() {
2+
var b = function() {
3+
return a, "some string";
4+
};
5+
return function() {
6+
return b;
7+
};
8+
});

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

+1
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ impl Vars {
269269
|| !self.lits.is_empty()
270270
|| !self.lits_for_cmp.is_empty()
271271
|| !self.lits_for_array_access.is_empty()
272+
|| !self.hoisted_props.is_empty()
272273
|| !self.removed.is_empty()
273274
{
274275
let mut v = Finalizer {

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

+22-11
Original file line numberDiff line numberDiff line change
@@ -405,24 +405,35 @@ impl VisitMut for Finalizer<'_> {
405405
}
406406

407407
fn visit_mut_expr(&mut self, n: &mut Expr) {
408-
if let Expr::Ident(i) = n {
409-
if let Some(expr) = self.lits.get(&i.to_id()) {
410-
*n = *expr.clone();
408+
match n {
409+
Expr::Ident(i) => {
410+
if let Some(expr) = self.lits.get(&i.to_id()) {
411+
*n = *expr.clone();
412+
return;
413+
}
411414
}
412-
} else {
413-
n.visit_mut_children_with(self);
414-
}
415-
416-
if let Expr::Member(e) = n {
417-
if let Expr::Ident(obj) = &*e.obj {
418-
if let MemberProp::Ident(prop) = &e.prop {
419-
if let Some(ident) = self.hoisted_props.get(&(obj.to_id(), prop.sym.clone())) {
415+
Expr::Member(e) => {
416+
if let Expr::Ident(obj) = &*e.obj {
417+
let sym = match &e.prop {
418+
MemberProp::Ident(i) => &i.sym,
419+
MemberProp::Computed(e) => match &*e.expr {
420+
Expr::Lit(Lit::Str(s)) => &s.value,
421+
_ => return,
422+
},
423+
_ => return,
424+
};
425+
426+
if let Some(ident) = self.hoisted_props.get(&(obj.to_id(), sym.clone())) {
420427
self.changed = true;
421428
*n = ident.clone().into();
429+
return;
422430
}
423431
}
424432
}
433+
_ => {}
425434
}
435+
436+
n.visit_mut_children_with(self);
426437
}
427438

428439
fn visit_mut_stmts(&mut self, n: &mut Vec<Stmt>) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
d(function () {
2+
var obj = {
3+
key: "some string"
4+
}, b = function () {
5+
return a, obj.key;
6+
};
7+
return function () {
8+
return b;
9+
};
10+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
d(function() {
2+
var b = function() {
3+
return a, "some string";
4+
};
5+
return function() {
6+
return b;
7+
};
8+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{
2+
"defaults": true,
3+
"arguments": false,
4+
"arrows": true,
5+
"booleans": true,
6+
"booleans_as_integers": false,
7+
"collapse_vars": true,
8+
"comparisons": true,
9+
"computed_props": true,
10+
"conditionals": true,
11+
"dead_code": true,
12+
"directives": true,
13+
"drop_console": false,
14+
"drop_debugger": true,
15+
"evaluate": true,
16+
"expression": false,
17+
"hoist_funs": false,
18+
"hoist_props": true,
19+
"hoist_vars": false,
20+
"if_return": true,
21+
"join_vars": true,
22+
"keep_classnames": false,
23+
"keep_fargs": true,
24+
"keep_fnames": false,
25+
"keep_infinity": false,
26+
"loops": true,
27+
"negate_iife": true,
28+
"properties": true,
29+
"reduce_funcs": false,
30+
"reduce_vars": false,
31+
"side_effects": true,
32+
"switches": true,
33+
"typeofs": true,
34+
"unsafe": false,
35+
"unsafe_arrows": false,
36+
"unsafe_comps": false,
37+
"unsafe_Function": false,
38+
"unsafe_math": false,
39+
"unsafe_symbols": false,
40+
"unsafe_methods": false,
41+
"unsafe_proto": false,
42+
"unsafe_regexp": false,
43+
"unsafe_undefined": false,
44+
"unused": true,
45+
"const_to_let": true,
46+
"pristine_globals": true
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
d(() => {
2+
var obj = {
3+
key: "some string",
4+
};
5+
6+
var b = () => {
7+
switch (a) {
8+
default:
9+
break;
10+
}
11+
return obj.key;
12+
};
13+
return () => b;
14+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
d(()=>{
2+
var obj = {
3+
key: "some string"
4+
}, b = ()=>(a, obj.key);
5+
return ()=>b;
6+
});

0 commit comments

Comments
 (0)
Please sign in to comment.