enhance `rests` (#4546)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 12 Jan 2021 16:00:19 +0000 (16:00 +0000)
committerGitHub <noreply@github.com>
Tue, 12 Jan 2021 16:00:19 +0000 (00:00 +0800)
lib/compress.js
test/compress/rests.js

index 83d20e8..c9bd182 100644 (file)
@@ -4871,8 +4871,18 @@ merge(Compressor.prototype, {
         return trim_block(self);
     });
 
+    function drop_rest_farg(fn, compressor) {
+        if (!compressor.option("rests")) return;
+        if (fn.uses_arguments) return;
+        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;
+    }
+
     function opt_arrow(self, compressor) {
         if (!compressor.option("arrows")) return self;
+        drop_rest_farg(self, compressor);
         var body = tighten_body(self.value ? [ self.first_statement() ] : self.body, compressor);
         switch (body.length) {
           case 1:
@@ -4892,7 +4902,14 @@ merge(Compressor.prototype, {
     OPT(AST_Arrow, opt_arrow);
     OPT(AST_AsyncArrow, opt_arrow);
 
+    OPT(AST_Defun, function(self, compressor) {
+        drop_rest_farg(self, compressor);
+        self.body = tighten_body(self.body, compressor);
+        return self;
+    });
+
     OPT(AST_Function, function(self, compressor) {
+        drop_rest_farg(self, compressor);
         self.body = tighten_body(self.body, compressor);
         if (compressor.option("inline")) for (var i = 0; i < self.body.length; i++) {
             var stat = self.body[i];
@@ -10686,6 +10703,14 @@ merge(Compressor.prototype, {
         return try_evaluate(compressor, self);
     });
 
+    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;
+        }
+        return self;
+    });
+
     OPT(AST_DestructuredKeyVal, function(self, compressor) {
         if (compressor.option("objects")) {
             var key = self.key;
index e322112..ed92770 100644 (file)
@@ -486,6 +486,62 @@ keep_arguments: {
     node_version: ">=6"
 }
 
+drop_rest_array: {
+    options = {
+        rests: true,
+    }
+    input: {
+        var [ ...[ a ]] = [ "PASS" ];
+        console.log(a);
+    }
+    expect: {
+        var [ a ] = [ "PASS" ];
+        console.log(a);
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}
+
+drop_rest_arrow: {
+    options = {
+        arrows: true,
+        keep_fargs: false,
+        reduce_vars: true,
+        rests: true,
+    }
+    input: {
+        console.log(((...[ a ]) => a)("PASS"));
+    }
+    expect: {
+        console.log((a => a)("PASS"));
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}
+
+drop_rest_lambda: {
+    options = {
+        keep_fargs: false,
+        reduce_vars: true,
+        rests: true,
+        toplevel: true,
+    }
+    input: {
+        function f(...[ a ]) {
+            return a;
+        }
+        console.log(f("PASS"), f(42));
+    }
+    expect: {
+        function f(a) {
+            return a;
+        }
+        console.log(f("PASS"), f(42));
+    }
+    expect_stdout: "PASS 42"
+    node_version: ">=6"
+}
+
 issue_4525_1: {
     options = {
         arguments: true,