diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b8bdbacd73f..73a15fd5787 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -40195,6 +40195,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { for (const parameter of containingSignature.parameters) { markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(parameter)); } + markDecoratorMedataDataTypeNodeAsReferenced(getEffectiveReturnTypeNode(containingSignature)); break; } } diff --git a/tests/baselines/reference/decoratorMetadataElidedImport(module=commonjs).js b/tests/baselines/reference/decoratorMetadataElidedImport(module=commonjs).js new file mode 100644 index 00000000000..d9654b9eda0 --- /dev/null +++ b/tests/baselines/reference/decoratorMetadataElidedImport(module=commonjs).js @@ -0,0 +1,49 @@ +//// [tests/cases/compiler/decoratorMetadataElidedImport.ts] //// + +//// [observable.d.ts] +export declare class Observable {} + +//// [index.ts] +import { Observable } from './observable'; + +function whatever(a: any, b: any, c: any) {} + +class Test { + foo( + @whatever arg1: string, + @whatever arg2: number + ): Observable { + return null!; + } +} + + +//// [index.js] +"use strict"; +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 __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const observable_1 = require("./observable"); +function whatever(a, b, c) { } +class Test { + foo(arg1, arg2) { + return null; + } +} +__decorate([ + __param(0, whatever), + __param(1, whatever), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, Number]), + __metadata("design:returntype", observable_1.Observable) +], Test.prototype, "foo", null); diff --git a/tests/baselines/reference/decoratorMetadataElidedImport(module=commonjs).symbols b/tests/baselines/reference/decoratorMetadataElidedImport(module=commonjs).symbols new file mode 100644 index 00000000000..ce9fec74d0d --- /dev/null +++ b/tests/baselines/reference/decoratorMetadataElidedImport(module=commonjs).symbols @@ -0,0 +1,38 @@ +//// [tests/cases/compiler/decoratorMetadataElidedImport.ts] //// + +=== observable.d.ts === +export declare class Observable {} +>Observable : Symbol(Observable, Decl(observable.d.ts, 0, 0)) +>T : Symbol(T, Decl(observable.d.ts, 0, 32)) + +=== index.ts === +import { Observable } from './observable'; +>Observable : Symbol(Observable, Decl(index.ts, 0, 8)) + +function whatever(a: any, b: any, c: any) {} +>whatever : Symbol(whatever, Decl(index.ts, 0, 42)) +>a : Symbol(a, Decl(index.ts, 2, 18)) +>b : Symbol(b, Decl(index.ts, 2, 25)) +>c : Symbol(c, Decl(index.ts, 2, 33)) + +class Test { +>Test : Symbol(Test, Decl(index.ts, 2, 44)) + + foo( +>foo : Symbol(Test.foo, Decl(index.ts, 4, 12)) + + @whatever arg1: string, +>whatever : Symbol(whatever, Decl(index.ts, 0, 42)) +>arg1 : Symbol(arg1, Decl(index.ts, 5, 8)) + + @whatever arg2: number +>whatever : Symbol(whatever, Decl(index.ts, 0, 42)) +>arg2 : Symbol(arg2, Decl(index.ts, 6, 31)) + + ): Observable { +>Observable : Symbol(Observable, Decl(index.ts, 0, 8)) + + return null!; + } +} + diff --git a/tests/baselines/reference/decoratorMetadataElidedImport(module=commonjs).types b/tests/baselines/reference/decoratorMetadataElidedImport(module=commonjs).types new file mode 100644 index 00000000000..eb3551a859c --- /dev/null +++ b/tests/baselines/reference/decoratorMetadataElidedImport(module=commonjs).types @@ -0,0 +1,36 @@ +//// [tests/cases/compiler/decoratorMetadataElidedImport.ts] //// + +=== observable.d.ts === +export declare class Observable {} +>Observable : Observable + +=== index.ts === +import { Observable } from './observable'; +>Observable : typeof Observable + +function whatever(a: any, b: any, c: any) {} +>whatever : (a: any, b: any, c: any) => void +>a : any +>b : any +>c : any + +class Test { +>Test : Test + + foo( +>foo : (arg1: string, arg2: number) => Observable + + @whatever arg1: string, +>whatever : (a: any, b: any, c: any) => void +>arg1 : string + + @whatever arg2: number +>whatever : (a: any, b: any, c: any) => void +>arg2 : number + + ): Observable { + return null!; +>null! : never + } +} + diff --git a/tests/baselines/reference/decoratorMetadataElidedImport(module=esnext).js b/tests/baselines/reference/decoratorMetadataElidedImport(module=esnext).js new file mode 100644 index 00000000000..0c62a4a0157 --- /dev/null +++ b/tests/baselines/reference/decoratorMetadataElidedImport(module=esnext).js @@ -0,0 +1,47 @@ +//// [tests/cases/compiler/decoratorMetadataElidedImport.ts] //// + +//// [observable.d.ts] +export declare class Observable {} + +//// [index.ts] +import { Observable } from './observable'; + +function whatever(a: any, b: any, c: any) {} + +class Test { + foo( + @whatever arg1: string, + @whatever arg2: number + ): Observable { + return null!; + } +} + + +//// [index.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 __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +import { Observable } from './observable'; +function whatever(a, b, c) { } +class Test { + foo(arg1, arg2) { + return null; + } +} +__decorate([ + __param(0, whatever), + __param(1, whatever), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, Number]), + __metadata("design:returntype", Observable) +], Test.prototype, "foo", null); diff --git a/tests/baselines/reference/decoratorMetadataElidedImport(module=esnext).symbols b/tests/baselines/reference/decoratorMetadataElidedImport(module=esnext).symbols new file mode 100644 index 00000000000..ce9fec74d0d --- /dev/null +++ b/tests/baselines/reference/decoratorMetadataElidedImport(module=esnext).symbols @@ -0,0 +1,38 @@ +//// [tests/cases/compiler/decoratorMetadataElidedImport.ts] //// + +=== observable.d.ts === +export declare class Observable {} +>Observable : Symbol(Observable, Decl(observable.d.ts, 0, 0)) +>T : Symbol(T, Decl(observable.d.ts, 0, 32)) + +=== index.ts === +import { Observable } from './observable'; +>Observable : Symbol(Observable, Decl(index.ts, 0, 8)) + +function whatever(a: any, b: any, c: any) {} +>whatever : Symbol(whatever, Decl(index.ts, 0, 42)) +>a : Symbol(a, Decl(index.ts, 2, 18)) +>b : Symbol(b, Decl(index.ts, 2, 25)) +>c : Symbol(c, Decl(index.ts, 2, 33)) + +class Test { +>Test : Symbol(Test, Decl(index.ts, 2, 44)) + + foo( +>foo : Symbol(Test.foo, Decl(index.ts, 4, 12)) + + @whatever arg1: string, +>whatever : Symbol(whatever, Decl(index.ts, 0, 42)) +>arg1 : Symbol(arg1, Decl(index.ts, 5, 8)) + + @whatever arg2: number +>whatever : Symbol(whatever, Decl(index.ts, 0, 42)) +>arg2 : Symbol(arg2, Decl(index.ts, 6, 31)) + + ): Observable { +>Observable : Symbol(Observable, Decl(index.ts, 0, 8)) + + return null!; + } +} + diff --git a/tests/baselines/reference/decoratorMetadataElidedImport(module=esnext).types b/tests/baselines/reference/decoratorMetadataElidedImport(module=esnext).types new file mode 100644 index 00000000000..eb3551a859c --- /dev/null +++ b/tests/baselines/reference/decoratorMetadataElidedImport(module=esnext).types @@ -0,0 +1,36 @@ +//// [tests/cases/compiler/decoratorMetadataElidedImport.ts] //// + +=== observable.d.ts === +export declare class Observable {} +>Observable : Observable + +=== index.ts === +import { Observable } from './observable'; +>Observable : typeof Observable + +function whatever(a: any, b: any, c: any) {} +>whatever : (a: any, b: any, c: any) => void +>a : any +>b : any +>c : any + +class Test { +>Test : Test + + foo( +>foo : (arg1: string, arg2: number) => Observable + + @whatever arg1: string, +>whatever : (a: any, b: any, c: any) => void +>arg1 : string + + @whatever arg2: number +>whatever : (a: any, b: any, c: any) => void +>arg2 : number + + ): Observable { + return null!; +>null! : never + } +} + diff --git a/tests/cases/compiler/decoratorMetadataElidedImport.ts b/tests/cases/compiler/decoratorMetadataElidedImport.ts new file mode 100644 index 00000000000..647db135956 --- /dev/null +++ b/tests/cases/compiler/decoratorMetadataElidedImport.ts @@ -0,0 +1,22 @@ +// @target: es2020 +// @module: commonjs, esnext +// @strict: true +// @experimentalDecorators: true +// @emitDecoratorMetadata: true + +// @filename: observable.d.ts +export declare class Observable {} + +// @filename: index.ts +import { Observable } from './observable'; + +function whatever(a: any, b: any, c: any) {} + +class Test { + foo( + @whatever arg1: string, + @whatever arg2: number + ): Observable { + return null!; + } +}