From 45f671d8d85b0c3955c88ec3cf3d68d8fa6134c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Thu, 4 Jul 2024 21:08:45 +0900 Subject: [PATCH] fix(es/renamer): Fix renaming of default-exported declarations (#9135) **Related issue:** - Closes #9129 --- .../fixture/issues-9xxx/9129/1/input/.swcrc | 28 +++++++++++++++++ .../fixture/issues-9xxx/9129/1/input/1.js | 5 ++++ .../fixture/issues-9xxx/9129/1/input/2.js | 5 ++++ .../fixture/issues-9xxx/9129/1/input/3.js | 5 ++++ .../fixture/issues-9xxx/9129/1/input/4.js | 5 ++++ .../fixture/issues-9xxx/9129/1/output/1.js | 6 ++++ .../fixture/issues-9xxx/9129/1/output/2.js | 6 ++++ .../fixture/issues-9xxx/9129/1/output/3.js | 4 +++ .../fixture/issues-9xxx/9129/1/output/4.js | 4 +++ .../fixture/issues-9xxx/9129/2/input/.swcrc | 25 ++++++++++++++++ .../fixture/issues-9xxx/9129/2/input/1.js | 5 ++++ .../fixture/issues-9xxx/9129/2/input/2.js | 5 ++++ .../fixture/issues-9xxx/9129/2/input/3.js | 5 ++++ .../fixture/issues-9xxx/9129/2/input/4.js | 5 ++++ .../fixture/issues-9xxx/9129/2/output/1.js | 3 ++ .../fixture/issues-9xxx/9129/2/output/2.js | 3 ++ .../fixture/issues-9xxx/9129/2/output/3.js | 4 +++ .../fixture/issues-9xxx/9129/2/output/4.js | 4 +++ .../class_name_can_be_preserved/output.js | 4 +-- .../keep_names/keep_classnames/output.js | 4 +-- .../src/rename/analyzer/mod.rs | 4 +-- .../src/rename/mod.rs | 30 ++++++++++++++++--- 22 files changed, 159 insertions(+), 10 deletions(-) create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/1/input/.swcrc create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/1/input/1.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/1/input/2.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/1/input/3.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/1/input/4.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/1/output/1.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/1/output/2.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/1/output/3.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/1/output/4.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/2/input/.swcrc create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/2/input/1.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/2/input/2.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/2/input/3.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/2/input/4.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/2/output/1.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/2/output/2.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/2/output/3.js create mode 100644 crates/swc/tests/fixture/issues-9xxx/9129/2/output/4.js diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/1/input/.swcrc b/crates/swc/tests/fixture/issues-9xxx/9129/1/input/.swcrc new file mode 100644 index 000000000000..d164a448d868 --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/1/input/.swcrc @@ -0,0 +1,28 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": true, + "decorators": true + }, + "target": "es2022", + "transform": { + "decoratorMetadata": true, + "react": { + "refresh": true, + "development": true + } + }, + "externalHelpers": true, + "loose": false, + "minify": { + "compress": false, + "mangle": false + } + }, + "module": { + "type": "es6" + }, + "minify": false, + "isModule": "unknown" +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/1/input/1.js b/crates/swc/tests/fixture/issues-9xxx/9129/1/input/1.js new file mode 100644 index 000000000000..027f3de81f0c --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/1/input/1.js @@ -0,0 +1,5 @@ +eval('') +export default function Foo() { +} + +Foo() \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/1/input/2.js b/crates/swc/tests/fixture/issues-9xxx/9129/1/input/2.js new file mode 100644 index 000000000000..ac39a4ea4e66 --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/1/input/2.js @@ -0,0 +1,5 @@ +eval('') +export function Foo() { +} + +Foo() \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/1/input/3.js b/crates/swc/tests/fixture/issues-9xxx/9129/1/input/3.js new file mode 100644 index 000000000000..48990cb34aeb --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/1/input/3.js @@ -0,0 +1,5 @@ +eval('') +export default class Foo { +} + +new Foo() \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/1/input/4.js b/crates/swc/tests/fixture/issues-9xxx/9129/1/input/4.js new file mode 100644 index 000000000000..f4deba0fbf1a --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/1/input/4.js @@ -0,0 +1,5 @@ +eval('') +export class Foo { +} + +new Foo() \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/1/output/1.js b/crates/swc/tests/fixture/issues-9xxx/9129/1/output/1.js new file mode 100644 index 000000000000..0518e808e7b6 --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/1/output/1.js @@ -0,0 +1,6 @@ +eval(''); +export default function Foo() {} +_c = Foo; +Foo(); +var _c; +$RefreshReg$(_c, "Foo"); diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/1/output/2.js b/crates/swc/tests/fixture/issues-9xxx/9129/1/output/2.js new file mode 100644 index 000000000000..5b2615dbe1f6 --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/1/output/2.js @@ -0,0 +1,6 @@ +eval(''); +export function Foo() {} +_c = Foo; +Foo(); +var _c; +$RefreshReg$(_c, "Foo"); diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/1/output/3.js b/crates/swc/tests/fixture/issues-9xxx/9129/1/output/3.js new file mode 100644 index 000000000000..4b5d61d33a7e --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/1/output/3.js @@ -0,0 +1,4 @@ +eval(''); +export default class Foo { +} +new Foo(); diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/1/output/4.js b/crates/swc/tests/fixture/issues-9xxx/9129/1/output/4.js new file mode 100644 index 000000000000..a16bef2ad3b5 --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/1/output/4.js @@ -0,0 +1,4 @@ +eval(''); +export class Foo { +} +new Foo(); diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/2/input/.swcrc b/crates/swc/tests/fixture/issues-9xxx/9129/2/input/.swcrc new file mode 100644 index 000000000000..379e9b8d1450 --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/2/input/.swcrc @@ -0,0 +1,25 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": true, + "decorators": true + }, + "target": "es2022", + "transform": { + "decoratorMetadata": true, + "react": {} + }, + "externalHelpers": true, + "loose": false, + "minify": { + "compress": false, + "mangle": false + } + }, + "module": { + "type": "es6" + }, + "minify": false, + "isModule": "unknown" +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/2/input/1.js b/crates/swc/tests/fixture/issues-9xxx/9129/2/input/1.js new file mode 100644 index 000000000000..027f3de81f0c --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/2/input/1.js @@ -0,0 +1,5 @@ +eval('') +export default function Foo() { +} + +Foo() \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/2/input/2.js b/crates/swc/tests/fixture/issues-9xxx/9129/2/input/2.js new file mode 100644 index 000000000000..ac39a4ea4e66 --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/2/input/2.js @@ -0,0 +1,5 @@ +eval('') +export function Foo() { +} + +Foo() \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/2/input/3.js b/crates/swc/tests/fixture/issues-9xxx/9129/2/input/3.js new file mode 100644 index 000000000000..48990cb34aeb --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/2/input/3.js @@ -0,0 +1,5 @@ +eval('') +export default class Foo { +} + +new Foo() \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/2/input/4.js b/crates/swc/tests/fixture/issues-9xxx/9129/2/input/4.js new file mode 100644 index 000000000000..f4deba0fbf1a --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/2/input/4.js @@ -0,0 +1,5 @@ +eval('') +export class Foo { +} + +new Foo() \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/2/output/1.js b/crates/swc/tests/fixture/issues-9xxx/9129/2/output/1.js new file mode 100644 index 000000000000..57971d632525 --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/2/output/1.js @@ -0,0 +1,3 @@ +eval(''); +export default function Foo() {} +Foo(); diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/2/output/2.js b/crates/swc/tests/fixture/issues-9xxx/9129/2/output/2.js new file mode 100644 index 000000000000..c138e1628807 --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/2/output/2.js @@ -0,0 +1,3 @@ +eval(''); +export function Foo() {} +Foo(); diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/2/output/3.js b/crates/swc/tests/fixture/issues-9xxx/9129/2/output/3.js new file mode 100644 index 000000000000..4b5d61d33a7e --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/2/output/3.js @@ -0,0 +1,4 @@ +eval(''); +export default class Foo { +} +new Foo(); diff --git a/crates/swc/tests/fixture/issues-9xxx/9129/2/output/4.js b/crates/swc/tests/fixture/issues-9xxx/9129/2/output/4.js new file mode 100644 index 000000000000..a16bef2ad3b5 --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9129/2/output/4.js @@ -0,0 +1,4 @@ +eval(''); +export class Foo { +} +new Foo(); diff --git a/crates/swc_ecma_minifier/tests/terser/compress/harmony/class_name_can_be_preserved/output.js b/crates/swc_ecma_minifier/tests/terser/compress/harmony/class_name_can_be_preserved/output.js index a519e7a95647..0c6a49cfe5d9 100644 --- a/crates/swc_ecma_minifier/tests/terser/compress/harmony/class_name_can_be_preserved/output.js +++ b/crates/swc_ecma_minifier/tests/terser/compress/harmony/class_name_can_be_preserved/output.js @@ -1,6 +1,6 @@ function x() { (class Baz { }); - let Foo = class Foo { - }; + class Foo { + } } diff --git a/crates/swc_ecma_minifier/tests/terser/compress/keep_names/keep_classnames/output.js b/crates/swc_ecma_minifier/tests/terser/compress/keep_names/keep_classnames/output.js index 8405113bd30b..898f5a4141a3 100644 --- a/crates/swc_ecma_minifier/tests/terser/compress/keep_names/keep_classnames/output.js +++ b/crates/swc_ecma_minifier/tests/terser/compress/keep_names/keep_classnames/output.js @@ -1,4 +1,4 @@ function foo() { - let Bar = class Bar { - }; + class Bar { + } } diff --git a/crates/swc_ecma_transforms_base/src/rename/analyzer/mod.rs b/crates/swc_ecma_transforms_base/src/rename/analyzer/mod.rs index bb7f5ad429ac..671daec1c9df 100644 --- a/crates/swc_ecma_transforms_base/src/rename/analyzer/mod.rs +++ b/crates/swc_ecma_transforms_base/src/rename/analyzer/mod.rs @@ -218,7 +218,7 @@ impl Visit for Analyzer { self.add_decl(id.to_id(), true); } - f.function.visit_with(self) + f.visit_with(self); } DefaultDecl::TsInterfaceDecl(_) => {} } @@ -240,7 +240,7 @@ impl Visit for Analyzer { maybe_grow_default(|| e.visit_children_with(self)); if let Expr::Ident(i) = e { - self.add_usage(i.to_id()) + self.add_usage(i.to_id()); } self.is_pat_decl = old_is_pat_decl; diff --git a/crates/swc_ecma_transforms_base/src/rename/mod.rs b/crates/swc_ecma_transforms_base/src/rename/mod.rs index de42107ca532..8d5174411a1f 100644 --- a/crates/swc_ecma_transforms_base/src/rename/mod.rs +++ b/crates/swc_ecma_transforms_base/src/rename/mod.rs @@ -202,7 +202,9 @@ macro_rules! unit { } else { let map = self.get_map(n, false, false, false); - n.visit_mut_with(&mut rename_with_config(&map, self.config.clone())); + if !map.is_empty() { + n.visit_mut_with(&mut rename_with_config(&map, self.config.clone())); + } } } }; @@ -214,7 +216,9 @@ macro_rules! unit { } else { let map = self.get_map(n, true, false, false); - n.visit_mut_with(&mut rename_with_config(&map, self.config.clone())); + if !map.is_empty() { + n.visit_mut_with(&mut rename_with_config(&map, self.config.clone())); + } } } }; @@ -246,6 +250,20 @@ where unit!(visit_mut_class_decl, ClassDecl, true); + fn visit_mut_default_decl(&mut self, n: &mut DefaultDecl) { + match n { + DefaultDecl::Class(n) => { + n.visit_mut_children_with(self); + } + DefaultDecl::Fn(n) => { + n.visit_mut_children_with(self); + } + DefaultDecl::TsInterfaceDecl(n) => { + n.visit_mut_children_with(self); + } + } + } + fn visit_mut_expr(&mut self, n: &mut Expr) { maybe_grow_default(|| n.visit_mut_children_with(self)); } @@ -284,7 +302,9 @@ where m.visit_mut_children_with(self); } - m.visit_mut_with(&mut rename_with_config(&map, self.config.clone())); + if !map.is_empty() { + m.visit_mut_with(&mut rename_with_config(&map, self.config.clone())); + } } fn visit_mut_script(&mut self, m: &mut Script) { @@ -300,7 +320,9 @@ where m.visit_mut_children_with(self); } - m.visit_mut_with(&mut rename_with_config(&map, self.config.clone())); + if !map.is_empty() { + m.visit_mut_with(&mut rename_with_config(&map, self.config.clone())); + } } }