diff --git a/tsc/internal/transformers/tstransforms/runtimesyntax.go b/tsc/internal/transformers/tstransforms/runtimesyntax.go index 35c29262606b0..360a39e323b86 100644 --- a/tsc/internal/transformers/tstransforms/runtimesyntax.go +++ b/tsc/internal/transformers/tstransforms/runtimesyntax.go @@ -676,7 +676,10 @@ func (tx *RuntimeSyntaxTransformer) visitClassDeclaration(node *ast.ClassDeclara } name := tx.Visitor().VisitNode(node.Name()) - if name == nil && (exported || ast.ChildIsDecorated(tx.compilerOptions.ExperimentalDecorators.IsTrue(), node.AsNode(), nil)) { + if name == nil && (exported || + ast.ChildIsDecorated(tx.compilerOptions.ExperimentalDecorators.IsTrue(), node.AsNode(), nil) || + node.ModifierFlags()&ast.ModifierFlagsExportDefault != ast.ModifierFlagsExportDefault && + ast.NodeIsDecorated(tx.compilerOptions.ExperimentalDecorators.IsTrue(), node.AsNode(), nil, nil)) { name = tx.Factory().NewGeneratedNameForNode(node.AsNode()) } heritageClauses := tx.Visitor().VisitNodes(node.HeritageClauses) diff --git a/tsc/testdata/baselines/reference/compiler/anonymousClassDeclarationWithClassDecorator.errors.txt b/tsc/testdata/baselines/reference/compiler/anonymousClassDeclarationWithClassDecorator.errors.txt new file mode 100644 index 0000000000000..4d3b3094a5b8f --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/anonymousClassDeclarationWithClassDecorator.errors.txt @@ -0,0 +1,19 @@ +anonymousClassDeclarationWithClassDecorator.ts(3,1): error TS1211: A class declaration without the 'default' modifier must have a name. +anonymousClassDeclarationWithClassDecorator.ts(8,1): error TS1029: 'export' modifier must precede 'default' modifier. + + +==== anonymousClassDeclarationWithClassDecorator.ts (2 errors) ==== + declare var dec: any; + + @dec + ~ +!!! error TS1211: A class declaration without the 'default' modifier must have a name. + class { + } + + @dec + default class { + ~~~~~~~ +!!! error TS1029: 'export' modifier must precede 'default' modifier. + } + \ No newline at end of file diff --git a/tsc/testdata/baselines/reference/compiler/anonymousClassDeclarationWithClassDecorator.js b/tsc/testdata/baselines/reference/compiler/anonymousClassDeclarationWithClassDecorator.js new file mode 100644 index 0000000000000..f86744e8696bc --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/anonymousClassDeclarationWithClassDecorator.js @@ -0,0 +1,84 @@ +//// [tests/cases/compiler/anonymousClassDeclarationWithClassDecorator.ts] //// + +//// [anonymousClassDeclarationWithClassDecorator.ts] +declare var dec: any; + +@dec +class { +} + +@dec +default class { +} + + +//// [anonymousClassDeclarationWithClassDecorator.js] +"use strict"; +var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { + function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } + var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; + var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; + var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); + var _, done = false; + for (var i = decorators.length - 1; i >= 0; i--) { + var context = {}; + for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; + for (var p in contextIn.access) context.access[p] = contextIn.access[p]; + context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; + var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); + if (kind === "accessor") { + if (result === void 0) continue; + if (result === null || typeof result !== "object") throw new TypeError("Object expected"); + if (_ = accept(result.get)) descriptor.get = _; + if (_ = accept(result.set)) descriptor.set = _; + if (_ = accept(result.init)) initializers.unshift(_); + } + else if (_ = accept(result)) { + if (kind === "field") initializers.unshift(_); + else descriptor[key] = _; + } + } + if (target) Object.defineProperty(target, contextIn.name, descriptor); + done = true; +}; +var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) { + var useValue = arguments.length > 2; + for (var i = 0; i < initializers.length; i++) { + value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); + } + return useValue ? value : void 0; +}; +let default_1 = (() => { + let _classDecorators = [dec]; + let _classDescriptor; + let _classExtraInitializers = []; + let _classThis; + var default_1 = class { + static { _classThis = this; } + static { + const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0; + __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); + default_1 = _classThis = _classDescriptor.value; + if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); + __runInitializers(_classThis, _classExtraInitializers); + } + }; + return default_1 = _classThis; +})(); +default let default_2 = (() => { + let _classDecorators = [dec]; + let _classDescriptor; + let _classExtraInitializers = []; + let _classThis; + var default_2 = class { + static { _classThis = this; } + static { + const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0; + __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); + default_2 = _classThis = _classDescriptor.value; + if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); + __runInitializers(_classThis, _classExtraInitializers); + } + }; + return default_2 = _classThis; +})(); diff --git a/tsc/testdata/baselines/reference/compiler/anonymousClassDeclarationWithClassDecorator.symbols b/tsc/testdata/baselines/reference/compiler/anonymousClassDeclarationWithClassDecorator.symbols new file mode 100644 index 0000000000000..6226357f045dd --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/anonymousClassDeclarationWithClassDecorator.symbols @@ -0,0 +1,18 @@ +//// [tests/cases/compiler/anonymousClassDeclarationWithClassDecorator.ts] //// + +=== anonymousClassDeclarationWithClassDecorator.ts === +declare var dec: any; +>dec : Symbol(dec, Decl(anonymousClassDeclarationWithClassDecorator.ts, 0, 11)) + +@dec +>dec : Symbol(dec, Decl(anonymousClassDeclarationWithClassDecorator.ts, 0, 11)) + +class { +} + +@dec +>dec : Symbol(dec, Decl(anonymousClassDeclarationWithClassDecorator.ts, 0, 11)) + +default class { +} + diff --git a/tsc/testdata/baselines/reference/compiler/anonymousClassDeclarationWithClassDecorator.types b/tsc/testdata/baselines/reference/compiler/anonymousClassDeclarationWithClassDecorator.types new file mode 100644 index 0000000000000..5a49ff16e2d67 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/anonymousClassDeclarationWithClassDecorator.types @@ -0,0 +1,18 @@ +//// [tests/cases/compiler/anonymousClassDeclarationWithClassDecorator.ts] //// + +=== anonymousClassDeclarationWithClassDecorator.ts === +declare var dec: any; +>dec : any + +@dec +>dec : any + +class { +} + +@dec +>dec : any + +default class { +} + diff --git a/tsc/testdata/tests/cases/compiler/anonymousClassDeclarationWithClassDecorator.ts b/tsc/testdata/tests/cases/compiler/anonymousClassDeclarationWithClassDecorator.ts new file mode 100644 index 0000000000000..e2ac4135013d6 --- /dev/null +++ b/tsc/testdata/tests/cases/compiler/anonymousClassDeclarationWithClassDecorator.ts @@ -0,0 +1,11 @@ +// @target: es2022 + +declare var dec: any; + +@dec +class { +} + +@dec +default class { +}