diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 46362bd782768..e3f092257a3b4 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -6133,10 +6133,10 @@ const _super = (function (geti, seti) { if (parameters[i].dotDotDotToken) { let parameterType = parameters[i].type; - if (parameterType.kind === SyntaxKind.ArrayType) { + if (parameterType && parameterType.kind === SyntaxKind.ArrayType) { parameterType = (parameterType).elementType; } - else if (parameterType.kind === SyntaxKind.TypeReference && (parameterType).typeArguments && (parameterType).typeArguments.length === 1) { + else if (parameterType && parameterType.kind === SyntaxKind.TypeReference && (parameterType).typeArguments && (parameterType).typeArguments.length === 1) { parameterType = (parameterType).typeArguments[0]; } else { diff --git a/tests/baselines/reference/emitDecoratorMetadata_restArgs.js b/tests/baselines/reference/emitDecoratorMetadata_restArgs.js new file mode 100644 index 0000000000000..35350c54e0a21 --- /dev/null +++ b/tests/baselines/reference/emitDecoratorMetadata_restArgs.js @@ -0,0 +1,80 @@ +//// [emitDecoratorMetadata_restArgs.ts] + +declare const MyClassDecorator: ClassDecorator; +declare const MyMethodDecorator: MethodDecorator; + +@MyClassDecorator +class A { + constructor(...args) {} + @MyMethodDecorator + method(...args) {} +} + +@MyClassDecorator +class B { + constructor(...args: number[]) {} + @MyMethodDecorator + method(...args: string[]) {} +} + + +//// [emitDecoratorMetadata_restArgs.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 A = (function () { + function A() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; + } + } + A.prototype.method = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; + } + }; + __decorate([ + MyMethodDecorator, + __metadata('design:type', Function), + __metadata('design:paramtypes', [Object]), + __metadata('design:returntype', void 0) + ], A.prototype, "method", null); + A = __decorate([ + MyClassDecorator, + __metadata('design:paramtypes', [Object]) + ], A); + return A; +}()); +var B = (function () { + function B() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; + } + } + B.prototype.method = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i - 0] = arguments[_i]; + } + }; + __decorate([ + MyMethodDecorator, + __metadata('design:type', Function), + __metadata('design:paramtypes', [String]), + __metadata('design:returntype', void 0) + ], B.prototype, "method", null); + B = __decorate([ + MyClassDecorator, + __metadata('design:paramtypes', [Number]) + ], B); + return B; +}()); diff --git a/tests/baselines/reference/emitDecoratorMetadata_restArgs.symbols b/tests/baselines/reference/emitDecoratorMetadata_restArgs.symbols new file mode 100644 index 0000000000000..b665b778f8615 --- /dev/null +++ b/tests/baselines/reference/emitDecoratorMetadata_restArgs.symbols @@ -0,0 +1,44 @@ +=== tests/cases/compiler/emitDecoratorMetadata_restArgs.ts === + +declare const MyClassDecorator: ClassDecorator; +>MyClassDecorator : Symbol(MyClassDecorator, Decl(emitDecoratorMetadata_restArgs.ts, 1, 13)) +>ClassDecorator : Symbol(ClassDecorator, Decl(lib.d.ts, --, --)) + +declare const MyMethodDecorator: MethodDecorator; +>MyMethodDecorator : Symbol(MyMethodDecorator, Decl(emitDecoratorMetadata_restArgs.ts, 2, 13)) +>MethodDecorator : Symbol(MethodDecorator, Decl(lib.d.ts, --, --)) + +@MyClassDecorator +>MyClassDecorator : Symbol(MyClassDecorator, Decl(emitDecoratorMetadata_restArgs.ts, 1, 13)) + +class A { +>A : Symbol(A, Decl(emitDecoratorMetadata_restArgs.ts, 2, 49)) + + constructor(...args) {} +>args : Symbol(args, Decl(emitDecoratorMetadata_restArgs.ts, 6, 16)) + + @MyMethodDecorator +>MyMethodDecorator : Symbol(MyMethodDecorator, Decl(emitDecoratorMetadata_restArgs.ts, 2, 13)) + + method(...args) {} +>method : Symbol(A.method, Decl(emitDecoratorMetadata_restArgs.ts, 6, 27)) +>args : Symbol(args, Decl(emitDecoratorMetadata_restArgs.ts, 8, 11)) +} + +@MyClassDecorator +>MyClassDecorator : Symbol(MyClassDecorator, Decl(emitDecoratorMetadata_restArgs.ts, 1, 13)) + +class B { +>B : Symbol(B, Decl(emitDecoratorMetadata_restArgs.ts, 9, 1)) + + constructor(...args: number[]) {} +>args : Symbol(args, Decl(emitDecoratorMetadata_restArgs.ts, 13, 16)) + + @MyMethodDecorator +>MyMethodDecorator : Symbol(MyMethodDecorator, Decl(emitDecoratorMetadata_restArgs.ts, 2, 13)) + + method(...args: string[]) {} +>method : Symbol(B.method, Decl(emitDecoratorMetadata_restArgs.ts, 13, 37)) +>args : Symbol(args, Decl(emitDecoratorMetadata_restArgs.ts, 15, 11)) +} + diff --git a/tests/baselines/reference/emitDecoratorMetadata_restArgs.types b/tests/baselines/reference/emitDecoratorMetadata_restArgs.types new file mode 100644 index 0000000000000..4820d3a7d8dc2 --- /dev/null +++ b/tests/baselines/reference/emitDecoratorMetadata_restArgs.types @@ -0,0 +1,44 @@ +=== tests/cases/compiler/emitDecoratorMetadata_restArgs.ts === + +declare const MyClassDecorator: ClassDecorator; +>MyClassDecorator : (target: TFunction) => TFunction | void +>ClassDecorator : (target: TFunction) => TFunction | void + +declare const MyMethodDecorator: MethodDecorator; +>MyMethodDecorator : (target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor | void +>MethodDecorator : (target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor | void + +@MyClassDecorator +>MyClassDecorator : (target: TFunction) => TFunction | void + +class A { +>A : A + + constructor(...args) {} +>args : any[] + + @MyMethodDecorator +>MyMethodDecorator : (target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor | void + + method(...args) {} +>method : (...args: any[]) => void +>args : any[] +} + +@MyClassDecorator +>MyClassDecorator : (target: TFunction) => TFunction | void + +class B { +>B : B + + constructor(...args: number[]) {} +>args : number[] + + @MyMethodDecorator +>MyMethodDecorator : (target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor | void + + method(...args: string[]) {} +>method : (...args: string[]) => void +>args : string[] +} + diff --git a/tests/cases/compiler/emitDecoratorMetadata_restArgs.ts b/tests/cases/compiler/emitDecoratorMetadata_restArgs.ts new file mode 100644 index 0000000000000..6b0741e22058a --- /dev/null +++ b/tests/cases/compiler/emitDecoratorMetadata_restArgs.ts @@ -0,0 +1,20 @@ +// @experimentaldecorators: true +// @emitdecoratormetadata: true +// @target: ES5 + +declare const MyClassDecorator: ClassDecorator; +declare const MyMethodDecorator: MethodDecorator; + +@MyClassDecorator +class A { + constructor(...args) {} + @MyMethodDecorator + method(...args) {} +} + +@MyClassDecorator +class B { + constructor(...args: number[]) {} + @MyMethodDecorator + method(...args: string[]) {} +}