diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2021-07-09 17:28:23 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-10 00:28:23 +0800 |
commit | 450aabaaa036df8735a6c21c847dbba1fe060663 (patch) | |
tree | 482e130197ef8f4cbefaa9893e8ef82007db73bd | |
parent | ea7829daf55f8829cc48466379cc6f6cf3394dbd (diff) | |
download | tracifyjs-450aabaaa036df8735a6c21c847dbba1fe060663.tar.gz tracifyjs-450aabaaa036df8735a6c21c847dbba1fe060663.zip |
fix corner cases in `rests` & `unused` (#5063)
-rw-r--r-- | lib/compress.js | 18 | ||||
-rw-r--r-- | test/compress/rests.js | 78 |
2 files changed, 88 insertions, 8 deletions
diff --git a/lib/compress.js b/lib/compress.js index dbfc2e75..453396e7 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -5507,7 +5507,7 @@ merge(Compressor.prototype, { if (!(fn.rest instanceof AST_DestructuredArray)) return; if (!compressor.drop_fargs(fn, compressor.parent())) return; fn.argnames = fn.argnames.concat(fn.rest.elements); - fn.rest = null; + fn.rest = fn.rest.rest; } OPT(AST_Lambda, function(self, compressor) { @@ -6428,12 +6428,16 @@ merge(Compressor.prototype, { } if (!(node instanceof AST_Accessor)) { if (node.rest) { - node.rest = node.rest.transform(trimmer); - if (!(node.uses_arguments && !tt.has_directive("use strict")) - && (node.rest instanceof AST_DestructuredArray && node.rest.elements.length == 0 - || node.rest instanceof AST_DestructuredObject && node.rest.properties.length == 0)) { - node.rest = null; + var rest = node.rest.transform(trimmer); + if (rest instanceof AST_Destructured && !rest.rest + && (!node.uses_arguments || tt.has_directive("use strict"))) { + if (rest instanceof AST_DestructuredArray) { + if (rest.elements.length == 0) rest = null; + } else if (rest.properties.length == 0) { + rest = null; + } } + node.rest = rest; } var argnames = node.argnames; var trim = compressor.drop_fargs(node, parent) && !node.rest; @@ -12125,7 +12129,7 @@ merge(Compressor.prototype, { OPT(AST_DestructuredArray, function(self, compressor) { if (compressor.option("rests") && self.rest instanceof AST_DestructuredArray) { self.elements = self.elements.concat(self.rest.elements); - self.rest = null; + self.rest = self.rest.rest; } return self; }); diff --git a/test/compress/rests.js b/test/compress/rests.js index bbbcc14b..a22a6b21 100644 --- a/test/compress/rests.js +++ b/test/compress/rests.js @@ -491,7 +491,7 @@ drop_rest_array: { rests: true, } input: { - var [ ...[ a ]] = [ "PASS" ]; + var [ ...[ a ] ] = [ "PASS" ]; console.log(a); } expect: { @@ -542,6 +542,82 @@ drop_rest_lambda: { node_version: ">=6" } +keep_rest_array: { + options = { + rests: true, + } + input: { + var [ ...[ ...a ] ] = "PASS"; + console.log(a.join("")); + } + expect: { + var [ ...a ] = "PASS"; + console.log(a.join("")); + } + expect_stdout: "PASS" + node_version: ">=6" +} + +keep_rest_arrow: { + options = { + arrows: true, + keep_fargs: false, + reduce_vars: true, + rests: true, + } + input: { + console.log(((...[ ...a ]) => a.join(""))("PASS")); + } + expect: { + console.log(((...a) => a.join(""))("PASS")); + } + expect_stdout: "PASS" + node_version: ">=6" +} + +keep_rest_lambda_1: { + options = { + keep_fargs: false, + reduce_vars: true, + rests: true, + toplevel: true, + } + input: { + function f(...[ ...a ]) { + return a.join(""); + } + console.log(f("PASS"), f([ 42 ])); + } + expect: { + function f(...a) { + return a.join(""); + } + console.log(f("PASS"), f([ 42 ])); + } + expect_stdout: "PASS 42" + node_version: ">=6" +} + +keep_rest_lambda_2: { + options = { + unused: true, + } + input: { + function f(...[ ...a ]) { + return a.join(""); + } + console.log(f("PASS"), f([ 42 ])); + } + expect: { + function f(...[ ...a ]) { + return a.join(""); + } + console.log(f("PASS"), f([ 42 ])); + } + expect_stdout: "PASS 42" + node_version: ">=6" +} + issue_4525_1: { options = { arguments: true, |