fix corner case in `collapse_vars` (#3627)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 4 Dec 2019 16:59:57 +0000 (00:59 +0800)
committerGitHub <noreply@github.com>
Wed, 4 Dec 2019 16:59:57 +0000 (00:59 +0800)
fixes #3626

lib/compress.js
test/compress/collapse_vars.js

index 4442bbb..74e2c6f 100644 (file)
@@ -1578,9 +1578,11 @@ merge(Compressor.prototype, {
                 }
                 if (parent instanceof AST_Binary) {
                     if (lazy_op[parent.operator] && parent.left !== node) {
-                        var grandparent = scanner.parent(level + 1);
-                        if (!(grandparent instanceof AST_Binary)) return node;
-                        if (grandparent.operator != parent.operator) return node;
+                        do {
+                            node = parent;
+                            parent = scanner.parent(++level);
+                        } while (parent instanceof AST_Binary && parent.operator == node.operator);
+                        return node;
                     }
                     return find_stop_value(parent, level + 1);
                 }
index cc6c5f9..9fe5a93 100644 (file)
@@ -7308,3 +7308,40 @@ substitution_unary: {
         "true 42 42",
     ]
 }
+
+issue_3626_1: {
+    options = {
+        collapse_vars: true,
+    }
+    input: {
+        var a = "foo", b = 42;
+        a.p && (b = a) && a;
+        console.log(a, b);
+    }
+    expect: {
+        var a = "foo", b = 42;
+        a.p && (b = a) && a;
+        console.log(a, b);
+    }
+    expect_stdout: "foo 42"
+}
+
+issue_3626_2: {
+    options = {
+        collapse_vars: true,
+        conditionals: true,
+    }
+    input: {
+        var a = "foo", b = 42, c = null;
+        if (a && a.p)
+            if (b = a)
+                c++ + a;
+        console.log(a, b, c);
+    }
+    expect: {
+        var a = "foo", b = 42, c = null;
+        a && a.p && (b = a) && c++ + a;
+        console.log(a, b, c);
+    }
+    expect_stdout: "foo 42 null"
+}