fix corner case in `collapse_vars` (#3501)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 19 Oct 2019 19:53:20 +0000 (03:53 +0800)
committerGitHub <noreply@github.com>
Sat, 19 Oct 2019 19:53:20 +0000 (03:53 +0800)
lib/compress.js
test/compress/collapse_vars.js

index 0888c10..8ef94e4 100644 (file)
@@ -1465,50 +1465,20 @@ merge(Compressor.prototype, {
                 hit_stack.pop();
             }
 
-            function find_stop(node, level, write_only) {
+            function find_stop(node, level) {
                 var parent = scanner.parent(level);
-                if (parent instanceof AST_Assign) {
-                    if (write_only
-                        && !(parent.left instanceof AST_PropAccess
-                            || parent.left.name in lvalues)) {
-                        return find_stop(parent, level + 1, write_only);
-                    }
-                    return node;
-                }
-                if (parent instanceof AST_Binary) {
-                    if (write_only && (!lazy_op[parent.operator] || parent.left === node)) {
-                        return find_stop(parent, level + 1, write_only);
-                    }
-                    return node;
-                }
+                if (parent instanceof AST_Assign) return node;
+                if (parent instanceof AST_Binary) return node;
                 if (parent instanceof AST_Call) return node;
                 if (parent instanceof AST_Case) return node;
-                if (parent instanceof AST_Conditional) {
-                    if (write_only && parent.condition === node) {
-                        return find_stop(parent, level + 1, write_only);
-                    }
-                    return node;
-                }
-                if (parent instanceof AST_Definitions) {
-                    return find_stop(parent, level + 1, true);
-                }
-                if (parent instanceof AST_Exit) {
-                    return write_only ? find_stop(parent, level + 1, write_only) : node;
-                }
-                if (parent instanceof AST_If) {
-                    if (write_only && parent.condition === node) {
-                        return find_stop(parent, level + 1, write_only);
-                    }
-                    return node;
-                }
+                if (parent instanceof AST_Conditional) return node;
+                if (parent instanceof AST_Definitions) return find_stop(parent, level + 1);
+                if (parent instanceof AST_Exit) return node;
+                if (parent instanceof AST_If) return node;
                 if (parent instanceof AST_IterationStatement) return node;
                 if (parent instanceof AST_PropAccess) return node;
-                if (parent instanceof AST_Sequence) {
-                    return find_stop(parent, level + 1, parent.tail_node() !== node);
-                }
-                if (parent instanceof AST_SimpleStatement) {
-                    return find_stop(parent, level + 1, true);
-                }
+                if (parent instanceof AST_Sequence) return find_stop(parent, level + 1);
+                if (parent instanceof AST_SimpleStatement) return find_stop(parent, level + 1);
                 if (parent instanceof AST_Switch) return node;
                 if (parent instanceof AST_Unary) return node;
                 if (parent instanceof AST_VarDef) return node;
index 2381333..951d72d 100644 (file)
@@ -6237,3 +6237,24 @@ issue_3439_2: {
     }
     expect_stdout: "number"
 }
+
+cond_sequence_return: {
+    options = {
+        collapse_vars: true,
+    }
+    input: {
+        console.log(function(n) {
+            var c = 0;
+            for (var k in [0, 1])
+                if (c++, k == n) return c;
+        }(1));
+    }
+    expect: {
+        console.log(function(n) {
+            var c = 0;
+            for (var k in [0, 1])
+                if (c++, k == n) return c;
+        }(1));
+    }
+    expect_stdout: "2"
+}