From 4a773068f064dec58fc24cd4610177476b3e7813 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Tue, 21 Jun 2022 09:58:45 +0300 Subject: [PATCH] fix(49594): allow enum members in computed properties --- src/compiler/checker.ts | 2 +- .../strictPropertyInitialization.errors.txt | 12 +++++++ .../reference/strictPropertyInitialization.js | 31 ++++++++++++++++++ .../strictPropertyInitialization.symbols | 27 ++++++++++++++++ .../strictPropertyInitialization.types | 32 +++++++++++++++++++ .../strictPropertyInitialization.ts | 12 +++++++ 6 files changed, 115 insertions(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6b45b23c1e819..acaa981d95030 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -23337,7 +23337,7 @@ namespace ts { } if (isEntityNameExpression(node.argumentExpression)) { const symbol = resolveEntityName(node.argumentExpression, SymbolFlags.Value, /*ignoreErrors*/ true); - if (!symbol || !isConstVariable(symbol)) return undefined; + if (!symbol || !(isConstVariable(symbol) || (symbol.flags & SymbolFlags.EnumMember))) return undefined; const declaration = symbol.valueDeclaration; if (declaration === undefined) return undefined; diff --git a/tests/baselines/reference/strictPropertyInitialization.errors.txt b/tests/baselines/reference/strictPropertyInitialization.errors.txt index 208c0a32e4d1d..130284f5a3955 100644 --- a/tests/baselines/reference/strictPropertyInitialization.errors.txt +++ b/tests/baselines/reference/strictPropertyInitialization.errors.txt @@ -179,4 +179,16 @@ tests/cases/conformance/classes/propertyMemberDeclarations/strictPropertyInitial this['c'] = 1; } } + + enum E { + A = "A", + B = "B" + } + class C13 { + [E.A]: number; + + constructor() { + this[E.A] = 1; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/strictPropertyInitialization.js b/tests/baselines/reference/strictPropertyInitialization.js index 41760958edd1f..04c20082f9ea9 100644 --- a/tests/baselines/reference/strictPropertyInitialization.js +++ b/tests/baselines/reference/strictPropertyInitialization.js @@ -147,6 +147,18 @@ class C12 { this['c'] = 1; } } + +enum E { + A = "A", + B = "B" +} +class C13 { + [E.A]: number; + + constructor() { + this[E.A] = 1; + } +} //// [strictPropertyInitialization.js] @@ -259,6 +271,17 @@ class C12 { this['c'] = 1; } } +var E; +(function (E) { + E["A"] = "A"; + E["B"] = "B"; +})(E || (E = {})); +class C13 { + constructor() { + this[E.A] = 1; + } +} +E.A; //// [strictPropertyInitialization.d.ts] @@ -335,3 +358,11 @@ declare class C12 { ['c']: number; constructor(); } +declare enum E { + A = "A", + B = "B" +} +declare class C13 { + [E.A]: number; + constructor(); +} diff --git a/tests/baselines/reference/strictPropertyInitialization.symbols b/tests/baselines/reference/strictPropertyInitialization.symbols index 45e15f21403e5..3b81ef3d31835 100644 --- a/tests/baselines/reference/strictPropertyInitialization.symbols +++ b/tests/baselines/reference/strictPropertyInitialization.symbols @@ -348,3 +348,30 @@ class C12 { } } +enum E { +>E : Symbol(E, Decl(strictPropertyInitialization.ts, 147, 1)) + + A = "A", +>A : Symbol(E.A, Decl(strictPropertyInitialization.ts, 149, 8)) + + B = "B" +>B : Symbol(E.B, Decl(strictPropertyInitialization.ts, 150, 12)) +} +class C13 { +>C13 : Symbol(C13, Decl(strictPropertyInitialization.ts, 152, 1)) + + [E.A]: number; +>[E.A] : Symbol(C13[E.A], Decl(strictPropertyInitialization.ts, 153, 11)) +>E.A : Symbol(E.A, Decl(strictPropertyInitialization.ts, 149, 8)) +>E : Symbol(E, Decl(strictPropertyInitialization.ts, 147, 1)) +>A : Symbol(E.A, Decl(strictPropertyInitialization.ts, 149, 8)) + + constructor() { + this[E.A] = 1; +>this : Symbol(C13, Decl(strictPropertyInitialization.ts, 152, 1)) +>E.A : Symbol(E.A, Decl(strictPropertyInitialization.ts, 149, 8)) +>E : Symbol(E, Decl(strictPropertyInitialization.ts, 147, 1)) +>A : Symbol(E.A, Decl(strictPropertyInitialization.ts, 149, 8)) + } +} + diff --git a/tests/baselines/reference/strictPropertyInitialization.types b/tests/baselines/reference/strictPropertyInitialization.types index 84d375c85157a..616e41d9be324 100644 --- a/tests/baselines/reference/strictPropertyInitialization.types +++ b/tests/baselines/reference/strictPropertyInitialization.types @@ -395,3 +395,35 @@ class C12 { } } +enum E { +>E : E + + A = "A", +>A : E.A +>"A" : "A" + + B = "B" +>B : E.B +>"B" : "B" +} +class C13 { +>C13 : C13 + + [E.A]: number; +>[E.A] : number +>E.A : E.A +>E : typeof E +>A : E.A + + constructor() { + this[E.A] = 1; +>this[E.A] = 1 : 1 +>this[E.A] : number +>this : this +>E.A : E.A +>E : typeof E +>A : E.A +>1 : 1 + } +} + diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/strictPropertyInitialization.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/strictPropertyInitialization.ts index 3caf731626494..4b8fd40a5a563 100644 --- a/tests/cases/conformance/classes/propertyMemberDeclarations/strictPropertyInitialization.ts +++ b/tests/cases/conformance/classes/propertyMemberDeclarations/strictPropertyInitialization.ts @@ -150,3 +150,15 @@ class C12 { this['c'] = 1; } } + +enum E { + A = "A", + B = "B" +} +class C13 { + [E.A]: number; + + constructor() { + this[E.A] = 1; + } +}