fix corner case in `reduce_vars` (#4490)
authorAlex Lam S.L <alexlamsl@gmail.com>
Fri, 1 Jan 2021 04:56:13 +0000 (04:56 +0000)
committerGitHub <noreply@github.com>
Fri, 1 Jan 2021 04:56:13 +0000 (12:56 +0800)
fixes #4489

lib/compress.js
test/compress/hoist_vars.js
test/reduce.js

index 6c26e8a..bd98c30 100644 (file)
@@ -9427,8 +9427,7 @@ merge(Compressor.prototype, {
                         }
                     }));
                 } else {
-                    value = fixed.optimize(compressor);
-                    if (value === fixed) value = value.transform(new TreeTransformer(function(node, descend) {
+                    value = fixed.optimize(compressor).transform(new TreeTransformer(function(node, descend) {
                         if (node instanceof AST_Scope) return node;
                         node = node.clone();
                         descend(node, this);
index 173aaea..82f8ede 100644 (file)
@@ -158,3 +158,22 @@ issue_4487: {
     }
     expect_stdout: "undefined"
 }
+
+issue_4489: {
+    options = {
+        collapse_vars: true,
+        evaluate: true,
+        hoist_vars: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        A = 0;
+        var o = !0 || null;
+        for (var k in o);
+    }
+    expect: {
+        for (var k in !(A = 0));
+    }
+}
index 120868f..e45cfa5 100644 (file)
@@ -322,7 +322,16 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options)
             }
             else if (node instanceof U.AST_Object) {
                 // first property's value
-                var expr = node.properties[0] instanceof U.AST_ObjectKeyVal && node.properties[0].value;
+                var expr = node.properties[0];
+                if (expr instanceof U.AST_ObjectKeyVal) {
+                    expr = expr.value;
+                } else if (expr instanceof U.AST_Spread) {
+                    expr = expr.expression;
+                } else if (expr && expr.key instanceof U.AST_Node) {
+                    expr = expr.key;
+                } else {
+                    expr = null;
+                }
                 if (expr) {
                     node.start._permute++;
                     CHANGED = true;
@@ -351,11 +360,6 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options)
                     }
                 }
             }
-            else if (node instanceof U.AST_Spread) {
-                node.start._permute++;
-                CHANGED = true;
-                return node.expression;
-            }
             else if (node instanceof U.AST_Switch) {
                 var expr = [
                     node.expression,                         // switch expression