From 980fcbb56b674c1c78e1483b6d66a2f49e58d80b Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Thu, 3 Sep 2020 10:41:33 +0100 Subject: [PATCH] enhance `unused` (#4090) --- lib/compress.js | 53 ++++++++++++++++++++++----------- test/compress/drop-unused.js | 57 ++++++++++++++++++++++++++++++++++++ test/compress/functions.js | 3 +- 3 files changed, 94 insertions(+), 19 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 9aa70ef9..273c5a75 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -4312,6 +4312,7 @@ merge(Compressor.prototype, { return sym; }; var assign_in_use = Object.create(null); + var for_ins = Object.create(null); var in_use = []; var in_use_ids = Object.create(null); // avoid expensive linear scans of in_use var value_read = Object.create(null); @@ -4602,23 +4603,37 @@ merge(Compressor.prototype, { return !def || fn.name && def === fn.name.definition(); } }); - if (head.length == 0 && tail.length == duplicated) { - [].unshift.apply(side_effects, tail.map(function(def) { - AST_Node.warn("Dropping duplicated definition of variable {name} [{file}:{line},{col}]", template(def.name)); - var sym = def.name.definition(); - var ref = make_node(AST_SymbolRef, def.name, def.name); - sym.references.push(ref); - var assign = make_node(AST_Assign, def, { - operator: "=", - left: ref, - right: def.value - }); - var index = indexOf_assign(sym, def); - if (index >= 0) assign_in_use[sym.id][index] = assign; - sym.eliminated++; - return assign; - })); - } else if (head.length > 0 || tail.length > 0) { + switch (head.length) { + case 0: + if (tail.length == 0) break; + if (tail.length == duplicated) { + [].unshift.apply(side_effects, tail.map(function(def) { + AST_Node.warn("Dropping duplicated definition of variable {name} [{file}:{line},{col}]", template(def.name)); + var sym = def.name.definition(); + var ref = make_node(AST_SymbolRef, def.name, def.name); + sym.references.push(ref); + var assign = make_node(AST_Assign, def, { + operator: "=", + left: ref, + right: def.value + }); + var index = indexOf_assign(sym, def); + if (index >= 0) assign_in_use[sym.id][index] = assign; + sym.eliminated++; + return assign; + })); + break; + } + case 1: + if (tail.length == 0) { + var id = head[0].name.definition().id; + if (id in for_ins) { + node.definitions = head; + for_ins[id].init = node; + break; + } + } + default: node.definitions = head.concat(tail); body.push(node); } @@ -4814,6 +4829,10 @@ merge(Compressor.prototype, { return true; } if (node instanceof AST_ForIn) { + if (node.init instanceof AST_SymbolRef && scope === self) { + var id = node.init.definition().id; + if (!(id in for_ins)) for_ins[id] = node; + } if (!drop_vars || !compressor.option("loops")) return; if (!is_empty(node.body)) return; if (node.init.has_side_effects(compressor)) return; diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js index 6ab4fe3b..052a013b 100644 --- a/test/compress/drop-unused.js +++ b/test/compress/drop-unused.js @@ -2848,3 +2848,60 @@ issue_4025: { "1 1 1", ] } + +forin_var_1: { + options = { + unused: true, + } + input: { + var k; + for (k in [ 1, 2 ]) + console.log(k); + for (k in { PASS: 3 }) + console.log(k); + console.log(k); + } + expect: { + for (var k in [ 1, 2 ]) + console.log(k); + for (k in { PASS: 3 }) + console.log(k); + console.log(k); + } + expect_stdout: [ + "0", + "1", + "PASS", + "PASS", + ] +} + +forin_var_2: { + options = { + unused: true, + } + input: { + console.log(function() { + switch (0) { + case function() { + for (a in 0); + }: + var b = 0; + } + for (var c = 0; a;); + var a; + }()); + } + expect: { + console.log(function() { + switch (0) { + case function() { + for (a in 0); + }: + } + for (; a;); + var a; + }()); + } + expect_stdout: "undefined" +} diff --git a/test/compress/functions.js b/test/compress/functions.js index 18f4f900..8bfb2eaf 100644 --- a/test/compress/functions.js +++ b/test/compress/functions.js @@ -1483,8 +1483,7 @@ issue_2663_2: { } expect: { (function() { - var i; - for (i in { a: 1, b: 2, c: 3 }) + for (var i in { a: 1, b: 2, c: 3 }) j = i, console.log(j); var j; })(); -- 2.34.1