aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2021-03-08 23:59:52 +0000
committerGitHub <noreply@github.com>2021-03-09 07:59:52 +0800
commit01fa430a3e20098361ff8d35306ba1c31fea514c (patch)
tree6eed7493279a59aa71f42789bfcf3caa049a8737
parentf4ee0f651c952eb85753633a990a598267981bcb (diff)
downloadtracifyjs-01fa430a3e20098361ff8d35306ba1c31fea514c.tar.gz
tracifyjs-01fa430a3e20098361ff8d35306ba1c31fea514c.zip
fix corner case in `unused` (#4757)
fixes #4756
-rw-r--r--lib/compress.js37
-rw-r--r--lib/scope.js1
-rw-r--r--test/compress/classes.js31
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"
+}