diff --git a/.changeset/flat-geese-care.md b/.changeset/flat-geese-care.md new file mode 100644 index 000000000000..4b0f2a8cd206 --- /dev/null +++ b/.changeset/flat-geese-care.md @@ -0,0 +1,5 @@ +--- +swc_ecma_transforms_proposal: patch +--- + +fix(es/decorator): Use correct class name reference diff --git a/crates/swc/tests/fixture/issues-9xxx/9350/input/.swcrc b/crates/swc/tests/fixture/issues-9xxx/9350/input/.swcrc new file mode 100644 index 000000000000..fc1bae37af8c --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9350/input/.swcrc @@ -0,0 +1,13 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "decorators": true + }, + "target": "es2016" + }, + "module": { + "type": "es6" + }, + "isModule": true +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-9xxx/9350/input/index.ts b/crates/swc/tests/fixture/issues-9xxx/9350/input/index.ts new file mode 100644 index 000000000000..2af9a0de49cd --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9350/input/index.ts @@ -0,0 +1,18 @@ +function registerHook(key) { + return (...args) => console.log(args); +} + +export default function design(base: typeof Component) { + return class Design extends base { + copy() { + console.log("copy"); + } + + @registerHook("beforeRender") + @registerHook("afterRender") + render() { + super.render(); + console.log("design render"); + } + }; +} diff --git a/crates/swc/tests/fixture/issues-9xxx/9350/input/test.ts b/crates/swc/tests/fixture/issues-9xxx/9350/input/test.ts new file mode 100644 index 000000000000..d7c98af4452d --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9350/input/test.ts @@ -0,0 +1,19 @@ +function registerHook(key) { + return (...args) => console.log(args); +} + +export default function design(base: typeof Component) { + const Design = "test name conflict"; + return class Design extends base { + copy() { + console.log("copy"); + } + + @registerHook("beforeRender") + @registerHook("afterRender") + render() { + super.render(); + console.log("design render"); + } + }; +} diff --git a/crates/swc/tests/fixture/issues-9xxx/9350/output/index.ts b/crates/swc/tests/fixture/issues-9xxx/9350/output/index.ts new file mode 100644 index 000000000000..f2f2c192eb99 --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9350/output/index.ts @@ -0,0 +1,19 @@ +import { _ as _ts_decorate } from "@swc/helpers/_/_ts_decorate"; +function registerHook(key) { + return (...args)=>console.log(args); +} +export default function design(base) { + var Design; + return Design = class Design extends base { + copy() { + console.log("copy"); + } + render() { + super.render(); + console.log("design render"); + } + }, _ts_decorate([ + registerHook("beforeRender"), + registerHook("afterRender") + ], Design.prototype, "render", null), Design; +} diff --git a/crates/swc/tests/fixture/issues-9xxx/9350/output/test.ts b/crates/swc/tests/fixture/issues-9xxx/9350/output/test.ts new file mode 100644 index 000000000000..f7a9bad70760 --- /dev/null +++ b/crates/swc/tests/fixture/issues-9xxx/9350/output/test.ts @@ -0,0 +1,20 @@ +import { _ as _ts_decorate } from "@swc/helpers/_/_ts_decorate"; +function registerHook(key) { + return (...args)=>console.log(args); +} +export default function design(base) { + const Design = "test name conflict"; + var Design1; + return Design1 = class Design1 extends base { + copy() { + console.log("copy"); + } + render() { + super.render(); + console.log("design render"); + } + }, _ts_decorate([ + registerHook("beforeRender"), + registerHook("afterRender") + ], Design1.prototype, "render", null), Design1; +} diff --git a/crates/swc_ecma_transforms_proposal/src/decorators/legacy/mod.rs b/crates/swc_ecma_transforms_proposal/src/decorators/legacy/mod.rs index 28731050bec1..d422fa4e5c0b 100644 --- a/crates/swc_ecma_transforms_proposal/src/decorators/legacy/mod.rs +++ b/crates/swc_ecma_transforms_proposal/src/decorators/legacy/mod.rs @@ -332,14 +332,16 @@ impl VisitMut for TscDecorator { return; } - let var_name = private_ident!("_class"); - let ident = n.ident.get_or_insert_with(|| var_name.clone()); + let ident = n + .ident + .get_or_insert_with(|| private_ident!("_class")) + .clone(); let old = mem::replace(&mut self.class_name, Some(ident.clone())); n.visit_mut_children_with(self); - self.assign_class_expr_to = Some(var_name); + self.assign_class_expr_to = Some(ident); self.class_name = old; }