diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index dc8b62796cc2b..0ef7db0627219 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -1590,6 +1590,18 @@ namespace ts { case SyntaxKind.ImportType: break; + // handle JSDoc types from an invalid parse + case SyntaxKind.JSDocAllType: + case SyntaxKind.JSDocUnknownType: + case SyntaxKind.JSDocFunctionType: + case SyntaxKind.JSDocVariadicType: + case SyntaxKind.JSDocNamepathType: + break; + + case SyntaxKind.JSDocNullableType: + case SyntaxKind.JSDocNonNullableType: + case SyntaxKind.JSDocOptionalType: + return serializeTypeNode((node).type); default: return Debug.failBadSyntaxKind(node); diff --git a/tests/baselines/reference/decoratorMetadata-jsdoc.errors.txt b/tests/baselines/reference/decoratorMetadata-jsdoc.errors.txt new file mode 100644 index 0000000000000..a2af419361d64 --- /dev/null +++ b/tests/baselines/reference/decoratorMetadata-jsdoc.errors.txt @@ -0,0 +1,22 @@ +tests/cases/conformance/decorators/decoratorMetadata-jsdoc.ts(5,9): error TS8020: JSDoc types can only be used inside documentation comments. +tests/cases/conformance/decorators/decoratorMetadata-jsdoc.ts(7,9): error TS8020: JSDoc types can only be used inside documentation comments. +tests/cases/conformance/decorators/decoratorMetadata-jsdoc.ts(9,9): error TS8020: JSDoc types can only be used inside documentation comments. + + +==== tests/cases/conformance/decorators/decoratorMetadata-jsdoc.ts (3 errors) ==== + declare var decorator: any; + + class X { + @decorator() + a?: string?; + ~~~~~~~ +!!! error TS8020: JSDoc types can only be used inside documentation comments. + @decorator() + b?: string!; + ~~~~~~~ +!!! error TS8020: JSDoc types can only be used inside documentation comments. + @decorator() + c?: *; + ~ +!!! error TS8020: JSDoc types can only be used inside documentation comments. + } \ No newline at end of file diff --git a/tests/baselines/reference/decoratorMetadata-jsdoc.js b/tests/baselines/reference/decoratorMetadata-jsdoc.js new file mode 100644 index 0000000000000..ff7b1acbec5f2 --- /dev/null +++ b/tests/baselines/reference/decoratorMetadata-jsdoc.js @@ -0,0 +1,39 @@ +//// [decoratorMetadata-jsdoc.ts] +declare var decorator: any; + +class X { + @decorator() + a?: string?; + @decorator() + b?: string!; + @decorator() + c?: *; +} + +//// [decoratorMetadata-jsdoc.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var X = /** @class */ (function () { + function X() { + } + __decorate([ + decorator(), + __metadata("design:type", String) + ], X.prototype, "a", void 0); + __decorate([ + decorator(), + __metadata("design:type", String) + ], X.prototype, "b", void 0); + __decorate([ + decorator(), + __metadata("design:type", Object) + ], X.prototype, "c", void 0); + return X; +}()); diff --git a/tests/baselines/reference/decoratorMetadata-jsdoc.symbols b/tests/baselines/reference/decoratorMetadata-jsdoc.symbols new file mode 100644 index 0000000000000..260214db22a7c --- /dev/null +++ b/tests/baselines/reference/decoratorMetadata-jsdoc.symbols @@ -0,0 +1,25 @@ +=== tests/cases/conformance/decorators/decoratorMetadata-jsdoc.ts === +declare var decorator: any; +>decorator : Symbol(decorator, Decl(decoratorMetadata-jsdoc.ts, 0, 11)) + +class X { +>X : Symbol(X, Decl(decoratorMetadata-jsdoc.ts, 0, 27)) + + @decorator() +>decorator : Symbol(decorator, Decl(decoratorMetadata-jsdoc.ts, 0, 11)) + + a?: string?; +>a : Symbol(X.a, Decl(decoratorMetadata-jsdoc.ts, 2, 9)) + + @decorator() +>decorator : Symbol(decorator, Decl(decoratorMetadata-jsdoc.ts, 0, 11)) + + b?: string!; +>b : Symbol(X.b, Decl(decoratorMetadata-jsdoc.ts, 4, 16)) + + @decorator() +>decorator : Symbol(decorator, Decl(decoratorMetadata-jsdoc.ts, 0, 11)) + + c?: *; +>c : Symbol(X.c, Decl(decoratorMetadata-jsdoc.ts, 6, 16)) +} diff --git a/tests/baselines/reference/decoratorMetadata-jsdoc.types b/tests/baselines/reference/decoratorMetadata-jsdoc.types new file mode 100644 index 0000000000000..ef618b7cda05a --- /dev/null +++ b/tests/baselines/reference/decoratorMetadata-jsdoc.types @@ -0,0 +1,28 @@ +=== tests/cases/conformance/decorators/decoratorMetadata-jsdoc.ts === +declare var decorator: any; +>decorator : any + +class X { +>X : X + + @decorator() +>decorator() : any +>decorator : any + + a?: string?; +>a : string + + @decorator() +>decorator() : any +>decorator : any + + b?: string!; +>b : string + + @decorator() +>decorator() : any +>decorator : any + + c?: *; +>c : any +} diff --git a/tests/cases/conformance/decorators/decoratorMetadata-jsdoc.ts b/tests/cases/conformance/decorators/decoratorMetadata-jsdoc.ts new file mode 100644 index 0000000000000..822269366bc29 --- /dev/null +++ b/tests/cases/conformance/decorators/decoratorMetadata-jsdoc.ts @@ -0,0 +1,14 @@ +// @experimentalDecorators: true +// @emitDecoratorMetadata: true +// @target: es5 +// @module: commonjs +declare var decorator: any; + +class X { + @decorator() + a?: string?; + @decorator() + b?: string!; + @decorator() + c?: *; +} \ No newline at end of file