improve synergy between collapse_vars & unused (#2521)
This commit is contained in:
@@ -800,14 +800,6 @@ merge(Compressor.prototype, {
|
|||||||
|| compressor.option("unsafe") && global_names(this.name);
|
|| compressor.option("unsafe") && global_names(this.name);
|
||||||
});
|
});
|
||||||
|
|
||||||
function drop_decl(def) {
|
|
||||||
def.eliminated++;
|
|
||||||
if (def.orig.length == def.eliminated) {
|
|
||||||
def.scope.functions.del(def.name);
|
|
||||||
def.scope.variables.del(def.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function is_identifier_atom(node) {
|
function is_identifier_atom(node) {
|
||||||
return node instanceof AST_Infinity
|
return node instanceof AST_Infinity
|
||||||
|| node instanceof AST_NaN
|
|| node instanceof AST_NaN
|
||||||
@@ -1138,7 +1130,6 @@ merge(Compressor.prototype, {
|
|||||||
if (node === expr || node.body === expr) {
|
if (node === expr || node.body === expr) {
|
||||||
found = true;
|
found = true;
|
||||||
if (node instanceof AST_VarDef) {
|
if (node instanceof AST_VarDef) {
|
||||||
drop_decl(node.name.definition());
|
|
||||||
node.value = null;
|
node.value = null;
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
@@ -2484,7 +2475,7 @@ merge(Compressor.prototype, {
|
|||||||
var def = node.name.definition();
|
var def = node.name.definition();
|
||||||
if (!(def.id in in_use_ids)) {
|
if (!(def.id in in_use_ids)) {
|
||||||
compressor[node.name.unreferenced() ? "warn" : "info"]("Dropping unused function {name} [{file}:{line},{col}]", template(node.name));
|
compressor[node.name.unreferenced() ? "warn" : "info"]("Dropping unused function {name} [{file}:{line},{col}]", template(node.name));
|
||||||
drop_decl(def);
|
def.eliminated++;
|
||||||
return make_node(AST_EmptyStatement, node);
|
return make_node(AST_EmptyStatement, node);
|
||||||
}
|
}
|
||||||
return node;
|
return node;
|
||||||
@@ -2503,10 +2494,17 @@ merge(Compressor.prototype, {
|
|||||||
if (!drop_vars || sym.id in in_use_ids) {
|
if (!drop_vars || sym.id in in_use_ids) {
|
||||||
if (def.name instanceof AST_SymbolVar) {
|
if (def.name instanceof AST_SymbolVar) {
|
||||||
var var_defs = var_defs_by_id.get(sym.id);
|
var var_defs = var_defs_by_id.get(sym.id);
|
||||||
if (var_defs.length > 1 && !def.value) {
|
if (var_defs.length > 1 && (!def.value || sym.orig.indexOf(def.name) > sym.eliminated)) {
|
||||||
compressor.warn("Dropping duplicated definition of variable {name} [{file}:{line},{col}]", template(def.name));
|
compressor.warn("Dropping duplicated definition of variable {name} [{file}:{line},{col}]", template(def.name));
|
||||||
|
if (def.value) {
|
||||||
|
merge_sequence(side_effects, make_node(AST_Assign, def, {
|
||||||
|
operator: "=",
|
||||||
|
left: make_node(AST_SymbolRef, def.name, def.name),
|
||||||
|
right: def.value
|
||||||
|
}));
|
||||||
|
}
|
||||||
remove(var_defs, def);
|
remove(var_defs, def);
|
||||||
drop_decl(sym);
|
sym.eliminated++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2539,25 +2537,9 @@ merge(Compressor.prototype, {
|
|||||||
} else {
|
} else {
|
||||||
compressor[def.name.unreferenced() ? "warn" : "info"]("Dropping unused variable {name} [{file}:{line},{col}]", template(def.name));
|
compressor[def.name.unreferenced() ? "warn" : "info"]("Dropping unused variable {name} [{file}:{line},{col}]", template(def.name));
|
||||||
}
|
}
|
||||||
drop_decl(sym);
|
sym.eliminated++;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (head.length == 0 && tail.length == 1 && tail[0].name instanceof AST_SymbolVar) {
|
|
||||||
var var_defs = var_defs_by_id.get(tail[0].name.definition().id);
|
|
||||||
if (var_defs.length > 1) {
|
|
||||||
var def = tail.pop();
|
|
||||||
compressor.warn("Converting duplicated definition of variable {name} to assignment [{file}:{line},{col}]", template(def.name));
|
|
||||||
remove(var_defs, def);
|
|
||||||
side_effects.unshift(make_node(AST_Assign, def, {
|
|
||||||
operator: "=",
|
|
||||||
left: make_node(AST_SymbolRef, def.name, def.name),
|
|
||||||
right: def.value
|
|
||||||
}));
|
|
||||||
def = def.name.definition();
|
|
||||||
drop_decl(def);
|
|
||||||
def.replaced--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (head.length > 0 || tail.length > 0) {
|
if (head.length > 0 || tail.length > 0) {
|
||||||
node.definitions = head.concat(tail);
|
node.definitions = head.concat(tail);
|
||||||
body.push(node);
|
body.push(node);
|
||||||
@@ -3385,7 +3367,9 @@ merge(Compressor.prototype, {
|
|||||||
}));
|
}));
|
||||||
if (reduce_vars) name.definition().fixed = false;
|
if (reduce_vars) name.definition().fixed = false;
|
||||||
}
|
}
|
||||||
drop_decl(def.name.definition());
|
def = def.name.definition();
|
||||||
|
def.eliminated++;
|
||||||
|
def.replaced--;
|
||||||
return a;
|
return a;
|
||||||
}, []);
|
}, []);
|
||||||
if (assignments.length == 0) return null;
|
if (assignments.length == 0) return null;
|
||||||
|
|||||||
@@ -2013,7 +2013,8 @@ chained_3: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
console.log(function(a, b) {
|
console.log(function(a, b) {
|
||||||
var c = 1, c = b;
|
var c = 1;
|
||||||
|
c = b;
|
||||||
b++;
|
b++;
|
||||||
return c;
|
return c;
|
||||||
}(0, 2));
|
}(0, 2));
|
||||||
@@ -2081,7 +2082,7 @@ inner_lvalues: {
|
|||||||
expect_stdout: true
|
expect_stdout: true
|
||||||
}
|
}
|
||||||
|
|
||||||
double_def: {
|
double_def_1: {
|
||||||
options = {
|
options = {
|
||||||
collapse_vars: true,
|
collapse_vars: true,
|
||||||
unused: true,
|
unused: true,
|
||||||
@@ -2091,8 +2092,23 @@ double_def: {
|
|||||||
a();
|
a();
|
||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = x;
|
var a;
|
||||||
(a = a && y)();
|
(a = (a = x) && y)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double_def_2: {
|
||||||
|
options = {
|
||||||
|
collapse_vars: true,
|
||||||
|
toplevel: true,
|
||||||
|
unused: true,
|
||||||
|
}
|
||||||
|
input: {
|
||||||
|
var a = x, a = a && y;
|
||||||
|
a();
|
||||||
|
}
|
||||||
|
expect: {
|
||||||
|
(x && y)();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2201,7 +2217,7 @@ lvalues_def: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
var a = 0, b = 1;
|
var a = 0, b = 1;
|
||||||
var a = b++, b = +void 0;
|
a = b++, b = +void 0;
|
||||||
a && a[a++];
|
a && a[a++];
|
||||||
console.log(a, b);
|
console.log(a, b);
|
||||||
}
|
}
|
||||||
@@ -3074,10 +3090,9 @@ issue_2437: {
|
|||||||
var result = !!req.onreadystatechange;
|
var result = !!req.onreadystatechange;
|
||||||
Object.defineProperty(XMLHttpRequest.prototype, 'onreadystatechange', xhrDesc || {});
|
Object.defineProperty(XMLHttpRequest.prototype, 'onreadystatechange', xhrDesc || {});
|
||||||
return result;
|
return result;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
var req = new XMLHttpRequest();
|
var req = new XMLHttpRequest();
|
||||||
var detectFunc = function () { };
|
var detectFunc = function () {};
|
||||||
req.onreadystatechange = detectFunc;
|
req.onreadystatechange = detectFunc;
|
||||||
var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
|
var result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
|
||||||
req.onreadystatechange = null;
|
req.onreadystatechange = null;
|
||||||
@@ -3093,9 +3108,9 @@ issue_2437: {
|
|||||||
return Object.defineProperty(XMLHttpRequest.prototype, "onreadystatechange", xhrDesc || {}),
|
return Object.defineProperty(XMLHttpRequest.prototype, "onreadystatechange", xhrDesc || {}),
|
||||||
result;
|
result;
|
||||||
}
|
}
|
||||||
var req = new XMLHttpRequest(), detectFunc = function() {};
|
var req, detectFunc = function() {};
|
||||||
req.onreadystatechange = detectFunc,
|
(req = new XMLHttpRequest()).onreadystatechange = detectFunc;
|
||||||
result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc,
|
result = req[SYMBOL_FAKE_ONREADYSTATECHANGE_1] === detectFunc;
|
||||||
req.onreadystatechange = null;
|
req.onreadystatechange = null;
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
@@ -3609,15 +3624,15 @@ issue_2497: {
|
|||||||
expect: {
|
expect: {
|
||||||
function sample() {
|
function sample() {
|
||||||
if (true)
|
if (true)
|
||||||
for (i = 0; i < 1; ++i)
|
for (var i = 0; i < 1; ++i)
|
||||||
for (k = 0; k < 1; ++k) {
|
for (var k = 0; k < 1; ++k) {
|
||||||
value = 1;
|
value = 1;
|
||||||
value = value ? value + 1 : 0;
|
value = value ? value + 1 : 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
for (var i = 0; i < 1; ++i)
|
for (i = 0; i < 1; ++i)
|
||||||
for (var k = 0; k < 1; ++k)
|
for (k = 0; k < 1; ++k)
|
||||||
var value=1;
|
var value = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1294,8 +1294,8 @@ issue_2288: {
|
|||||||
expect: {
|
expect: {
|
||||||
function foo(o) {
|
function foo(o) {
|
||||||
o.a;
|
o.a;
|
||||||
for (i = 0; i < 0; i++);
|
|
||||||
for (var i = 0; i < 0; i++);
|
for (var i = 0; i < 0; i++);
|
||||||
|
for (i = 0; i < 0; i++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -972,8 +972,8 @@ inner_var_for_2: {
|
|||||||
}
|
}
|
||||||
expect: {
|
expect: {
|
||||||
!function() {
|
!function() {
|
||||||
a = 1;
|
var a = 1;
|
||||||
for (var b = 1; --b;) var a = 2;
|
for (var b = 1; --b;) a = 2;
|
||||||
console.log(a);
|
console.log(a);
|
||||||
}();
|
}();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user