fix corner case in `collapse_vars` (#3629)
authorAlex Lam S.L <alexlamsl@gmail.com>
Wed, 4 Dec 2019 21:08:37 +0000 (05:08 +0800)
committerGitHub <noreply@github.com>
Wed, 4 Dec 2019 21:08:37 +0000 (05:08 +0800)
fixes #3628

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

index 74e2c6f..a34272c 100644 (file)
@@ -1610,7 +1610,12 @@ merge(Compressor.prototype, {
                     if (parent.condition !== node) return node;
                     return find_stop_value(parent, level + 1);
                 }
-                if (parent instanceof AST_ObjectKeyVal) return find_stop_value(scanner.parent(level + 1), level + 2);
+                if (parent instanceof AST_ObjectKeyVal) {
+                    var obj = scanner.parent(level + 1);
+                    return all(obj.properties, function(prop) {
+                        return prop instanceof AST_ObjectKeyVal;
+                    }) ? find_stop_value(obj, level + 2) : obj;
+                }
                 if (parent instanceof AST_PropAccess) return find_stop_value(parent, level + 1);
                 if (parent instanceof AST_Sequence) {
                     return (parent.tail_node() === node ? find_stop_value : find_stop_unused)(parent, level + 1);
@@ -1651,7 +1656,12 @@ merge(Compressor.prototype, {
                 if (parent instanceof AST_Exit) return find_stop_unused(parent, level + 1);
                 if (parent instanceof AST_If) return find_stop_unused(parent, level + 1);
                 if (parent instanceof AST_IterationStatement) return node;
-                if (parent instanceof AST_ObjectKeyVal) return find_stop_unused(scanner.parent(level + 1), level + 2);
+                if (parent instanceof AST_ObjectKeyVal) {
+                    var obj = scanner.parent(level + 1);
+                    return all(obj.properties, function(prop) {
+                        return prop instanceof AST_ObjectKeyVal;
+                    }) ? find_stop_unused(obj, level + 2) : obj;
+                }
                 if (parent instanceof AST_PropAccess) {
                     var exp = parent.expression;
                     if (exp === node) return find_stop_unused(parent, level + 1);
index 9fe5a93..16cbadf 100644 (file)
@@ -7345,3 +7345,57 @@ issue_3626_2: {
     }
     expect_stdout: "foo 42 null"
 }
+
+issue_3628_1: {
+    options = {
+        collapse_vars: true,
+    }
+    input: {
+        var a = "bar", b;
+        ({
+            get p() {
+                a = "foo";
+            },
+            q: b = a
+        }).p;
+        console.log(a, b);
+    }
+    expect: {
+        var a = "bar", b;
+        ({
+            get p() {
+                a = "foo";
+            },
+            q: b = a
+        }).p;
+        console.log(a, b);
+    }
+    expect_stdout: "foo bar"
+}
+
+issue_3628_2: {
+    options = {
+        collapse_vars: true,
+    }
+    input: {
+        var a = "bar", b;
+        ({
+            get p() {
+                a = "foo";
+            },
+            q: (b = a, 42)
+        }).p;
+        console.log(a, b);
+    }
+    expect: {
+        var a = "bar", b;
+        ({
+            get p() {
+                a = "foo";
+            },
+            q: (b = a, 42)
+        }).p;
+        console.log(a, b);
+    }
+    expect_stdout: "foo bar"
+}