mirror of
https://github.com/swc-project/swc.git
synced 2024-12-29 00:23:10 +03:00
fix(es/minifier): Skip getter/setter when collapsing vars (#4557)
This commit is contained in:
parent
56fb1c8762
commit
5d3a01ad35
@ -1,12 +1,14 @@
|
||||
var num, strOrNum, var1, var2, var21, obj1 = {
|
||||
var num, strOrNum, var1, obj1 = {
|
||||
method (param) {
|
||||
var var22;
|
||||
return num = "string" == typeof var1 && var1.length, num = "string" == typeof var22 && var22.length, num = "string" == typeof param && param.length, strOrNum;
|
||||
},
|
||||
get prop () {
|
||||
var var2;
|
||||
return num = "string" == typeof var1 && var1.length, num = "string" == typeof var2 && var2.length, strOrNum;
|
||||
},
|
||||
set prop (param){
|
||||
var var21;
|
||||
num = "string" == typeof var1 && var1.length, num = "string" == typeof var21 && var21.length, num = "string" == typeof param && param.length;
|
||||
}
|
||||
};
|
||||
|
@ -1,12 +1,14 @@
|
||||
var num, strOrNum, var1, var2, var21, obj1 = {
|
||||
var num, strOrNum, var1, obj1 = {
|
||||
method: function(param) {
|
||||
var var22;
|
||||
return num = "string" == typeof var1 && var1.length, num = "string" == typeof var22 && var22.length, num = "string" == typeof param && param.length, strOrNum;
|
||||
},
|
||||
get prop () {
|
||||
var var2;
|
||||
return num = "string" == typeof var1 && var1.length, num = "string" == typeof var2 && var2.length, strOrNum;
|
||||
},
|
||||
set prop (param){
|
||||
var var21;
|
||||
num = "string" == typeof var1 && var1.length, num = "string" == typeof var21 && var21.length, num = "string" == typeof param && param.length;
|
||||
}
|
||||
};
|
||||
|
@ -63,7 +63,7 @@ where
|
||||
};
|
||||
|
||||
report_change!(
|
||||
"collpase_vars: Decided to inline {}{:?}",
|
||||
"collapse_vars: Decided to inline {}{:?}",
|
||||
left.id.sym,
|
||||
left.id.span.ctxt
|
||||
);
|
||||
|
@ -258,6 +258,10 @@ impl Visit for VarWithOutInitCounter {
|
||||
|
||||
fn visit_function(&mut self, _: &Function) {}
|
||||
|
||||
fn visit_getter_prop(&mut self, _: &GetterProp) {}
|
||||
|
||||
fn visit_setter_prop(&mut self, _: &SetterProp) {}
|
||||
|
||||
fn visit_var_decl(&mut self, v: &VarDecl) {
|
||||
v.visit_children_with(self);
|
||||
|
||||
@ -314,6 +318,10 @@ impl VisitMut for VarMover {
|
||||
/// Noop
|
||||
fn visit_mut_function(&mut self, _: &mut Function) {}
|
||||
|
||||
fn visit_mut_getter_prop(&mut self, _: &mut GetterProp) {}
|
||||
|
||||
fn visit_mut_setter_prop(&mut self, _: &mut SetterProp) {}
|
||||
|
||||
fn visit_mut_module_item(&mut self, s: &mut ModuleItem) {
|
||||
if let ModuleItem::Stmt(_) = s {
|
||||
s.visit_mut_children_with(self);
|
||||
@ -411,6 +419,10 @@ impl VisitMut for VarPrepender {
|
||||
/// Noop
|
||||
fn visit_mut_function(&mut self, _: &mut Function) {}
|
||||
|
||||
fn visit_mut_getter_prop(&mut self, _: &mut GetterProp) {}
|
||||
|
||||
fn visit_mut_setter_prop(&mut self, _: &mut SetterProp) {}
|
||||
|
||||
fn visit_mut_var_decl(&mut self, v: &mut VarDecl) {
|
||||
if self.vars.is_empty() {
|
||||
return;
|
||||
|
@ -0,0 +1,198 @@
|
||||
TestSnapshot {
|
||||
vars: [
|
||||
(
|
||||
(
|
||||
Atom('B' type=inline),
|
||||
#2,
|
||||
),
|
||||
VarUsageInfo {
|
||||
inline_prevented: false,
|
||||
ref_count: 1,
|
||||
cond_init: false,
|
||||
declared: false,
|
||||
declared_count: 0,
|
||||
declared_as_fn_param: false,
|
||||
declared_as_fn_expr: false,
|
||||
assign_count: 0,
|
||||
mutation_by_call_count: 0,
|
||||
usage_count: 1,
|
||||
reassigned_with_assignment: false,
|
||||
reassigned_with_var_decl: false,
|
||||
mutated: true,
|
||||
has_property_access: true,
|
||||
has_property_mutation: true,
|
||||
accessed_props: {},
|
||||
exported: false,
|
||||
used_above_decl: true,
|
||||
is_fn_local: true,
|
||||
used_by_nested_fn: false,
|
||||
executed_multiple_time: false,
|
||||
used_in_cond: false,
|
||||
var_kind: None,
|
||||
var_initialized: false,
|
||||
declared_as_catch_param: false,
|
||||
no_side_effect_for_member_access: false,
|
||||
used_as_callee: false,
|
||||
used_as_arg: false,
|
||||
pure_fn: false,
|
||||
infects: [],
|
||||
},
|
||||
),
|
||||
(
|
||||
(
|
||||
Atom('a' type=inline),
|
||||
#3,
|
||||
),
|
||||
VarUsageInfo {
|
||||
inline_prevented: false,
|
||||
ref_count: 3,
|
||||
cond_init: false,
|
||||
declared: true,
|
||||
declared_count: 1,
|
||||
declared_as_fn_param: false,
|
||||
declared_as_fn_expr: false,
|
||||
assign_count: 1,
|
||||
mutation_by_call_count: 0,
|
||||
usage_count: 2,
|
||||
reassigned_with_assignment: true,
|
||||
reassigned_with_var_decl: false,
|
||||
mutated: true,
|
||||
has_property_access: false,
|
||||
has_property_mutation: false,
|
||||
accessed_props: {},
|
||||
exported: false,
|
||||
used_above_decl: false,
|
||||
is_fn_local: true,
|
||||
used_by_nested_fn: false,
|
||||
executed_multiple_time: true,
|
||||
used_in_cond: true,
|
||||
var_kind: Some(
|
||||
"var",
|
||||
),
|
||||
var_initialized: true,
|
||||
declared_as_catch_param: false,
|
||||
no_side_effect_for_member_access: true,
|
||||
used_as_callee: false,
|
||||
used_as_arg: false,
|
||||
pure_fn: false,
|
||||
infects: [],
|
||||
},
|
||||
),
|
||||
(
|
||||
(
|
||||
Atom('getChildNodes$1' type=dynamic),
|
||||
#1,
|
||||
),
|
||||
VarUsageInfo {
|
||||
inline_prevented: false,
|
||||
ref_count: 1,
|
||||
cond_init: false,
|
||||
declared: true,
|
||||
declared_count: 1,
|
||||
declared_as_fn_param: false,
|
||||
declared_as_fn_expr: false,
|
||||
assign_count: 1,
|
||||
mutation_by_call_count: 0,
|
||||
usage_count: 0,
|
||||
reassigned_with_assignment: true,
|
||||
reassigned_with_var_decl: false,
|
||||
mutated: true,
|
||||
has_property_access: false,
|
||||
has_property_mutation: false,
|
||||
accessed_props: {},
|
||||
exported: false,
|
||||
used_above_decl: false,
|
||||
is_fn_local: false,
|
||||
used_by_nested_fn: true,
|
||||
executed_multiple_time: false,
|
||||
used_in_cond: false,
|
||||
var_kind: Some(
|
||||
"var",
|
||||
),
|
||||
var_initialized: false,
|
||||
declared_as_catch_param: false,
|
||||
no_side_effect_for_member_access: false,
|
||||
used_as_callee: false,
|
||||
used_as_arg: false,
|
||||
pure_fn: false,
|
||||
infects: [],
|
||||
},
|
||||
),
|
||||
(
|
||||
(
|
||||
Atom('getChildNodesImpl' type=dynamic),
|
||||
#4,
|
||||
),
|
||||
VarUsageInfo {
|
||||
inline_prevented: false,
|
||||
ref_count: 1,
|
||||
cond_init: false,
|
||||
declared: true,
|
||||
declared_count: 1,
|
||||
declared_as_fn_param: true,
|
||||
declared_as_fn_expr: false,
|
||||
assign_count: 0,
|
||||
mutation_by_call_count: 0,
|
||||
usage_count: 1,
|
||||
reassigned_with_assignment: false,
|
||||
reassigned_with_var_decl: false,
|
||||
mutated: false,
|
||||
has_property_access: false,
|
||||
has_property_mutation: false,
|
||||
accessed_props: {},
|
||||
exported: false,
|
||||
used_above_decl: false,
|
||||
is_fn_local: true,
|
||||
used_by_nested_fn: true,
|
||||
executed_multiple_time: false,
|
||||
used_in_cond: false,
|
||||
var_kind: None,
|
||||
var_initialized: false,
|
||||
declared_as_catch_param: false,
|
||||
no_side_effect_for_member_access: false,
|
||||
used_as_callee: false,
|
||||
used_as_arg: false,
|
||||
pure_fn: false,
|
||||
infects: [],
|
||||
},
|
||||
),
|
||||
(
|
||||
(
|
||||
Atom('setGetChildNodes' type=dynamic),
|
||||
#1,
|
||||
),
|
||||
VarUsageInfo {
|
||||
inline_prevented: true,
|
||||
ref_count: 0,
|
||||
cond_init: false,
|
||||
declared: true,
|
||||
declared_count: 1,
|
||||
declared_as_fn_param: false,
|
||||
declared_as_fn_expr: false,
|
||||
assign_count: 0,
|
||||
mutation_by_call_count: 0,
|
||||
usage_count: 0,
|
||||
reassigned_with_assignment: false,
|
||||
reassigned_with_var_decl: false,
|
||||
mutated: false,
|
||||
has_property_access: false,
|
||||
has_property_mutation: false,
|
||||
accessed_props: {},
|
||||
exported: false,
|
||||
used_above_decl: false,
|
||||
is_fn_local: true,
|
||||
used_by_nested_fn: false,
|
||||
executed_multiple_time: false,
|
||||
used_in_cond: false,
|
||||
var_kind: None,
|
||||
var_initialized: true,
|
||||
declared_as_catch_param: false,
|
||||
no_side_effect_for_member_access: false,
|
||||
used_as_callee: false,
|
||||
used_as_arg: false,
|
||||
pure_fn: false,
|
||||
infects: [],
|
||||
},
|
||||
),
|
||||
],
|
||||
}
|
10
crates/swc_ecma_minifier/tests/fixture/issues/4515/input.js
Normal file
10
crates/swc_ecma_minifier/tests/fixture/issues/4515/input.js
Normal file
@ -0,0 +1,10 @@
|
||||
B.c = {
|
||||
get foo() {
|
||||
for (var a = 1; a < 10; a++) {}
|
||||
},
|
||||
};
|
||||
|
||||
var getChildNodes$1;
|
||||
export function setGetChildNodes(getChildNodesImpl) {
|
||||
getChildNodes$1 = getChildNodesImpl;
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
var getChildNodes$1;
|
||||
B.c = {
|
||||
get foo () {
|
||||
for(var a = 1; a < 10; a++);
|
||||
}
|
||||
};
|
||||
export function setGetChildNodes(getChildNodesImpl) {
|
||||
getChildNodes$1 = getChildNodesImpl;
|
||||
}
|
Loading…
Reference in New Issue
Block a user