From e4f83a097a81d6a2c2fd6de2a135fbbdc3d48f02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 29 Jul 2025 10:23:01 +0900 Subject: [PATCH 1/4] Add a test --- .../tests/fixture/issues/cycle-1/input.js | 26 +++++++++++++++++++ .../tests/fixture/issues/cycle-2/input.js | 20 ++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/cycle-1/input.js create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/cycle-2/input.js diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/cycle-1/input.js b/crates/swc_ecma_minifier/tests/fixture/issues/cycle-1/input.js new file mode 100644 index 000000000000..2c146fc3f437 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/cycle-1/input.js @@ -0,0 +1,26 @@ +(() => { + class A { + cycle() { + return B; + } + } + class B { + cycle() { + return A + } + } + + class ExtendsA1 extends sideEffectWith(A) {} + class Unused1 { + constructor() { + ExtendsA1 + } + } + class ExtendsA2 extends sideEffectWith(A) {} + class Unused2 { + async put() { + ExtendsA2 + } + } + })(); + \ No newline at end of file diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/cycle-2/input.js b/crates/swc_ecma_minifier/tests/fixture/issues/cycle-2/input.js new file mode 100644 index 000000000000..faa26e631725 --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/cycle-2/input.js @@ -0,0 +1,20 @@ + +(() => { + class C { + cycle() { + return D; + } + } + class D { + cycle() { + return C + } + } + + class ExtendsC extends sideEffectWith(C) {} + class Unused { + constructor() { + ExtendsC + } + } + })(); From 5a2f65dcfb7f486f066e0363a613f2dcb6d38225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 29 Jul 2025 10:52:48 +0900 Subject: [PATCH 2/4] fix cycle detection of super class --- .../src/simplify/dce/mod.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/crates/swc_ecma_transforms_optimization/src/simplify/dce/mod.rs b/crates/swc_ecma_transforms_optimization/src/simplify/dce/mod.rs index c4e9bf990e75..1315ef7f7ca3 100644 --- a/crates/swc_ecma_transforms_optimization/src/simplify/dce/mod.rs +++ b/crates/swc_ecma_transforms_optimization/src/simplify/dce/mod.rs @@ -471,10 +471,16 @@ impl Visit for Analyzer<'_> { } fn visit_class_decl(&mut self, n: &ClassDecl) { + if let Some(super_class) = &n.class.super_class { + super_class.visit_with(self); + } + self.with_ast_path(vec![n.ident.to_id()], |v| { let old = v.cur_class_id.take(); v.cur_class_id = Some(n.ident.to_id()); - n.visit_children_with(v); + n.ident.visit_with(v); + n.class.decorators.visit_with(v); + n.class.body.visit_with(v); v.cur_class_id = old; if !n.class.decorators.is_empty() { From 39ca5a42235e5015d98032706a4951caa53c07ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 29 Jul 2025 10:54:37 +0900 Subject: [PATCH 3/4] Update test refs --- ...ivateNamesConstructorChain-1.2.minified.js | 35 ++++++++++++++++--- .../tests/fixture/issues/cycle-1/output.js | 11 ++++++ .../tests/fixture/issues/cycle-2/output.js | 11 ++++++ 3 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/cycle-1/output.js create mode 100644 crates/swc_ecma_minifier/tests/fixture/issues/cycle-2/output.js diff --git a/crates/swc/tests/tsc-references/privateNamesConstructorChain-1.2.minified.js b/crates/swc/tests/tsc-references/privateNamesConstructorChain-1.2.minified.js index a05d0d430c94..278a055ecb0e 100644 --- a/crates/swc/tests/tsc-references/privateNamesConstructorChain-1.2.minified.js +++ b/crates/swc/tests/tsc-references/privateNamesConstructorChain-1.2.minified.js @@ -1,5 +1,32 @@ //// [privateNamesConstructorChain-1.ts] -import "@swc/helpers/_/_class_private_field_get"; -import "@swc/helpers/_/_class_private_field_init"; -import "@swc/helpers/_/_class_private_field_set"; -import "@swc/helpers/_/_class_static_private_field_spec_get"; +import { _ as _class_private_field_get } from "@swc/helpers/_/_class_private_field_get"; +import { _ as _class_private_field_init } from "@swc/helpers/_/_class_private_field_init"; +import { _ as _class_private_field_set } from "@swc/helpers/_/_class_private_field_set"; +import { _ as _class_static_private_field_spec_get } from "@swc/helpers/_/_class_static_private_field_spec_get"; +var _foo = /*#__PURE__*/ new WeakMap(); +class Parent { + accessChildProps() { + _class_private_field_get(new Child(), _foo), _class_static_private_field_spec_get(Child, Parent, _bar); + } + constructor(){ + _class_private_field_init(this, _foo, { + writable: !0, + value: void 0 + }), _class_private_field_set(this, _foo, 3); + } +} +var _bar = { + writable: !0, + value: 5 +}, _foo1 = /*#__PURE__*/ new WeakMap(), _bar1 = /*#__PURE__*/ new WeakMap(); +class Child extends Parent { + constructor(...args){ + super(...args), _class_private_field_init(this, _foo1, { + writable: !0, + value: void 0 + }), _class_private_field_init(this, _bar1, { + writable: !0, + value: void 0 + }), _class_private_field_set(this, _foo1, "foo"), _class_private_field_set(this, _bar1, "bar"); + } +} diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/cycle-1/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/cycle-1/output.js new file mode 100644 index 000000000000..70ed38f7fa3a --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/cycle-1/output.js @@ -0,0 +1,11 @@ +class A { + cycle() { + return B; + } +} +class B { + cycle() { + return A; + } +} +sideEffectWith(A), sideEffectWith(A); diff --git a/crates/swc_ecma_minifier/tests/fixture/issues/cycle-2/output.js b/crates/swc_ecma_minifier/tests/fixture/issues/cycle-2/output.js new file mode 100644 index 000000000000..b8833af0972c --- /dev/null +++ b/crates/swc_ecma_minifier/tests/fixture/issues/cycle-2/output.js @@ -0,0 +1,11 @@ +class C { + cycle() { + return D; + } +} +class D { + cycle() { + return C; + } +} +sideEffectWith(C); From 8b585d9f28b9f022de6802d0f8dee3bf004e686a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Tue, 29 Jul 2025 10:56:15 +0900 Subject: [PATCH 4/4] Create breezy-experts-complain.md --- .changeset/breezy-experts-complain.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .changeset/breezy-experts-complain.md diff --git a/.changeset/breezy-experts-complain.md b/.changeset/breezy-experts-complain.md new file mode 100644 index 000000000000..f4916c4433d6 --- /dev/null +++ b/.changeset/breezy-experts-complain.md @@ -0,0 +1,9 @@ +--- +swc_ecma_utils: patch +swc_core: patch +swc_ecma_lexer: patch +swc_ecma_parser: patch +swc_ecma_usage_analyzer: patch +--- + +fix(es/minifier): Fix cycle detection