From a39eb85db5976b13b796f5857de93c231a5fd8a1 Mon Sep 17 00:00:00 2001 From: Dunqing <29533304+Dunqing@users.noreply.github.com> Date: Mon, 12 May 2025 13:12:00 +0000 Subject: [PATCH] fix(transformer/legacy-decorator): abstract class doesn't work in metadata (#10952) close: #10926 --- .../src/decorator/legacy/metadata.rs | 2 +- .../oxc_transformer/src/decorator/legacy/mod.rs | 2 +- tasks/transform_conformance/snapshots/oxc.snap.md | 15 +++++++++++++-- .../fixtures/oxc/metadata/abstract-class/input.ts | 6 ++++++ .../oxc/metadata/abstract-class/output.ts | 11 +++++++++++ 5 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 tasks/transform_conformance/tests/legacy-decorators/test/fixtures/oxc/metadata/abstract-class/input.ts create mode 100644 tasks/transform_conformance/tests/legacy-decorators/test/fixtures/oxc/metadata/abstract-class/output.ts diff --git a/crates/oxc_transformer/src/decorator/legacy/metadata.rs b/crates/oxc_transformer/src/decorator/legacy/metadata.rs index 6d38166f5b6a6..2318364763386 100644 --- a/crates/oxc_transformer/src/decorator/legacy/metadata.rs +++ b/crates/oxc_transformer/src/decorator/legacy/metadata.rs @@ -107,7 +107,7 @@ impl<'a, 'ctx> LegacyDecoratorMetadata<'a, 'ctx> { impl<'a> Traverse<'a> for LegacyDecoratorMetadata<'a, '_> { fn enter_class(&mut self, class: &mut Class<'a>, ctx: &mut TraverseCtx<'a>) { - if class.is_expression() || class.is_typescript_syntax() { + if class.is_expression() || class.declare { return; } diff --git a/crates/oxc_transformer/src/decorator/legacy/mod.rs b/crates/oxc_transformer/src/decorator/legacy/mod.rs index 34f50337b01e8..02e6029aecce8 100644 --- a/crates/oxc_transformer/src/decorator/legacy/mod.rs +++ b/crates/oxc_transformer/src/decorator/legacy/mod.rs @@ -808,7 +808,7 @@ impl<'a> LegacyDecorator<'a, '_> { /// Check if a class or its elements have decorators. fn check_class_has_decorated(class: &Class<'a>) -> ClassDecoratorInfo { // Legacy decorator does not allow in class expression. - if class.is_expression() || class.is_typescript_syntax() { + if class.is_expression() || class.declare { return ClassDecoratorInfo::default(); } diff --git a/tasks/transform_conformance/snapshots/oxc.snap.md b/tasks/transform_conformance/snapshots/oxc.snap.md index 97c09966f39a0..beb49233bfa93 100644 --- a/tasks/transform_conformance/snapshots/oxc.snap.md +++ b/tasks/transform_conformance/snapshots/oxc.snap.md @@ -1,6 +1,6 @@ commit: 578ac4df -Passed: 152/253 +Passed: 152/254 # All Passed: * babel-plugin-transform-class-static-block @@ -497,7 +497,18 @@ after transform: SymbolId(4): ScopeId(1) rebuilt : SymbolId(5): ScopeId(4) -# legacy-decorators (4/73) +# legacy-decorators (4/74) +* oxc/metadata/abstract-class/input.ts +Symbol reference IDs mismatch for "Dependency": +after transform: SymbolId(1): [ReferenceId(1), ReferenceId(2), ReferenceId(3)] +rebuilt : SymbolId(1): [ReferenceId(6), ReferenceId(7)] +Symbol span mismatch for "AbstractClass": +after transform: SymbolId(2): Span { start: 69, end: 82 } +rebuilt : SymbolId(3): Span { start: 0, end: 0 } +Symbol span mismatch for "AbstractClass": +after transform: SymbolId(5): Span { start: 0, end: 0 } +rebuilt : SymbolId(4): Span { start: 69, end: 82 } + * oxc/metadata/bound-type-reference/input.ts Symbol reference IDs mismatch for "BoundTypeReference": after transform: SymbolId(0): [ReferenceId(1), ReferenceId(3), ReferenceId(4), ReferenceId(5), ReferenceId(6)] diff --git a/tasks/transform_conformance/tests/legacy-decorators/test/fixtures/oxc/metadata/abstract-class/input.ts b/tasks/transform_conformance/tests/legacy-decorators/test/fixtures/oxc/metadata/abstract-class/input.ts new file mode 100644 index 0000000000000..56e361b00f39b --- /dev/null +++ b/tasks/transform_conformance/tests/legacy-decorators/test/fixtures/oxc/metadata/abstract-class/input.ts @@ -0,0 +1,6 @@ +import { dce, Dependency } from "mod"; + +@dce() +export abstract class AbstractClass { + constructor(public dependency: Dependency) {} +} diff --git a/tasks/transform_conformance/tests/legacy-decorators/test/fixtures/oxc/metadata/abstract-class/output.ts b/tasks/transform_conformance/tests/legacy-decorators/test/fixtures/oxc/metadata/abstract-class/output.ts new file mode 100644 index 0000000000000..c0fe4eb712e8b --- /dev/null +++ b/tasks/transform_conformance/tests/legacy-decorators/test/fixtures/oxc/metadata/abstract-class/output.ts @@ -0,0 +1,11 @@ +import { dce, Dependency } from "mod"; + +var _ref; +let AbstractClass = class AbstractClass { + constructor(dependency) { + this.dependency = dependency; + } +}; +AbstractClass = babelHelpers.decorate([dce(), babelHelpers.decorateMetadata("design:paramtypes", [typeof (_ref = typeof Dependency !== "undefined" && Dependency) === "function" ? _ref : Object])], AbstractClass); + +export { AbstractClass };