aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2021-07-09 17:28:23 +0100
committerGitHub <noreply@github.com>2021-07-10 00:28:23 +0800
commit450aabaaa036df8735a6c21c847dbba1fe060663 (patch)
tree482e130197ef8f4cbefaa9893e8ef82007db73bd
parentea7829daf55f8829cc48466379cc6f6cf3394dbd (diff)
downloadtracifyjs-450aabaaa036df8735a6c21c847dbba1fe060663.tar.gz
tracifyjs-450aabaaa036df8735a6c21c847dbba1fe060663.zip
fix corner cases in `rests` & `unused` (#5063)
-rw-r--r--lib/compress.js18
-rw-r--r--test/compress/rests.js78
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,