fix corner case in `collapse_vars` (#4733)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 4 Mar 2021 09:13:54 +0000 (09:13 +0000)
committerGitHub <noreply@github.com>
Thu, 4 Mar 2021 09:13:54 +0000 (17:13 +0800)
fixes #4732

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

index ed04859..6a59a9d 100644 (file)
@@ -2675,9 +2675,10 @@ merge(Compressor.prototype, {
                     if (hit_index <= end) return handle_custom_scan_order(node, tt);
                     hit = true;
                     if (node instanceof AST_VarDef) {
-                        node.value = null;
                         declare_only[node.name.name] = (declare_only[node.name.name] || 0) + 1;
                         if (value_def) value_def.replaced++;
+                        node = node.clone();
+                        node.value = null;
                         return node;
                     }
                     return in_list ? List.skip : null;
index c0a545c..6e82e8b 100644 (file)
@@ -8756,3 +8756,51 @@ issue_4586_2: {
     }
     expect_stdout: "PASS"
 }
+
+issue_4732_1: {
+    options = {
+        booleans: true,
+        collapse_vars: true,
+        evaluate: true,
+        reduce_vars: true,
+        unused: true,
+    }
+    input: {
+        var a = 0;
+        (function(b) {
+            var b = a++;
+            var c = b ? b && console.log("PASS") : 0;
+        })(a++);
+    }
+    expect: {
+        var a = 0;
+        (function(b) {
+            (b = a++) && (b && console.log("PASS"));
+        })(a++);
+    }
+    expect_stdout: "PASS"
+}
+
+issue_4732_2: {
+    options = {
+        collapse_vars: true,
+        conditionals: true,
+        evaluate: true,
+        reduce_vars: true,
+        unused: true,
+    }
+    input: {
+        var a = 0;
+        (function(b) {
+            var b = a++;
+            var c = b ? b && console.log("PASS") : 0;
+        })(a++);
+    }
+    expect: {
+        var a = 0;
+        (function(b) {
+            (b = a++) && b && console.log("PASS");
+        })(a++);
+    }
+    expect_stdout: "PASS"
+}