consolidate & enhance unused

- defer declaration removal in `collapse_vars`
- account for `AST_SymbolFunarg` in deduplication
This commit is contained in:
alexlamsl 2017-11-06 02:19:32 +08:00
parent 2c2fd89e34
commit 02fc19d4e4
4 changed files with 81 additions and 61 deletions

View File

@ -1009,6 +1009,10 @@ merge(Compressor.prototype, {
} }
} }
function get_rvalue(expr) {
return expr[expr instanceof AST_Assign ? "right" : "value"];
}
function get_lvalues(expr) { function get_lvalues(expr) {
var lvalues = Object.create(null); var lvalues = Object.create(null);
if (expr instanceof AST_Unary) return lvalues; if (expr instanceof AST_Unary) return lvalues;
@ -1019,7 +1023,7 @@ merge(Compressor.prototype, {
lvalues[sym.name] = lvalues[sym.name] || is_lhs(node, tw.parent()); lvalues[sym.name] = lvalues[sym.name] || is_lhs(node, tw.parent());
} }
}); });
expr[expr instanceof AST_Assign ? "right" : "value"].walk(tw); get_rvalue(expr).walk(tw);
return lvalues; return lvalues;
} }
@ -1044,6 +1048,8 @@ merge(Compressor.prototype, {
found = true; found = true;
if (node instanceof AST_VarDef) { if (node instanceof AST_VarDef) {
remove(node.name.definition().orig, node.name); remove(node.name.definition().orig, node.name);
node.value = null;
return node;
} }
return in_list ? MAP.skip : null; return in_list ? MAP.skip : null;
} }
@ -1052,16 +1058,13 @@ merge(Compressor.prototype, {
case 0: return null; case 0: return null;
case 1: return node.expressions[0]; case 1: return node.expressions[0];
} }
if (node instanceof AST_Definitions && node.definitions.length == 0 if (node instanceof AST_SimpleStatement && !node.body) return null;
|| node instanceof AST_SimpleStatement && !node.body) {
return null;
}
})); }));
} }
function value_has_side_effects(expr) { function value_has_side_effects(expr) {
if (expr instanceof AST_Unary) return false; if (expr instanceof AST_Unary) return false;
return expr[expr instanceof AST_Assign ? "right" : "value"].has_side_effects(compressor); return get_rvalue(expr).has_side_effects(compressor);
} }
function references_in_scope(def) { function references_in_scope(def) {
@ -2303,7 +2306,7 @@ merge(Compressor.prototype, {
// this scope (not in nested scopes). // this scope (not in nested scopes).
var scope = this; var scope = this;
var tw = new TreeWalker(function(node, descend){ var tw = new TreeWalker(function(node, descend){
if (node !== self) { if (node === self) return;
if (node instanceof AST_Defun) { if (node instanceof AST_Defun) {
if (!drop_funcs && scope === self) { if (!drop_funcs && scope === self) {
var node_def = node.name.definition(); var node_def = node.name.definition();
@ -2315,6 +2318,9 @@ merge(Compressor.prototype, {
initializations.add(node.name.name, node); initializations.add(node.name.name, node);
return true; // don't go in nested scopes return true; // don't go in nested scopes
} }
if (node instanceof AST_SymbolFunarg && scope === self) {
var_defs_by_id.add(node.definition().id, node);
}
if (node instanceof AST_Definitions && scope === self) { if (node instanceof AST_Definitions && scope === self) {
node.definitions.forEach(function(def){ node.definitions.forEach(function(def){
var node_def = def.name.definition(); var node_def = def.name.definition();
@ -2358,7 +2364,6 @@ merge(Compressor.prototype, {
scope = save_scope; scope = save_scope;
return true; return true;
} }
}
}); });
self.walk(tw); self.walk(tw);
// pass 2: for every used symbol we need to walk its // pass 2: for every used symbol we need to walk its

View File

@ -1388,6 +1388,7 @@ issue_1605_1: {
options = { options = {
collapse_vars: true, collapse_vars: true,
toplevel: false, toplevel: false,
unused: true,
} }
input: { input: {
function foo(x) { function foo(x) {
@ -1410,6 +1411,7 @@ issue_1605_2: {
options = { options = {
collapse_vars: true, collapse_vars: true,
toplevel: "vars", toplevel: "vars",
unused: true,
} }
input: { input: {
function foo(x) { function foo(x) {
@ -1537,6 +1539,7 @@ issue_1631_3: {
var_side_effects_1: { var_side_effects_1: {
options = { options = {
collapse_vars: true, collapse_vars: true,
unused: true,
} }
input: { input: {
var print = console.log.bind(console); var print = console.log.bind(console);
@ -1559,6 +1562,7 @@ var_side_effects_1: {
var_side_effects_2: { var_side_effects_2: {
options = { options = {
collapse_vars: true, collapse_vars: true,
unused: true,
} }
input: { input: {
var print = console.log.bind(console); var print = console.log.bind(console);
@ -1584,6 +1588,7 @@ var_side_effects_3: {
collapse_vars: true, collapse_vars: true,
pure_getters: true, pure_getters: true,
unsafe: true, unsafe: true,
unused: true,
} }
input: { input: {
var print = console.log.bind(console); var print = console.log.bind(console);
@ -1659,6 +1664,7 @@ iife_2: {
}(foo); }(foo);
} }
expect: { expect: {
var foo;
!function(x) { !function(x) {
console.log(x); console.log(x);
}(bar()); }(bar());
@ -1945,6 +1951,7 @@ ref_scope: {
chained_1: { chained_1: {
options = { options = {
collapse_vars: true, collapse_vars: true,
unused: true,
} }
input: { input: {
var a = 2; var a = 2;
@ -1961,6 +1968,7 @@ chained_1: {
chained_2: { chained_2: {
options = { options = {
collapse_vars: true, collapse_vars: true,
unused: true,
} }
input: { input: {
var a; var a;
@ -2061,6 +2069,7 @@ inner_lvalues: {
double_def: { double_def: {
options = { options = {
collapse_vars: true, collapse_vars: true,
unused: true,
} }
input: { input: {
var a = x, a = a && y; var a = x, a = a && y;
@ -2075,6 +2084,7 @@ double_def: {
toplevel_single_reference: { toplevel_single_reference: {
options = { options = {
collapse_vars: true, collapse_vars: true,
unused: true,
} }
input: { input: {
var a; var a;
@ -2084,10 +2094,11 @@ toplevel_single_reference: {
} }
} }
expect: { expect: {
for (var b in x) {
var a; var a;
for (var b in x)
b(a = b); b(a = b);
} }
}
} }
unused_orig: { unused_orig: {
@ -2889,6 +2900,7 @@ pure_getters_chain: {
options = { options = {
collapse_vars: true, collapse_vars: true,
pure_getters: true, pure_getters: true,
unused: true,
} }
input: { input: {
function o(t, r) { function o(t, r) {
@ -2909,6 +2921,7 @@ pure_getters_chain: {
conditional_1: { conditional_1: {
options = { options = {
collapse_vars: true, collapse_vars: true,
unused: true,
} }
input: { input: {
function f(a, b) { function f(a, b) {
@ -2933,6 +2946,7 @@ conditional_1: {
conditional_2: { conditional_2: {
options = { options = {
collapse_vars: true, collapse_vars: true,
unused: true,
} }
input: { input: {
function f(a, b) { function f(a, b) {

View File

@ -51,6 +51,7 @@ this_binding_collapse_vars: {
options = { options = {
collapse_vars: true, collapse_vars: true,
toplevel: true, toplevel: true,
unused: true,
}; };
input: { input: {
var c = a; c(); var c = a; c();

View File

@ -2131,14 +2131,13 @@ redefine_farg_1: {
} }
expect: { expect: {
function f(a) { function f(a) {
var a;
return typeof a; return typeof a;
} }
function g() { function g() {
return"number"; return "number";
} }
function h(a, b) { function h(a, b) {
var a = b; a = b;
return typeof a; return typeof a;
} }
console.log(f([]), g([]), h([])); console.log(f([]), g([]), h([]));
@ -2173,10 +2172,9 @@ redefine_farg_2: {
} }
expect: { expect: {
console.log(function(a) { console.log(function(a) {
var a;
return typeof a; return typeof a;
}([]), "number",function(a, b) { }([]), "number",function(a, b) {
var a = b; a = b;
return typeof a; return typeof a;
}([])); }([]));
} }
@ -2185,11 +2183,13 @@ redefine_farg_2: {
redefine_farg_3: { redefine_farg_3: {
options = { options = {
cascade: true,
evaluate: true, evaluate: true,
inline: true, inline: true,
keep_fargs: false, keep_fargs: false,
passes: 3, passes: 2,
reduce_vars: true, reduce_vars: true,
sequences: true,
side_effects: true, side_effects: true,
toplevel: true, toplevel: true,
unused: true, unused: true,