From 01fa430a3e20098361ff8d35306ba1c31fea514c Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Mon, 8 Mar 2021 23:59:52 +0000 Subject: [PATCH] fix corner case in `unused` (#4757) fixes #4756 --- lib/compress.js | 37 +++++++++++++++++-------------------- lib/scope.js | 1 + test/compress/classes.js | 31 +++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 20 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index a92ad97d..e207fed1 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -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); diff --git a/lib/scope.js b/lib/scope.js index 870ebf38..6345bfd3 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -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); diff --git a/test/compress/classes.js b/test/compress/classes.js index a1b4f0cd..cebccf95 100644 --- a/test/compress/classes.js +++ b/test/compress/classes.js @@ -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" +} -- 2.34.1