fix corner case in `unused` (#4757)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 8 Mar 2021 23:59:52 +0000 (23:59 +0000)
committerGitHub <noreply@github.com>
Mon, 8 Mar 2021 23:59:52 +0000 (07:59 +0800)
fixes #4756

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

index a92ad97..e207fed 100644 (file)
@@ -7323,31 +7323,28 @@ merge(Compressor.prototype, {
                 if (!base && !values) return null;
                 exprs = [];
             }
-            if (values) {
-                var fn = make_node(AST_Arrow, this, {
-                    argnames: [],
-                    body: [],
-                    value: make_sequence(this, values),
-                });
-                fn.init_vars(this.parent_scope);
-                exprs.push(make_node(AST_Call, this, {
-                    args: [],
-                    expression: fn,
+            if (base) {
+                var node = to_class_expr(this, true);
+                node.properties = [];
+                if (exprs.length) node.properties.push(make_node(AST_ClassMethod, this, {
+                    key: make_sequence(this, exprs),
+                    value: make_node(AST_Function, this, {
+                        argnames: [],
+                        body: [],
+                    }).init_vars(node),
                 }));
+                exprs = [ node ];
+
             }
-            exprs = exprs.length ? make_sequence(this, exprs) : null;
-            if (!base) return exprs;
-            var node = make_node(AST_ClassExpression, this, this);
-            node.name = null;
-            node.properties = [];
-            if (exprs) node.properties.push(make_node(AST_ClassMethod, this, {
-                key: exprs,
-                value: make_node(AST_Function, this, {
+            if (values) exprs.push(make_node(AST_Call, this, {
+                expression: make_node(AST_Arrow, this, {
                     argnames: [],
                     body: [],
-                }).init_vars(node),
+                    value: make_sequence(this, values),
+                }).init_vars(this.parent_scope),
+                args: [],
             }));
-            return node;
+            return make_sequence(this, exprs);
         });
         def(AST_Conditional, function(compressor) {
             var consequent = this.consequent.drop_side_effect_free(compressor);
index 870ebf3..6345bfd 100644 (file)
@@ -438,6 +438,7 @@ AST_Scope.DEFMETHOD("init_vars", function(parent_scope) {
 });
 AST_Arrow.DEFMETHOD("init_vars", function(parent_scope) {
     init_scope_vars(this, parent_scope);
+    return this;
 });
 AST_AsyncArrow.DEFMETHOD("init_vars", function(parent_scope) {
     init_scope_vars(this, parent_scope);
index a1b4f0c..cebccf9 100644 (file)
@@ -1244,3 +1244,34 @@ new_target: {
     expect_stdout: "function"
     node_version: ">=6"
 }
+
+issue_4756: {
+    options = {
+        toplevel: true,
+        unused: true,
+    }
+    input: {
+        try {
+            class A extends 42 {
+                static [console.log("foo")] = console.log("bar");
+            }
+        } catch (e) {
+            console.log("baz");
+        }
+    }
+    expect: {
+        try {
+            (class extends 42 {
+                [console.log("foo")]() {}
+            }),
+            (() => console.log("bar"))();
+        } catch (e) {
+            console.log("baz");
+        }
+    }
+    expect_stdout: [
+        "foo",
+        "baz",
+    ]
+    node_version: ">=12"
+}