fix corner case in `merge_vars` & `reduce_vars` (#4313)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 21 Nov 2020 00:57:59 +0000 (00:57 +0000)
committerGitHub <noreply@github.com>
Sat, 21 Nov 2020 00:57:59 +0000 (08:57 +0800)
fixes #4312

lib/compress.js
test/compress/destructured.js
test/compress/functions.js

index 601f39f..1161f3b 100644 (file)
@@ -752,14 +752,18 @@ merge(Compressor.prototype, {
         def(AST_Call, function(tw, descend) {
             tw.find_parent(AST_Scope).may_call_this();
             var exp = this.expression;
-            if (exp instanceof AST_Function) {
+            var tail = exp.tail_node();
+            if (tail instanceof AST_Function) {
+                if (exp !== tail) exp.expressions.slice(0, -1).forEach(function(node) {
+                    node.walk(tw);
+                });
                 this.args.forEach(function(arg) {
                     arg.walk(tw);
                 });
-                exp.walk(tw);
+                tail.walk(tw);
                 return true;
-            } else if (exp instanceof AST_SymbolRef) {
-                var def = exp.definition();
+            } else if (tail instanceof AST_SymbolRef) {
+                var def = tail.definition();
                 if (this.TYPE == "Call" && tw.in_boolean_context()) def.bool_fn++;
                 if (!(def.fixed instanceof AST_Defun)) return;
                 var defun = mark_defun(tw, def);
@@ -768,11 +772,11 @@ merge(Compressor.prototype, {
                 defun.walk(tw);
                 return true;
             } else if (this.TYPE == "Call"
-                && exp instanceof AST_Assign
-                && exp.operator == "="
-                && exp.left instanceof AST_SymbolRef
+                && tail instanceof AST_Assign
+                && tail.operator == "="
+                && tail.left instanceof AST_SymbolRef
                 && tw.in_boolean_context()) {
-                exp.left.definition().bool_fn++;
+                tail.left.definition().bool_fn++;
             }
         });
         def(AST_Conditional, function(tw) {
@@ -4681,6 +4685,19 @@ merge(Compressor.prototype, {
                 if (!(target instanceof AST_IterationStatement)) insert(target);
                 return true;
             }
+            if (node instanceof AST_Call) {
+                var exp = node.expression;
+                var tail = exp.tail_node();
+                if (!(tail instanceof AST_Function)) return;
+                if (exp !== tail) exp.expressions.slice(0, -1).forEach(function(node) {
+                    node.walk(tw);
+                });
+                node.args.forEach(function(arg) {
+                    arg.walk(tw);
+                });
+                tail.walk(tw);
+                return true;
+            }
             if (node instanceof AST_Conditional) {
                 node.condition.walk(tw);
                 push();
index f8e8090..e654847 100644 (file)
@@ -1616,3 +1616,34 @@ issue_4308: {
     expect_stdout: "PASS"
     node_version: ">=6"
 }
+
+issue_4312: {
+    options = {
+        collapse_vars: true,
+        inline: true,
+        merge_vars: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var a;
+        (function f(b, c) {
+            return function({
+                [a = b]: d,
+            }) {}(c && c);
+        })("PASS", "FAIL");
+        console.log(a);
+    }
+    expect: {
+        var a;
+        b = "PASS",
+        (function({
+            [a = b]: d,
+        }){})((c = "FAIL") && c);
+        var b, c;
+        console.log(a);
+    }
+    expect_stdout: "PASS"
+    node_version: ">=6"
+}
index 686e7a5..e06596b 100644 (file)
@@ -521,7 +521,7 @@ issue_2531_2: {
     options = {
         evaluate: true,
         inline: true,
-        passes: 3,
+        passes: 2,
         reduce_funcs: true,
         reduce_vars: true,
         side_effects: true,
@@ -556,9 +556,10 @@ issue_2531_3: {
     options = {
         evaluate: true,
         inline: true,
-        passes: 3,
+        passes: 2,
         reduce_funcs: true,
         reduce_vars: true,
+        sequences: true,
         side_effects: true,
         toplevel: true,
         unused: true,