From bf066e18460a03ecf47e7a6a60ca6741bcab7de0 Mon Sep 17 00:00:00 2001 From: YunfeiHe Date: Sat, 19 Nov 2022 14:57:09 +0800 Subject: [PATCH] fix(es/minifier): should preserve classes with side effects in static fields --- .../src/compress/optimize/unused.rs | 14 +++++++++++++- .../tests/fixture/issues/5588/config.json | 4 ++++ .../tests/fixture/issues/5588/input.js | 12 ++++++++++++ .../tests/fixture/issues/5588/output.js | 12 ++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/5588/config.json create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/5588/input.js create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/5588/output.js diff --git a/crates/swc_ecma_minifier/src/compress/optimize/unused.rs b/crates/swc_ecma_minifier/src/compress/optimize/unused.rs index 1aa13c5dcd9f..b5433a24eaac 100644 --- a/crates/swc_ecma_minifier/src/compress/optimize/unused.rs +++ b/crates/swc_ecma_minifier/src/compress/optimize/unused.rs @@ -473,10 +473,22 @@ where } match decl { - Decl::Class(ClassDecl { ident, .. }) => { + Decl::Class(ClassDecl { ident, class, .. }) => { if ident.sym == js_word!("arguments") { return; } + + // Fix https://github.com/swc-project/swc/issues/5588 + let may_have_side_effect = class.body.iter().any(|m| match m { + ClassMember::ClassProp(p) => p.is_static && p.value.is_some(), + ClassMember::PrivateProp(p) => p.is_static && p.value.is_some(), + ClassMember::StaticBlock(_) => true, + _ => true, + }); + if may_have_side_effect { + return; + } + // If it is not used, drop it. if self .data diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/5588/config.json b/crates/swc_ecma_minifier/tests/fixture/issues/5588/config.json new file mode 100644 index 000000000000..b987119e94fb --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/5588/config.json @@ -0,0 +1,4 @@ +{ + "unused": true, + "toplevel": true +} \ No newline at end of file diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/5588/input.js b/crates/swc_ecma_minifier/tests/fixture/issues/5588/input.js new file mode 100644 index 000000000000..8581920fa47e --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/5588/input.js @@ -0,0 +1,12 @@ +"use strict"; +let getFoo; +let getFoo2 +class Foo { + static #foo = 42; + static #_ = (getFoo2 = this.#foo) + static{ + getFoo = ()=>this.#foo; + } +} +expect(getFoo()).toBe(42); +expect(getFoo2()).toBe(42); \ No newline at end of file diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/5588/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/5588/output.js new file mode 100644 index 000000000000..f70de3b7c4fe --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/5588/output.js @@ -0,0 +1,12 @@ +"use strict"; +let getFoo; +let getFoo2; +class Foo { + static #foo = 42; + static #_ = getFoo2 = this.#foo; + static{ + getFoo = ()=>this.#foo; + } +} +expect(getFoo()).toBe(42); +expect(getFoo2()).toBe(42);