Skip to content

Commit 3a8591b

Browse files
committed
Fix const assertions on enums
Fixes #45977
1 parent 5546f20 commit 3a8591b

File tree

5 files changed

+98
-8
lines changed

5 files changed

+98
-8
lines changed

src/compiler/checker.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30741,13 +30741,11 @@ namespace ts {
3074130741
case SyntaxKind.PropertyAccessExpression:
3074230742
case SyntaxKind.ElementAccessExpression:
3074330743
const expr = (node as PropertyAccessExpression | ElementAccessExpression).expression;
30744-
if (isIdentifier(expr)) {
30745-
let symbol = getSymbolAtLocation(expr);
30746-
if (symbol && symbol.flags & SymbolFlags.Alias) {
30747-
symbol = resolveAlias(symbol);
30748-
}
30749-
return !!(symbol && (symbol.flags & SymbolFlags.Enum) && getEnumKind(symbol) === EnumKind.Literal);
30744+
let symbol = getTypeOfNode(expr).symbol;
30745+
if (symbol && symbol.flags & SymbolFlags.Alias) {
30746+
symbol = resolveAlias(symbol);
3075030747
}
30748+
return !!(symbol && (symbol.flags & SymbolFlags.Enum) && getEnumKind(symbol) === EnumKind.Literal);
3075130749
}
3075230750
return false;
3075330751
}

tests/baselines/reference/constAssertionOnEnum.js

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,18 @@ enum Bar {
1414
B,
1515
}
1616
let foo = Foo.A as const;
17-
let bar = Bar.A as const;
17+
let bar = Bar.A as const;
18+
19+
//// [ns.ts]
20+
namespace ns {
21+
export enum Foo { X }
22+
ns.Foo.X as const;
23+
}
24+
25+
//// [more.ts]
26+
export enum Foo { X }
27+
(Foo).X as const;
28+
1829

1930
//// [enum.js]
2031
export var Foo;
@@ -31,3 +42,19 @@ var Bar;
3142
})(Bar || (Bar = {}));
3243
let foo = Foo.A;
3344
let bar = Bar.A;
45+
//// [ns.js]
46+
"use strict";
47+
var ns;
48+
(function (ns) {
49+
let Foo;
50+
(function (Foo) {
51+
Foo[Foo["X"] = 0] = "X";
52+
})(Foo = ns.Foo || (ns.Foo = {}));
53+
ns.Foo.X;
54+
})(ns || (ns = {}));
55+
//// [more.js]
56+
export var Foo;
57+
(function (Foo) {
58+
Foo[Foo["X"] = 0] = "X";
59+
})(Foo || (Foo = {}));
60+
(Foo).X;

tests/baselines/reference/constAssertionOnEnum.symbols

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,29 @@ let bar = Bar.A as const;
3434
>Bar : Symbol(Bar, Decl(test.ts, 0, 27))
3535
>A : Symbol(Bar.A, Decl(test.ts, 2, 10))
3636

37+
=== tests/cases/conformance/expressions/typeAssertions/ns.ts ===
38+
namespace ns {
39+
>ns : Symbol(ns, Decl(ns.ts, 0, 0))
40+
41+
export enum Foo { X }
42+
>Foo : Symbol(Foo, Decl(ns.ts, 0, 14))
43+
>X : Symbol(Foo.X, Decl(ns.ts, 1, 21))
44+
45+
ns.Foo.X as const;
46+
>ns.Foo.X : Symbol(Foo.X, Decl(ns.ts, 1, 21))
47+
>ns.Foo : Symbol(Foo, Decl(ns.ts, 0, 14))
48+
>ns : Symbol(ns, Decl(ns.ts, 0, 0))
49+
>Foo : Symbol(Foo, Decl(ns.ts, 0, 14))
50+
>X : Symbol(Foo.X, Decl(ns.ts, 1, 21))
51+
}
52+
53+
=== tests/cases/conformance/expressions/typeAssertions/more.ts ===
54+
export enum Foo { X }
55+
>Foo : Symbol(Foo, Decl(more.ts, 0, 0))
56+
>X : Symbol(Foo.X, Decl(more.ts, 0, 17))
57+
58+
(Foo).X as const;
59+
>(Foo).X : Symbol(Foo.X, Decl(more.ts, 0, 17))
60+
>Foo : Symbol(Foo, Decl(more.ts, 0, 0))
61+
>X : Symbol(Foo.X, Decl(more.ts, 0, 17))
62+

tests/baselines/reference/constAssertionOnEnum.types

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,32 @@ let bar = Bar.A as const;
3636
>Bar : typeof Bar
3737
>A : Bar.A
3838

39+
=== tests/cases/conformance/expressions/typeAssertions/ns.ts ===
40+
namespace ns {
41+
>ns : typeof ns
42+
43+
export enum Foo { X }
44+
>Foo : Foo
45+
>X : Foo.X
46+
47+
ns.Foo.X as const;
48+
>ns.Foo.X as const : Foo
49+
>ns.Foo.X : Foo
50+
>ns.Foo : typeof Foo
51+
>ns : typeof ns
52+
>Foo : typeof Foo
53+
>X : Foo
54+
}
55+
56+
=== tests/cases/conformance/expressions/typeAssertions/more.ts ===
57+
export enum Foo { X }
58+
>Foo : Foo
59+
>X : Foo.X
60+
61+
(Foo).X as const;
62+
>(Foo).X as const : Foo
63+
>(Foo).X : Foo
64+
>(Foo) : typeof Foo
65+
>Foo : typeof Foo
66+
>X : Foo
67+

tests/cases/conformance/expressions/typeAssertions/constAssertionOnEnum.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,14 @@ enum Bar {
1515
B,
1616
}
1717
let foo = Foo.A as const;
18-
let bar = Bar.A as const;
18+
let bar = Bar.A as const;
19+
20+
// @filename: ns.ts
21+
namespace ns {
22+
export enum Foo { X }
23+
ns.Foo.X as const;
24+
}
25+
26+
// @filename: more.ts
27+
export enum Foo { X }
28+
(Foo).X as const;

0 commit comments

Comments
 (0)