diff options
author | Alex Lam S.L <alexlamsl@gmail.com> | 2021-03-08 23:59:52 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-09 07:59:52 +0800 |
commit | 01fa430a3e20098361ff8d35306ba1c31fea514c (patch) | |
tree | 6eed7493279a59aa71f42789bfcf3caa049a8737 | |
parent | f4ee0f651c952eb85753633a990a598267981bcb (diff) | |
download | tracifyjs-01fa430a3e20098361ff8d35306ba1c31fea514c.tar.gz tracifyjs-01fa430a3e20098361ff8d35306ba1c31fea514c.zip |
fix corner case in `unused` (#4757)
fixes #4756
-rw-r--r-- | lib/compress.js | 37 | ||||
-rw-r--r-- | lib/scope.js | 1 | ||||
-rw-r--r-- | 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" +} |