From 00665766daeddeee78b1c904b3634679a2305ccc Mon Sep 17 00:00:00 2001 From: "Alex Lam S.L" Date: Mon, 6 Jun 2022 13:32:32 +0100 Subject: [PATCH] fix corner case in `side_effects` (#5490) fixes #5489 --- lib/compress.js | 21 ++++++++++---- test/compress/classes.js | 59 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 6 deletions(-) diff --git a/lib/compress.js b/lib/compress.js index 4532ea73..c97474ad 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -8638,17 +8638,26 @@ Compressor.prototype.compress = function(node) { if (base || self.name || !compressor.has_directive("use strict")) { var node = to_class_expr(self); if (!base) node.extends = null; - node.properties = values ? values.length == init ? values : [ make_node(AST_ClassField, self, { - static: true, - key: exprs.length ? make_sequence(self, exprs) : "c", - value: make_value(), - }) ] : exprs.length ? [ make_node(AST_ClassMethod, self, { + node.properties = []; + if (values) { + if (values.length == init) { + if (exprs.length) values.unshift(make_node(AST_ClassField, self, { + key: make_sequence(self, exprs), + value: null, + })); + node.properties = values; + } else node.properties.push(make_node(AST_ClassField, self, { + static: true, + key: exprs.length ? make_sequence(self, exprs) : "c", + value: make_value(), + })); + } else if (exprs.length) node.properties.push(make_node(AST_ClassMethod, self, { key: make_sequence(self, exprs), value: make_node(AST_Function, self, { argnames: [], body: [], }).init_vars(node), - }) ] : []; + })); return node; } if (values) exprs.push(make_node(AST_Call, self, { diff --git a/test/compress/classes.js b/test/compress/classes.js index e019a8f2..879d9488 100644 --- a/test/compress/classes.js +++ b/test/compress/classes.js @@ -3084,3 +3084,62 @@ issue_5481: { expect_stdout: "PASS" node_version: ">=4" } + +issue_5489: { + options = { + side_effects: true, + } + input: { + (class { + [console.log("foo")]; + static { + console.log("bar"); + } + static [console.log("baz")]() {} + }); + } + expect: { + (class { + [(console.log("foo"), console.log("baz"))]; + static { + console.log("bar"); + } + }); + } + expect_stdout: [ + "foo", + "baz", + "bar", + ] + node_version: ">=16" +} + +issue_5489_strict: { + options = { + side_effects: true, + } + input: { + "use strict"; + (class { + [console.log("foo")]; + static { + console.log("bar"); + } + static [console.log("baz")]() {} + }); + } + expect: { + "use strict"; + console.log("foo"), + console.log("baz"), + (() => (() => { + console.log("bar"); + })())(); + } + expect_stdout: [ + "foo", + "baz", + "bar", + ] + node_version: ">=16" +}