From 96927379f0bac4e850f21b60678488cde8a88063 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Wed, 19 Apr 2017 14:53:32 -0700 Subject: [PATCH] Emit generated name for unnamed default exported class with decorated members --- src/compiler/transformers/ts.ts | 3 ++- .../decoratorOnClassAccessor1.es6.js | 20 ++++++++++++++++ .../decoratorOnClassAccessor1.es6.symbols | 17 ++++++++++++++ .../decoratorOnClassAccessor1.es6.types | 18 +++++++++++++++ .../reference/decoratorOnClassMethod1.es6.js | 20 ++++++++++++++++ .../decoratorOnClassMethod1.es6.symbols | 17 ++++++++++++++ .../decoratorOnClassMethod1.es6.types | 17 ++++++++++++++ .../decoratorOnClassMethodParameter1.es6.js | 23 +++++++++++++++++++ ...coratorOnClassMethodParameter1.es6.symbols | 14 +++++++++++ ...decoratorOnClassMethodParameter1.es6.types | 14 +++++++++++ .../decoratorOnClassProperty1.es6.js | 19 +++++++++++++++ .../decoratorOnClassProperty1.es6.symbols | 11 +++++++++ .../decoratorOnClassProperty1.es6.types | 11 +++++++++ .../accessor/decoratorOnClassAccessor1.es6.ts | 8 +++++++ .../method/decoratorOnClassMethod1.es6.ts | 8 +++++++ .../decoratorOnClassMethodParameter1.es6.ts | 8 +++++++ .../property/decoratorOnClassProperty1.es6.ts | 8 +++++++ 17 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/decoratorOnClassAccessor1.es6.js create mode 100644 tests/baselines/reference/decoratorOnClassAccessor1.es6.symbols create mode 100644 tests/baselines/reference/decoratorOnClassAccessor1.es6.types create mode 100644 tests/baselines/reference/decoratorOnClassMethod1.es6.js create mode 100644 tests/baselines/reference/decoratorOnClassMethod1.es6.symbols create mode 100644 tests/baselines/reference/decoratorOnClassMethod1.es6.types create mode 100644 tests/baselines/reference/decoratorOnClassMethodParameter1.es6.js create mode 100644 tests/baselines/reference/decoratorOnClassMethodParameter1.es6.symbols create mode 100644 tests/baselines/reference/decoratorOnClassMethodParameter1.es6.types create mode 100644 tests/baselines/reference/decoratorOnClassProperty1.es6.js create mode 100644 tests/baselines/reference/decoratorOnClassProperty1.es6.symbols create mode 100644 tests/baselines/reference/decoratorOnClassProperty1.es6.types create mode 100644 tests/cases/conformance/es6/decorators/class/accessor/decoratorOnClassAccessor1.es6.ts create mode 100644 tests/cases/conformance/es6/decorators/class/method/decoratorOnClassMethod1.es6.ts create mode 100644 tests/cases/conformance/es6/decorators/class/method/parameter/decoratorOnClassMethodParameter1.es6.ts create mode 100644 tests/cases/conformance/es6/decorators/class/property/decoratorOnClassProperty1.es6.ts diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index 18387d8261151..780e519bb533d 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -521,9 +521,10 @@ namespace ts { // emit name if // - node has a name // - node has static initializers + // - node has a member that is decorated // let name = node.name; - if (!name && staticProperties.length > 0) { + if (!name && (staticProperties.length > 0 || childIsDecorated(node))) { name = getGeneratedNameForNode(node); } diff --git a/tests/baselines/reference/decoratorOnClassAccessor1.es6.js b/tests/baselines/reference/decoratorOnClassAccessor1.es6.js new file mode 100644 index 0000000000000..484005b7a3680 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassAccessor1.es6.js @@ -0,0 +1,20 @@ +//// [decoratorOnClassAccessor1.es6.ts] +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; + +export default class { + @dec get accessor() { return 1; } +} + +//// [decoratorOnClassAccessor1.es6.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; +}; +export default class default_1 { + get accessor() { return 1; } +} +__decorate([ + dec +], default_1.prototype, "accessor", null); diff --git a/tests/baselines/reference/decoratorOnClassAccessor1.es6.symbols b/tests/baselines/reference/decoratorOnClassAccessor1.es6.symbols new file mode 100644 index 0000000000000..82fe1128adab6 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassAccessor1.es6.symbols @@ -0,0 +1,17 @@ +=== tests/cases/conformance/es6/decorators/class/accessor/decoratorOnClassAccessor1.es6.ts === +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; +>dec : Symbol(dec, Decl(decoratorOnClassAccessor1.es6.ts, 0, 0)) +>T : Symbol(T, Decl(decoratorOnClassAccessor1.es6.ts, 0, 21)) +>target : Symbol(target, Decl(decoratorOnClassAccessor1.es6.ts, 0, 24)) +>propertyKey : Symbol(propertyKey, Decl(decoratorOnClassAccessor1.es6.ts, 0, 36)) +>descriptor : Symbol(descriptor, Decl(decoratorOnClassAccessor1.es6.ts, 0, 57)) +>TypedPropertyDescriptor : Symbol(TypedPropertyDescriptor, Decl(lib.es5.d.ts, --, --)) +>T : Symbol(T, Decl(decoratorOnClassAccessor1.es6.ts, 0, 21)) +>TypedPropertyDescriptor : Symbol(TypedPropertyDescriptor, Decl(lib.es5.d.ts, --, --)) +>T : Symbol(T, Decl(decoratorOnClassAccessor1.es6.ts, 0, 21)) + +export default class { + @dec get accessor() { return 1; } +>dec : Symbol(dec, Decl(decoratorOnClassAccessor1.es6.ts, 0, 0)) +>accessor : Symbol(default.accessor, Decl(decoratorOnClassAccessor1.es6.ts, 2, 22)) +} diff --git a/tests/baselines/reference/decoratorOnClassAccessor1.es6.types b/tests/baselines/reference/decoratorOnClassAccessor1.es6.types new file mode 100644 index 0000000000000..6a044d7a5ec56 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassAccessor1.es6.types @@ -0,0 +1,18 @@ +=== tests/cases/conformance/es6/decorators/class/accessor/decoratorOnClassAccessor1.es6.ts === +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor +>T : T +>target : any +>propertyKey : string +>descriptor : TypedPropertyDescriptor +>TypedPropertyDescriptor : TypedPropertyDescriptor +>T : T +>TypedPropertyDescriptor : TypedPropertyDescriptor +>T : T + +export default class { + @dec get accessor() { return 1; } +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor +>accessor : number +>1 : 1 +} diff --git a/tests/baselines/reference/decoratorOnClassMethod1.es6.js b/tests/baselines/reference/decoratorOnClassMethod1.es6.js new file mode 100644 index 0000000000000..6c518ae805ee0 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod1.es6.js @@ -0,0 +1,20 @@ +//// [decoratorOnClassMethod1.es6.ts] +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; + +export default class { + @dec method() {} +} + +//// [decoratorOnClassMethod1.es6.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; +}; +export default class default_1 { + method() { } +} +__decorate([ + dec +], default_1.prototype, "method", null); diff --git a/tests/baselines/reference/decoratorOnClassMethod1.es6.symbols b/tests/baselines/reference/decoratorOnClassMethod1.es6.symbols new file mode 100644 index 0000000000000..1e7707c5329e2 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod1.es6.symbols @@ -0,0 +1,17 @@ +=== tests/cases/conformance/es6/decorators/class/method/decoratorOnClassMethod1.es6.ts === +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; +>dec : Symbol(dec, Decl(decoratorOnClassMethod1.es6.ts, 0, 0)) +>T : Symbol(T, Decl(decoratorOnClassMethod1.es6.ts, 0, 21)) +>target : Symbol(target, Decl(decoratorOnClassMethod1.es6.ts, 0, 24)) +>propertyKey : Symbol(propertyKey, Decl(decoratorOnClassMethod1.es6.ts, 0, 36)) +>descriptor : Symbol(descriptor, Decl(decoratorOnClassMethod1.es6.ts, 0, 57)) +>TypedPropertyDescriptor : Symbol(TypedPropertyDescriptor, Decl(lib.es5.d.ts, --, --)) +>T : Symbol(T, Decl(decoratorOnClassMethod1.es6.ts, 0, 21)) +>TypedPropertyDescriptor : Symbol(TypedPropertyDescriptor, Decl(lib.es5.d.ts, --, --)) +>T : Symbol(T, Decl(decoratorOnClassMethod1.es6.ts, 0, 21)) + +export default class { + @dec method() {} +>dec : Symbol(dec, Decl(decoratorOnClassMethod1.es6.ts, 0, 0)) +>method : Symbol(default.method, Decl(decoratorOnClassMethod1.es6.ts, 2, 22)) +} diff --git a/tests/baselines/reference/decoratorOnClassMethod1.es6.types b/tests/baselines/reference/decoratorOnClassMethod1.es6.types new file mode 100644 index 0000000000000..83a7bfbb9ab20 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethod1.es6.types @@ -0,0 +1,17 @@ +=== tests/cases/conformance/es6/decorators/class/method/decoratorOnClassMethod1.es6.ts === +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor +>T : T +>target : any +>propertyKey : string +>descriptor : TypedPropertyDescriptor +>TypedPropertyDescriptor : TypedPropertyDescriptor +>T : T +>TypedPropertyDescriptor : TypedPropertyDescriptor +>T : T + +export default class { + @dec method() {} +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor +>method : () => void +} diff --git a/tests/baselines/reference/decoratorOnClassMethodParameter1.es6.js b/tests/baselines/reference/decoratorOnClassMethodParameter1.es6.js new file mode 100644 index 0000000000000..b58c69150e5e8 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethodParameter1.es6.js @@ -0,0 +1,23 @@ +//// [decoratorOnClassMethodParameter1.es6.ts] +declare function dec(target: Object, propertyKey: string | symbol, parameterIndex: number): void; + +export default class { + method(@dec p: number) {} +} + +//// [decoratorOnClassMethodParameter1.es6.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 __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +export default class default_1 { + method(p) { } +} +__decorate([ + __param(0, dec) +], default_1.prototype, "method", null); diff --git a/tests/baselines/reference/decoratorOnClassMethodParameter1.es6.symbols b/tests/baselines/reference/decoratorOnClassMethodParameter1.es6.symbols new file mode 100644 index 0000000000000..aee56f5a4f84f --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethodParameter1.es6.symbols @@ -0,0 +1,14 @@ +=== tests/cases/conformance/es6/decorators/class/method/parameter/decoratorOnClassMethodParameter1.es6.ts === +declare function dec(target: Object, propertyKey: string | symbol, parameterIndex: number): void; +>dec : Symbol(dec, Decl(decoratorOnClassMethodParameter1.es6.ts, 0, 0)) +>target : Symbol(target, Decl(decoratorOnClassMethodParameter1.es6.ts, 0, 21)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --)) +>propertyKey : Symbol(propertyKey, Decl(decoratorOnClassMethodParameter1.es6.ts, 0, 36)) +>parameterIndex : Symbol(parameterIndex, Decl(decoratorOnClassMethodParameter1.es6.ts, 0, 66)) + +export default class { + method(@dec p: number) {} +>method : Symbol(default.method, Decl(decoratorOnClassMethodParameter1.es6.ts, 2, 22)) +>dec : Symbol(dec, Decl(decoratorOnClassMethodParameter1.es6.ts, 0, 0)) +>p : Symbol(p, Decl(decoratorOnClassMethodParameter1.es6.ts, 3, 11)) +} diff --git a/tests/baselines/reference/decoratorOnClassMethodParameter1.es6.types b/tests/baselines/reference/decoratorOnClassMethodParameter1.es6.types new file mode 100644 index 0000000000000..0b66166bfafc7 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethodParameter1.es6.types @@ -0,0 +1,14 @@ +=== tests/cases/conformance/es6/decorators/class/method/parameter/decoratorOnClassMethodParameter1.es6.ts === +declare function dec(target: Object, propertyKey: string | symbol, parameterIndex: number): void; +>dec : (target: Object, propertyKey: string | symbol, parameterIndex: number) => void +>target : Object +>Object : Object +>propertyKey : string | symbol +>parameterIndex : number + +export default class { + method(@dec p: number) {} +>method : (p: number) => void +>dec : (target: Object, propertyKey: string | symbol, parameterIndex: number) => void +>p : number +} diff --git a/tests/baselines/reference/decoratorOnClassProperty1.es6.js b/tests/baselines/reference/decoratorOnClassProperty1.es6.js new file mode 100644 index 0000000000000..81b72acf47811 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassProperty1.es6.js @@ -0,0 +1,19 @@ +//// [decoratorOnClassProperty1.es6.ts] +declare function dec(target: any, propertyKey: string): void; + +export default class { + @dec prop; +} + +//// [decoratorOnClassProperty1.es6.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; +}; +export default class default_1 { +} +__decorate([ + dec +], default_1.prototype, "prop", void 0); diff --git a/tests/baselines/reference/decoratorOnClassProperty1.es6.symbols b/tests/baselines/reference/decoratorOnClassProperty1.es6.symbols new file mode 100644 index 0000000000000..59db2c94cd069 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassProperty1.es6.symbols @@ -0,0 +1,11 @@ +=== tests/cases/conformance/es6/decorators/class/property/decoratorOnClassProperty1.es6.ts === +declare function dec(target: any, propertyKey: string): void; +>dec : Symbol(dec, Decl(decoratorOnClassProperty1.es6.ts, 0, 0)) +>target : Symbol(target, Decl(decoratorOnClassProperty1.es6.ts, 0, 21)) +>propertyKey : Symbol(propertyKey, Decl(decoratorOnClassProperty1.es6.ts, 0, 33)) + +export default class { + @dec prop; +>dec : Symbol(dec, Decl(decoratorOnClassProperty1.es6.ts, 0, 0)) +>prop : Symbol(default.prop, Decl(decoratorOnClassProperty1.es6.ts, 2, 22)) +} diff --git a/tests/baselines/reference/decoratorOnClassProperty1.es6.types b/tests/baselines/reference/decoratorOnClassProperty1.es6.types new file mode 100644 index 0000000000000..96423d71d0112 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassProperty1.es6.types @@ -0,0 +1,11 @@ +=== tests/cases/conformance/es6/decorators/class/property/decoratorOnClassProperty1.es6.ts === +declare function dec(target: any, propertyKey: string): void; +>dec : (target: any, propertyKey: string) => void +>target : any +>propertyKey : string + +export default class { + @dec prop; +>dec : (target: any, propertyKey: string) => void +>prop : any +} diff --git a/tests/cases/conformance/es6/decorators/class/accessor/decoratorOnClassAccessor1.es6.ts b/tests/cases/conformance/es6/decorators/class/accessor/decoratorOnClassAccessor1.es6.ts new file mode 100644 index 0000000000000..774a28665feab --- /dev/null +++ b/tests/cases/conformance/es6/decorators/class/accessor/decoratorOnClassAccessor1.es6.ts @@ -0,0 +1,8 @@ +// @target: ES2015 +// @module: ES2015 +// @experimentaldecorators: true +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; + +export default class { + @dec get accessor() { return 1; } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/decorators/class/method/decoratorOnClassMethod1.es6.ts b/tests/cases/conformance/es6/decorators/class/method/decoratorOnClassMethod1.es6.ts new file mode 100644 index 0000000000000..2e63e27086c75 --- /dev/null +++ b/tests/cases/conformance/es6/decorators/class/method/decoratorOnClassMethod1.es6.ts @@ -0,0 +1,8 @@ +// @target: ES2015 +// @module: ES2015 +// @experimentaldecorators: true +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; + +export default class { + @dec method() {} +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/decorators/class/method/parameter/decoratorOnClassMethodParameter1.es6.ts b/tests/cases/conformance/es6/decorators/class/method/parameter/decoratorOnClassMethodParameter1.es6.ts new file mode 100644 index 0000000000000..344f49c89f9c0 --- /dev/null +++ b/tests/cases/conformance/es6/decorators/class/method/parameter/decoratorOnClassMethodParameter1.es6.ts @@ -0,0 +1,8 @@ +// @target: ES2015 +// @module: ES2015 +// @experimentaldecorators: true +declare function dec(target: Object, propertyKey: string | symbol, parameterIndex: number): void; + +export default class { + method(@dec p: number) {} +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/decorators/class/property/decoratorOnClassProperty1.es6.ts b/tests/cases/conformance/es6/decorators/class/property/decoratorOnClassProperty1.es6.ts new file mode 100644 index 0000000000000..4f54960d2bcd8 --- /dev/null +++ b/tests/cases/conformance/es6/decorators/class/property/decoratorOnClassProperty1.es6.ts @@ -0,0 +1,8 @@ +// @target: ES2015 +// @module: ES2015 +// @experimentaldecorators: true +declare function dec(target: any, propertyKey: string): void; + +export default class { + @dec prop; +} \ No newline at end of file