fix corner case `reduce_vars` (#4706)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sat, 27 Feb 2021 20:41:21 +0000 (20:41 +0000)
committerGitHub <noreply@github.com>
Sat, 27 Feb 2021 20:41:21 +0000 (04:41 +0800)
fixes #4705

lib/compress.js
test/compress/classes.js

index 101fdb4..ba7ab4a 100644 (file)
@@ -938,31 +938,35 @@ merge(Compressor.prototype, {
             node.variables.each(function(def) {
                 reset_def(tw, compressor, def);
             });
-            if (!node.name) return;
-            var d = node.name.definition();
-            var parent = tw.parent();
-            if (parent instanceof AST_ExportDeclaration || parent instanceof AST_ExportDefault) d.single_use = false;
-            if (safe_to_assign(tw, d, true)) {
-                mark(tw, d);
-                tw.loop_ids[d.id] = tw.in_loop;
-                d.fixed = function() {
-                    return node;
-                };
-                d.fixed.assigns = [ node ];
-                if (!is_safe_lexical(d)) d.single_use = false;
-            } else {
-                d.fixed = false;
-            }
-        });
-        def(AST_ClassField, function(tw) {
-            var node = this;
-            if (node.static) return;
-            if (node.key instanceof AST_Node) node.key.walk(tw);
-            if (node.value) {
-                push(tw);
-                node.value.walk(tw);
-                pop(tw);
+            if (node.extends) node.extends.walk(tw);
+            if (node.name) {
+                var d = node.name.definition();
+                var parent = tw.parent();
+                if (parent instanceof AST_ExportDeclaration || parent instanceof AST_ExportDefault) d.single_use = false;
+                if (safe_to_assign(tw, d, true)) {
+                    mark(tw, d);
+                    tw.loop_ids[d.id] = tw.in_loop;
+                    d.fixed = function() {
+                        return node;
+                    };
+                    d.fixed.assigns = [ node ];
+                    if (!is_safe_lexical(d)) d.single_use = false;
+                } else {
+                    d.fixed = false;
+                }
             }
+            node.properties.filter(function(prop) {
+                if (prop.key instanceof AST_Node) prop.key.walk(tw);
+                return prop.value;
+            }).forEach(function(prop) {
+                if (prop.static) {
+                    prop.value.walk(tw);
+                } else {
+                    push(tw);
+                    prop.value.walk(tw);
+                    pop(tw);
+                }
+            });
             return true;
         });
         def(AST_Conditional, function(tw) {
index ab2652c..dea0d5b 100644 (file)
@@ -747,3 +747,24 @@ issue_4687_2: {
     expect_stdout: "PASS"
     node_version: ">=4"
 }
+
+issue_4705: {
+    options = {
+        evaluate: true,
+        reduce_vars: true,
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        var a = "PASS";
+        class A {
+            p = a = "FAIL";
+            [console.log(a)];
+        }
+    }
+    expect: {
+        console.log("PASS");
+    }
+    expect_stdout: "PASS"
+    node_version: ">=12"
+}