From 1435d5bf41be84be6baf3b9efce909b82545b274 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:27:51 +0000 Subject: [PATCH 1/3] Initial plan From a1bb197f5c3997b4dc72ce54676104340b6099e6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:39:00 +0000 Subject: [PATCH 2/3] Add legacy decorator computed-name regression test Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com> --- ...iasComputedNames(target=es2020).errors.txt | 45 +++++++++++ ...rClassAliasComputedNames(target=es2020).js | 68 ++++++++++++++++ ...sAliasComputedNames(target=es2020).symbols | 73 ++++++++++++++++++ ...assAliasComputedNames(target=es2020).types | 77 +++++++++++++++++++ ...iasComputedNames(target=es2022).errors.txt | 45 +++++++++++ ...rClassAliasComputedNames(target=es2022).js | 67 ++++++++++++++++ ...sAliasComputedNames(target=es2022).symbols | 73 ++++++++++++++++++ ...assAliasComputedNames(target=es2022).types | 77 +++++++++++++++++++ .../legacyDecoratorClassAliasComputedNames.ts | 28 +++++++ 9 files changed, 553 insertions(+) create mode 100644 tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).errors.txt create mode 100644 tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).js create mode 100644 tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).symbols create mode 100644 tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).types create mode 100644 tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).errors.txt create mode 100644 tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).js create mode 100644 tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).symbols create mode 100644 tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).types create mode 100644 tsc/testdata/tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).errors.txt b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).errors.txt new file mode 100644 index 0000000000000..8bf19f37132a4 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).errors.txt @@ -0,0 +1,45 @@ +legacyDecoratorClassAliasComputedNames.ts(5,6): error TS2449: Class 'C' used before its declaration. +legacyDecoratorClassAliasComputedNames.ts(6,10): error TS2449: Class 'C' used before its declaration. +legacyDecoratorClassAliasComputedNames.ts(7,10): error TS2449: Class 'C' used before its declaration. +legacyDecoratorClassAliasComputedNames.ts(12,13): error TS2449: Class 'D' used before its declaration. + + +==== legacyDecoratorClassAliasComputedNames.ts (4 errors) ==== + declare function dec(value: any): any; + + @dec + class C { + [C.name]() {} + ~ +!!! error TS2449: Class 'C' used before its declaration. +!!! related TS2728 legacyDecoratorClassAliasComputedNames.ts:4:7: 'C' is declared here. + get [C.name]() { return 1; } + ~ +!!! error TS2449: Class 'C' used before its declaration. +!!! related TS2728 legacyDecoratorClassAliasComputedNames.ts:4:7: 'C' is declared here. + set [C.name](value: number) {} + ~ +!!! error TS2449: Class 'C' used before its declaration. +!!! related TS2728 legacyDecoratorClassAliasComputedNames.ts:4:7: 'C' is declared here. + } + + @dec + class D { + static [D.name] = 1; + ~ +!!! error TS2449: Class 'D' used before its declaration. +!!! related TS2728 legacyDecoratorClassAliasComputedNames.ts:11:7: 'D' is declared here. + static getSelf() { + return D; + } + } + + @dec + class Outer { + method() { + return class { + [Outer.name]() {} + }; + } + } + \ No newline at end of file diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).js b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).js new file mode 100644 index 0000000000000..0f742b474a2c9 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).js @@ -0,0 +1,68 @@ +//// [tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts] //// + +//// [legacyDecoratorClassAliasComputedNames.ts] +declare function dec(value: any): any; + +@dec +class C { + [C.name]() {} + get [C.name]() { return 1; } + set [C.name](value: number) {} +} + +@dec +class D { + static [D.name] = 1; + static getSelf() { + return D; + } +} + +@dec +class Outer { + method() { + return class { + [Outer.name]() {} + }; + } +} + + +//// [legacyDecoratorClassAliasComputedNames.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 _a; +var C_1, D_1, Outer_1; +let C = C_1 = class C { + [C_1.name]() { } + get [C_1.name]() { return 1; } + set [C_1.name](value) { } +}; +C = C_1 = __decorate([ + dec +], C); +let D = D_1 = class D { + static getSelf() { + return D_1; + } +}; +_a = D_1.name; +D[_a] = 1; +D = D_1 = __decorate([ + dec +], D); +let Outer = Outer_1 = class Outer { + method() { + return class { + [Outer_1.name]() { } + }; + } +}; +Outer = Outer_1 = __decorate([ + dec +], Outer); diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).symbols b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).symbols new file mode 100644 index 0000000000000..3bfcec82adeee --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).symbols @@ -0,0 +1,73 @@ +//// [tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts] //// + +=== legacyDecoratorClassAliasComputedNames.ts === +declare function dec(value: any): any; +>dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) +>value : Symbol(value, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 21)) + +@dec +>dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) + +class C { +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) + + [C.name]() {} +>[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 3, 9)) +>C.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) + + get [C.name]() { return 1; } +>[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 4, 17)) +>C.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) + + set [C.name](value: number) {} +>[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 5, 32)) +>C.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) +>value : Symbol(value, Decl(legacyDecoratorClassAliasComputedNames.ts, 6, 17)) +} + +@dec +>dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) + +class D { +>D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 1)) + + static [D.name] = 1; +>[D.name] : Symbol(D[D.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 10, 9)) +>D.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) +>D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 1)) +>name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) + + static getSelf() { +>getSelf : Symbol(D.getSelf, Decl(legacyDecoratorClassAliasComputedNames.ts, 11, 24)) + + return D; +>D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 1)) + } +} + +@dec +>dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) + +class Outer { +>Outer : Symbol(Outer, Decl(legacyDecoratorClassAliasComputedNames.ts, 15, 1)) + + method() { +>method : Symbol(Outer.method, Decl(legacyDecoratorClassAliasComputedNames.ts, 18, 13)) + + return class { + [Outer.name]() {} +>[Outer.name] : Symbol((Anonymous class)[Outer.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 20, 22)) +>Outer.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) +>Outer : Symbol(Outer, Decl(legacyDecoratorClassAliasComputedNames.ts, 15, 1)) +>name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) + + }; + } +} + diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).types b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).types new file mode 100644 index 0000000000000..748933740e46c --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).types @@ -0,0 +1,77 @@ +//// [tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts] //// + +=== legacyDecoratorClassAliasComputedNames.ts === +declare function dec(value: any): any; +>dec : (value: any) => any +>value : any + +@dec +>dec : (value: any) => any + +class C { +>C : C + + [C.name]() {} +>[C.name] : () => void +>C.name : string +>C : typeof C +>name : string + + get [C.name]() { return 1; } +>[C.name] : number +>C.name : string +>C : typeof C +>name : string +>1 : 1 + + set [C.name](value: number) {} +>[C.name] : number +>C.name : string +>C : typeof C +>name : string +>value : number +} + +@dec +>dec : (value: any) => any + +class D { +>D : D + + static [D.name] = 1; +>[D.name] : number +>D.name : string +>D : typeof D +>name : string +>1 : 1 + + static getSelf() { +>getSelf : () => typeof D + + return D; +>D : typeof D + } +} + +@dec +>dec : (value: any) => any + +class Outer { +>Outer : Outer + + method() { +>method : () => typeof (Anonymous class) + + return class { +>class { [Outer.name]() {} } : typeof (Anonymous class) + + [Outer.name]() {} +>[Outer.name] : () => void +>Outer.name : string +>Outer : typeof Outer +>name : string + + }; + } +} + diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).errors.txt b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).errors.txt new file mode 100644 index 0000000000000..8bf19f37132a4 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).errors.txt @@ -0,0 +1,45 @@ +legacyDecoratorClassAliasComputedNames.ts(5,6): error TS2449: Class 'C' used before its declaration. +legacyDecoratorClassAliasComputedNames.ts(6,10): error TS2449: Class 'C' used before its declaration. +legacyDecoratorClassAliasComputedNames.ts(7,10): error TS2449: Class 'C' used before its declaration. +legacyDecoratorClassAliasComputedNames.ts(12,13): error TS2449: Class 'D' used before its declaration. + + +==== legacyDecoratorClassAliasComputedNames.ts (4 errors) ==== + declare function dec(value: any): any; + + @dec + class C { + [C.name]() {} + ~ +!!! error TS2449: Class 'C' used before its declaration. +!!! related TS2728 legacyDecoratorClassAliasComputedNames.ts:4:7: 'C' is declared here. + get [C.name]() { return 1; } + ~ +!!! error TS2449: Class 'C' used before its declaration. +!!! related TS2728 legacyDecoratorClassAliasComputedNames.ts:4:7: 'C' is declared here. + set [C.name](value: number) {} + ~ +!!! error TS2449: Class 'C' used before its declaration. +!!! related TS2728 legacyDecoratorClassAliasComputedNames.ts:4:7: 'C' is declared here. + } + + @dec + class D { + static [D.name] = 1; + ~ +!!! error TS2449: Class 'D' used before its declaration. +!!! related TS2728 legacyDecoratorClassAliasComputedNames.ts:11:7: 'D' is declared here. + static getSelf() { + return D; + } + } + + @dec + class Outer { + method() { + return class { + [Outer.name]() {} + }; + } + } + \ No newline at end of file diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).js b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).js new file mode 100644 index 0000000000000..ba0b17d7edc36 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).js @@ -0,0 +1,67 @@ +//// [tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts] //// + +//// [legacyDecoratorClassAliasComputedNames.ts] +declare function dec(value: any): any; + +@dec +class C { + [C.name]() {} + get [C.name]() { return 1; } + set [C.name](value: number) {} +} + +@dec +class D { + static [D.name] = 1; + static getSelf() { + return D; + } +} + +@dec +class Outer { + method() { + return class { + [Outer.name]() {} + }; + } +} + + +//// [legacyDecoratorClassAliasComputedNames.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 C_1, D_1, Outer_1; +let C = C_1 = class C { + [C_1.name]() { } + get [C_1.name]() { return 1; } + set [C_1.name](value) { } +}; +C = C_1 = __decorate([ + dec +], C); +let D = class D { + static { D_1 = this; } + static [D_1.name] = 1; + static getSelf() { + return D_1; + } +}; +D = D_1 = __decorate([ + dec +], D); +let Outer = Outer_1 = class Outer { + method() { + return class { + [Outer_1.name]() { } + }; + } +}; +Outer = Outer_1 = __decorate([ + dec +], Outer); diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).symbols b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).symbols new file mode 100644 index 0000000000000..3bfcec82adeee --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).symbols @@ -0,0 +1,73 @@ +//// [tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts] //// + +=== legacyDecoratorClassAliasComputedNames.ts === +declare function dec(value: any): any; +>dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) +>value : Symbol(value, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 21)) + +@dec +>dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) + +class C { +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) + + [C.name]() {} +>[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 3, 9)) +>C.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) + + get [C.name]() { return 1; } +>[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 4, 17)) +>C.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) + + set [C.name](value: number) {} +>[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 5, 32)) +>C.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) +>value : Symbol(value, Decl(legacyDecoratorClassAliasComputedNames.ts, 6, 17)) +} + +@dec +>dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) + +class D { +>D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 1)) + + static [D.name] = 1; +>[D.name] : Symbol(D[D.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 10, 9)) +>D.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) +>D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 1)) +>name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) + + static getSelf() { +>getSelf : Symbol(D.getSelf, Decl(legacyDecoratorClassAliasComputedNames.ts, 11, 24)) + + return D; +>D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 1)) + } +} + +@dec +>dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) + +class Outer { +>Outer : Symbol(Outer, Decl(legacyDecoratorClassAliasComputedNames.ts, 15, 1)) + + method() { +>method : Symbol(Outer.method, Decl(legacyDecoratorClassAliasComputedNames.ts, 18, 13)) + + return class { + [Outer.name]() {} +>[Outer.name] : Symbol((Anonymous class)[Outer.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 20, 22)) +>Outer.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) +>Outer : Symbol(Outer, Decl(legacyDecoratorClassAliasComputedNames.ts, 15, 1)) +>name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) + + }; + } +} + diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).types b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).types new file mode 100644 index 0000000000000..748933740e46c --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).types @@ -0,0 +1,77 @@ +//// [tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts] //// + +=== legacyDecoratorClassAliasComputedNames.ts === +declare function dec(value: any): any; +>dec : (value: any) => any +>value : any + +@dec +>dec : (value: any) => any + +class C { +>C : C + + [C.name]() {} +>[C.name] : () => void +>C.name : string +>C : typeof C +>name : string + + get [C.name]() { return 1; } +>[C.name] : number +>C.name : string +>C : typeof C +>name : string +>1 : 1 + + set [C.name](value: number) {} +>[C.name] : number +>C.name : string +>C : typeof C +>name : string +>value : number +} + +@dec +>dec : (value: any) => any + +class D { +>D : D + + static [D.name] = 1; +>[D.name] : number +>D.name : string +>D : typeof D +>name : string +>1 : 1 + + static getSelf() { +>getSelf : () => typeof D + + return D; +>D : typeof D + } +} + +@dec +>dec : (value: any) => any + +class Outer { +>Outer : Outer + + method() { +>method : () => typeof (Anonymous class) + + return class { +>class { [Outer.name]() {} } : typeof (Anonymous class) + + [Outer.name]() {} +>[Outer.name] : () => void +>Outer.name : string +>Outer : typeof Outer +>name : string + + }; + } +} + diff --git a/tsc/testdata/tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts b/tsc/testdata/tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts new file mode 100644 index 0000000000000..ade66ee4263bf --- /dev/null +++ b/tsc/testdata/tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts @@ -0,0 +1,28 @@ +// @target: es2020, es2022 +// @experimentalDecorators: true + +declare function dec(value: any): any; + +@dec +class C { + [C.name]() {} + get [C.name]() { return 1; } + set [C.name](value: number) {} +} + +@dec +class D { + static [D.name] = 1; + static getSelf() { + return D; + } +} + +@dec +class Outer { + method() { + return class { + [Outer.name]() {} + }; + } +} From f75a6a6a1965323af9f411f617b988f45b0ae7c8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:48:41 +0000 Subject: [PATCH 3/3] Preserve class binding in computed member names Co-authored-by: RyanCavanaugh <6685088+RyanCavanaugh@users.noreply.github.com> --- .../tstransforms/legacydecorators.go | 32 +++++++++++++- ...iasComputedNames(target=es2020).errors.txt | 12 +++--- ...rClassAliasComputedNames(target=es2020).js | 23 ++++++---- ...sAliasComputedNames(target=es2020).symbols | 42 ++++++++++--------- ...assAliasComputedNames(target=es2020).types | 16 ++++--- ...iasComputedNames(target=es2022).errors.txt | 12 +++--- ...rClassAliasComputedNames(target=es2022).js | 22 ++++++---- ...sAliasComputedNames(target=es2022).symbols | 42 ++++++++++--------- ...assAliasComputedNames(target=es2022).types | 16 ++++--- .../legacyDecoratorClassAliasComputedNames.ts | 4 +- 10 files changed, 142 insertions(+), 79 deletions(-) diff --git a/tsc/internal/transformers/tstransforms/legacydecorators.go b/tsc/internal/transformers/tstransforms/legacydecorators.go index 8eaa45e5071ad..b69b450f6842a 100644 --- a/tsc/internal/transformers/tstransforms/legacydecorators.go +++ b/tsc/internal/transformers/tstransforms/legacydecorators.go @@ -1,6 +1,8 @@ package tstransforms import ( + "slices" + "github.com/microsoft/TypeScript/tsc/internal/ast" "github.com/microsoft/TypeScript/tsc/internal/binder" "github.com/microsoft/TypeScript/tsc/internal/collections" @@ -20,6 +22,8 @@ type LegacyDecoratorsTransformer struct { */ classAliases map[*ast.Node]*ast.Node enclosingClasses []*ast.ClassDeclaration + // Class aliases that should not be substituted while visiting a direct computed member name. + excludedClassAliases []*ast.Node } func NewLegacyDecoratorsTransformer(opt *transformers.TransformOptions) *transformers.Transformer { @@ -60,10 +64,12 @@ func (tx *LegacyDecoratorsTransformer) visit(node *ast.Node) *ast.Node { case ast.KindSourceFile: tx.classAliases = make(map[*ast.Node]*ast.Node) tx.enclosingClasses = nil + tx.excludedClassAliases = nil result := tx.Visitor().VisitEachChild(node) tx.EmitContext().AddEmitHelper(result, tx.EmitContext().ReadEmitHelpers()...) tx.classAliases = nil tx.enclosingClasses = nil + tx.excludedClassAliases = nil return result default: return tx.Visitor().VisitEachChild(node) @@ -73,7 +79,7 @@ func (tx *LegacyDecoratorsTransformer) visit(node *ast.Node) *ast.Node { func (tx *LegacyDecoratorsTransformer) visitIdentifier(node *ast.Identifier) *ast.Node { // takes the place of `substituteIdentifier` in the strada transform for _, d := range tx.enclosingClasses { - if _, ok := tx.classAliases[d.AsNode()]; ok && tx.referenceResolver.GetReferencedValueDeclaration(tx.EmitContext().MostOriginal(node.AsNode())) == tx.EmitContext().MostOriginal(d.AsNode()) { + if _, ok := tx.classAliases[d.AsNode()]; ok && !slices.Contains(tx.excludedClassAliases, d.AsNode()) && tx.referenceResolver.GetReferencedValueDeclaration(tx.EmitContext().MostOriginal(node.AsNode())) == tx.EmitContext().MostOriginal(d.AsNode()) { return tx.classAliases[d.AsNode()] } } @@ -152,6 +158,20 @@ func (tx *LegacyDecoratorsTransformer) visitParamerDeclaration(node *ast.Paramet // with decorators, a temporary value is stored for later use. func (tx *LegacyDecoratorsTransformer) visitPropertyNameOfClassElement(member *ast.Node) *ast.Node { name := member.Name() + if ast.IsComputedPropertyName(name) { + // A direct computed name is evaluated before its class alias is assigned. Exclude only + // that class so references to aliases of enclosing classes are still substituted. + for i := len(tx.enclosingClasses) - 1; i >= 0; i-- { + class := tx.enclosingClasses[i] + if slices.Contains(class.Members.Nodes, member) { + tx.excludedClassAliases = append(tx.excludedClassAliases, class.AsNode()) + defer func() { + tx.excludedClassAliases = tx.excludedClassAliases[:len(tx.excludedClassAliases)-1] + }() + break + } + } + } if ast.IsComputedPropertyName(name) && ast.HasDecorators(member) { expression := tx.Visitor().VisitNode(name.AsComputedPropertyName().Expression) innerExpression := ast.SkipPartiallyEmittedExpressions(expression) @@ -511,8 +531,18 @@ func (tx *LegacyDecoratorsTransformer) transformClassDeclarationWithClassDecorat func (tx *LegacyDecoratorsTransformer) hasInternalStaticReference(node *ast.ClassDeclaration) bool { classNode := tx.EmitContext().MostOriginal(node.AsNode()) + computedNames := make(map[*ast.Node]struct{}) + for _, member := range node.Members.Nodes { + if name := member.Name(); name != nil && ast.IsComputedPropertyName(name) { + // Direct computed names are evaluated before the class alias can be assigned. + computedNames[name] = struct{}{} + } + } var isOrContainsStaticSelfReference func(n *ast.Node) bool isOrContainsStaticSelfReference = func(n *ast.Node) bool { + if _, ok := computedNames[n]; ok { + return false + } if ast.IsIdentifier(n) && tx.referenceResolver.GetReferencedValueDeclaration(tx.EmitContext().MostOriginal(n)) == classNode { return true } diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).errors.txt b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).errors.txt index 8bf19f37132a4..1e31c54b34d1e 100644 --- a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).errors.txt +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).errors.txt @@ -1,14 +1,15 @@ -legacyDecoratorClassAliasComputedNames.ts(5,6): error TS2449: Class 'C' used before its declaration. -legacyDecoratorClassAliasComputedNames.ts(6,10): error TS2449: Class 'C' used before its declaration. +legacyDecoratorClassAliasComputedNames.ts(6,6): error TS2449: Class 'C' used before its declaration. legacyDecoratorClassAliasComputedNames.ts(7,10): error TS2449: Class 'C' used before its declaration. -legacyDecoratorClassAliasComputedNames.ts(12,13): error TS2449: Class 'D' used before its declaration. +legacyDecoratorClassAliasComputedNames.ts(8,10): error TS2449: Class 'C' used before its declaration. +legacyDecoratorClassAliasComputedNames.ts(14,13): error TS2449: Class 'D' used before its declaration. ==== legacyDecoratorClassAliasComputedNames.ts (4 errors) ==== - declare function dec(value: any): any; + declare function dec(...args: any[]): any; @dec class C { + constructor() {} [C.name]() {} ~ !!! error TS2449: Class 'C' used before its declaration. @@ -25,10 +26,11 @@ legacyDecoratorClassAliasComputedNames.ts(12,13): error TS2449: Class 'D' used b @dec class D { + @dec static [D.name] = 1; ~ !!! error TS2449: Class 'D' used before its declaration. -!!! related TS2728 legacyDecoratorClassAliasComputedNames.ts:11:7: 'D' is declared here. +!!! related TS2728 legacyDecoratorClassAliasComputedNames.ts:12:7: 'D' is declared here. static getSelf() { return D; } diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).js b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).js index 0f742b474a2c9..178d4cbbc9804 100644 --- a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).js +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).js @@ -1,10 +1,11 @@ //// [tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts] //// //// [legacyDecoratorClassAliasComputedNames.ts] -declare function dec(value: any): any; +declare function dec(...args: any[]): any; @dec class C { + constructor() {} [C.name]() {} get [C.name]() { return 1; } set [C.name](value: number) {} @@ -12,6 +13,7 @@ class C { @dec class D { + @dec static [D.name] = 1; static getSelf() { return D; @@ -36,14 +38,14 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key, 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 _a; -var C_1, D_1, Outer_1; -let C = C_1 = class C { - [C_1.name]() { } - get [C_1.name]() { return 1; } - set [C_1.name](value) { } +var D_1, _a, Outer_1; +let C = class C { + constructor() { } + [C.name]() { } + get [C.name]() { return 1; } + set [C.name](value) { } }; -C = C_1 = __decorate([ +C = __decorate([ dec ], C); let D = D_1 = class D { @@ -51,8 +53,11 @@ let D = D_1 = class D { return D_1; } }; -_a = D_1.name; +_a = D.name; D[_a] = 1; +__decorate([ + dec +], D, _a, void 0); D = D_1 = __decorate([ dec ], D); diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).symbols b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).symbols index 3bfcec82adeee..3cf933b967320 100644 --- a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).symbols +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).symbols @@ -1,53 +1,57 @@ //// [tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts] //// === legacyDecoratorClassAliasComputedNames.ts === -declare function dec(value: any): any; +declare function dec(...args: any[]): any; >dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) ->value : Symbol(value, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 21)) +>args : Symbol(args, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 21)) @dec >dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) class C { ->C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 42)) + constructor() {} [C.name]() {} ->[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 3, 9)) +>[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 4, 20)) >C.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) ->C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 42)) >name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) get [C.name]() { return 1; } ->[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 4, 17)) +>[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 5, 17)) >C.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) ->C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 42)) >name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) set [C.name](value: number) {} ->[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 5, 32)) +>[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 6, 32)) >C.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) ->C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 42)) >name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) ->value : Symbol(value, Decl(legacyDecoratorClassAliasComputedNames.ts, 6, 17)) +>value : Symbol(value, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 17)) } @dec >dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) class D { ->D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 1)) +>D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 8, 1)) + + @dec +>dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) static [D.name] = 1; ->[D.name] : Symbol(D[D.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 10, 9)) +>[D.name] : Symbol(D[D.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 11, 9)) >D.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) ->D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 1)) +>D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 8, 1)) >name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) static getSelf() { ->getSelf : Symbol(D.getSelf, Decl(legacyDecoratorClassAliasComputedNames.ts, 11, 24)) +>getSelf : Symbol(D.getSelf, Decl(legacyDecoratorClassAliasComputedNames.ts, 13, 24)) return D; ->D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 1)) +>D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 8, 1)) } } @@ -55,16 +59,16 @@ class D { >dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) class Outer { ->Outer : Symbol(Outer, Decl(legacyDecoratorClassAliasComputedNames.ts, 15, 1)) +>Outer : Symbol(Outer, Decl(legacyDecoratorClassAliasComputedNames.ts, 17, 1)) method() { ->method : Symbol(Outer.method, Decl(legacyDecoratorClassAliasComputedNames.ts, 18, 13)) +>method : Symbol(Outer.method, Decl(legacyDecoratorClassAliasComputedNames.ts, 20, 13)) return class { [Outer.name]() {} ->[Outer.name] : Symbol((Anonymous class)[Outer.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 20, 22)) +>[Outer.name] : Symbol((Anonymous class)[Outer.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 22, 22)) >Outer.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) ->Outer : Symbol(Outer, Decl(legacyDecoratorClassAliasComputedNames.ts, 15, 1)) +>Outer : Symbol(Outer, Decl(legacyDecoratorClassAliasComputedNames.ts, 17, 1)) >name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) }; diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).types b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).types index 748933740e46c..d791330f6bf28 100644 --- a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).types +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2020).types @@ -1,16 +1,17 @@ //// [tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts] //// === legacyDecoratorClassAliasComputedNames.ts === -declare function dec(value: any): any; ->dec : (value: any) => any ->value : any +declare function dec(...args: any[]): any; +>dec : (...args: any[]) => any +>args : any[] @dec ->dec : (value: any) => any +>dec : (...args: any[]) => any class C { >C : C + constructor() {} [C.name]() {} >[C.name] : () => void >C.name : string @@ -33,11 +34,14 @@ class C { } @dec ->dec : (value: any) => any +>dec : (...args: any[]) => any class D { >D : D + @dec +>dec : (...args: any[]) => any + static [D.name] = 1; >[D.name] : number >D.name : string @@ -54,7 +58,7 @@ class D { } @dec ->dec : (value: any) => any +>dec : (...args: any[]) => any class Outer { >Outer : Outer diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).errors.txt b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).errors.txt index 8bf19f37132a4..1e31c54b34d1e 100644 --- a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).errors.txt +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).errors.txt @@ -1,14 +1,15 @@ -legacyDecoratorClassAliasComputedNames.ts(5,6): error TS2449: Class 'C' used before its declaration. -legacyDecoratorClassAliasComputedNames.ts(6,10): error TS2449: Class 'C' used before its declaration. +legacyDecoratorClassAliasComputedNames.ts(6,6): error TS2449: Class 'C' used before its declaration. legacyDecoratorClassAliasComputedNames.ts(7,10): error TS2449: Class 'C' used before its declaration. -legacyDecoratorClassAliasComputedNames.ts(12,13): error TS2449: Class 'D' used before its declaration. +legacyDecoratorClassAliasComputedNames.ts(8,10): error TS2449: Class 'C' used before its declaration. +legacyDecoratorClassAliasComputedNames.ts(14,13): error TS2449: Class 'D' used before its declaration. ==== legacyDecoratorClassAliasComputedNames.ts (4 errors) ==== - declare function dec(value: any): any; + declare function dec(...args: any[]): any; @dec class C { + constructor() {} [C.name]() {} ~ !!! error TS2449: Class 'C' used before its declaration. @@ -25,10 +26,11 @@ legacyDecoratorClassAliasComputedNames.ts(12,13): error TS2449: Class 'D' used b @dec class D { + @dec static [D.name] = 1; ~ !!! error TS2449: Class 'D' used before its declaration. -!!! related TS2728 legacyDecoratorClassAliasComputedNames.ts:11:7: 'D' is declared here. +!!! related TS2728 legacyDecoratorClassAliasComputedNames.ts:12:7: 'D' is declared here. static getSelf() { return D; } diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).js b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).js index ba0b17d7edc36..bcce5af1d8201 100644 --- a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).js +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).js @@ -1,10 +1,11 @@ //// [tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts] //// //// [legacyDecoratorClassAliasComputedNames.ts] -declare function dec(value: any): any; +declare function dec(...args: any[]): any; @dec class C { + constructor() {} [C.name]() {} get [C.name]() { return 1; } set [C.name](value: number) {} @@ -12,6 +13,7 @@ class C { @dec class D { + @dec static [D.name] = 1; static getSelf() { return D; @@ -36,22 +38,26 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key, 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 C_1, D_1, Outer_1; -let C = C_1 = class C { - [C_1.name]() { } - get [C_1.name]() { return 1; } - set [C_1.name](value) { } +var D_1, _a, Outer_1; +let C = class C { + constructor() { } + [C.name]() { } + get [C.name]() { return 1; } + set [C.name](value) { } }; -C = C_1 = __decorate([ +C = __decorate([ dec ], C); let D = class D { static { D_1 = this; } - static [D_1.name] = 1; + static [_a = D.name] = 1; static getSelf() { return D_1; } }; +__decorate([ + dec +], D, _a, void 0); D = D_1 = __decorate([ dec ], D); diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).symbols b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).symbols index 3bfcec82adeee..3cf933b967320 100644 --- a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).symbols +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).symbols @@ -1,53 +1,57 @@ //// [tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts] //// === legacyDecoratorClassAliasComputedNames.ts === -declare function dec(value: any): any; +declare function dec(...args: any[]): any; >dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) ->value : Symbol(value, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 21)) +>args : Symbol(args, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 21)) @dec >dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) class C { ->C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 42)) + constructor() {} [C.name]() {} ->[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 3, 9)) +>[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 4, 20)) >C.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) ->C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 42)) >name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) get [C.name]() { return 1; } ->[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 4, 17)) +>[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 5, 17)) >C.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) ->C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 42)) >name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) set [C.name](value: number) {} ->[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 5, 32)) +>[C.name] : Symbol(C[C.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 6, 32)) >C.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) ->C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 38)) +>C : Symbol(C, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 42)) >name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) ->value : Symbol(value, Decl(legacyDecoratorClassAliasComputedNames.ts, 6, 17)) +>value : Symbol(value, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 17)) } @dec >dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) class D { ->D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 1)) +>D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 8, 1)) + + @dec +>dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) static [D.name] = 1; ->[D.name] : Symbol(D[D.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 10, 9)) +>[D.name] : Symbol(D[D.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 11, 9)) >D.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) ->D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 1)) +>D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 8, 1)) >name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) static getSelf() { ->getSelf : Symbol(D.getSelf, Decl(legacyDecoratorClassAliasComputedNames.ts, 11, 24)) +>getSelf : Symbol(D.getSelf, Decl(legacyDecoratorClassAliasComputedNames.ts, 13, 24)) return D; ->D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 7, 1)) +>D : Symbol(D, Decl(legacyDecoratorClassAliasComputedNames.ts, 8, 1)) } } @@ -55,16 +59,16 @@ class D { >dec : Symbol(dec, Decl(legacyDecoratorClassAliasComputedNames.ts, 0, 0)) class Outer { ->Outer : Symbol(Outer, Decl(legacyDecoratorClassAliasComputedNames.ts, 15, 1)) +>Outer : Symbol(Outer, Decl(legacyDecoratorClassAliasComputedNames.ts, 17, 1)) method() { ->method : Symbol(Outer.method, Decl(legacyDecoratorClassAliasComputedNames.ts, 18, 13)) +>method : Symbol(Outer.method, Decl(legacyDecoratorClassAliasComputedNames.ts, 20, 13)) return class { [Outer.name]() {} ->[Outer.name] : Symbol((Anonymous class)[Outer.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 20, 22)) +>[Outer.name] : Symbol((Anonymous class)[Outer.name], Decl(legacyDecoratorClassAliasComputedNames.ts, 22, 22)) >Outer.name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) ->Outer : Symbol(Outer, Decl(legacyDecoratorClassAliasComputedNames.ts, 15, 1)) +>Outer : Symbol(Outer, Decl(legacyDecoratorClassAliasComputedNames.ts, 17, 1)) >name : Symbol(Function.name, Decl(lib.es2015.core.d.ts, --, --)) }; diff --git a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).types b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).types index 748933740e46c..d791330f6bf28 100644 --- a/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).types +++ b/tsc/testdata/baselines/reference/compiler/legacyDecoratorClassAliasComputedNames(target=es2022).types @@ -1,16 +1,17 @@ //// [tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts] //// === legacyDecoratorClassAliasComputedNames.ts === -declare function dec(value: any): any; ->dec : (value: any) => any ->value : any +declare function dec(...args: any[]): any; +>dec : (...args: any[]) => any +>args : any[] @dec ->dec : (value: any) => any +>dec : (...args: any[]) => any class C { >C : C + constructor() {} [C.name]() {} >[C.name] : () => void >C.name : string @@ -33,11 +34,14 @@ class C { } @dec ->dec : (value: any) => any +>dec : (...args: any[]) => any class D { >D : D + @dec +>dec : (...args: any[]) => any + static [D.name] = 1; >[D.name] : number >D.name : string @@ -54,7 +58,7 @@ class D { } @dec ->dec : (value: any) => any +>dec : (...args: any[]) => any class Outer { >Outer : Outer diff --git a/tsc/testdata/tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts b/tsc/testdata/tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts index ade66ee4263bf..23a49be8e2483 100644 --- a/tsc/testdata/tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts +++ b/tsc/testdata/tests/cases/compiler/legacyDecoratorClassAliasComputedNames.ts @@ -1,10 +1,11 @@ // @target: es2020, es2022 // @experimentalDecorators: true -declare function dec(value: any): any; +declare function dec(...args: any[]): any; @dec class C { + constructor() {} [C.name]() {} get [C.name]() { return 1; } set [C.name](value: number) {} @@ -12,6 +13,7 @@ class C { @dec class D { + @dec static [D.name] = 1; static getSelf() { return D;