Skip to content

Commit 49a11d3

Browse files
committed
Support template literals in enum declarations
1 parent e543d8b commit 49a11d3

10 files changed

+816
-3
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6508,7 +6508,7 @@ namespace ts {
65086508
}
65096509

65106510
function isStringConcatExpression(expr: Node): boolean {
6511-
if (expr.kind === SyntaxKind.StringLiteral) {
6511+
if (isStringLiteralLike(expr)) {
65126512
return true;
65136513
}
65146514
else if (expr.kind === SyntaxKind.BinaryExpression) {
@@ -6525,6 +6525,7 @@ namespace ts {
65256525
switch (expr.kind) {
65266526
case SyntaxKind.StringLiteral:
65276527
case SyntaxKind.NumericLiteral:
6528+
case SyntaxKind.NoSubstitutionTemplateLiteral:
65286529
return true;
65296530
case SyntaxKind.PrefixUnaryExpression:
65306531
return (<PrefixUnaryExpression>expr).operator === SyntaxKind.MinusToken &&
@@ -6547,7 +6548,7 @@ namespace ts {
65476548
for (const declaration of symbol.declarations) {
65486549
if (declaration.kind === SyntaxKind.EnumDeclaration) {
65496550
for (const member of (<EnumDeclaration>declaration).members) {
6550-
if (member.initializer && member.initializer.kind === SyntaxKind.StringLiteral) {
6551+
if (member.initializer && isStringLiteralLike(member.initializer)) {
65516552
return links.enumKind = EnumKind.Literal;
65526553
}
65536554
if (!isLiteralEnumMember(member)) {
@@ -29547,7 +29548,8 @@ namespace ts {
2954729548
}
2954829549
break;
2954929550
case SyntaxKind.StringLiteral:
29550-
return (<StringLiteral>expr).text;
29551+
case SyntaxKind.NoSubstitutionTemplateLiteral:
29552+
return (<StringLiteralLike>expr).text;
2955129553
case SyntaxKind.NumericLiteral:
2955229554
checkGrammarNumericLiteral(<NumericLiteral>expr);
2955329555
return +(<NumericLiteral>expr).text;
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
tests/cases/conformance/enums/enumConstantMemberWithTemplateLiterals.ts(28,9): error TS2553: Computed values are not permitted in an enum with string valued members.
2+
tests/cases/conformance/enums/enumConstantMemberWithTemplateLiterals.ts(29,9): error TS2553: Computed values are not permitted in an enum with string valued members.
3+
tests/cases/conformance/enums/enumConstantMemberWithTemplateLiterals.ts(30,9): error TS2553: Computed values are not permitted in an enum with string valued members.
4+
tests/cases/conformance/enums/enumConstantMemberWithTemplateLiterals.ts(31,9): error TS2553: Computed values are not permitted in an enum with string valued members.
5+
6+
7+
==== tests/cases/conformance/enums/enumConstantMemberWithTemplateLiterals.ts (4 errors) ====
8+
enum T1 {
9+
a = `1`
10+
}
11+
12+
enum T2 {
13+
a = `1`,
14+
b = "2",
15+
c = 3
16+
}
17+
18+
enum T3 {
19+
a = `1` + `1`
20+
}
21+
22+
enum T4 {
23+
a = `1`,
24+
b = `1` + `1`,
25+
c = `1` + "2",
26+
d = "2" + `1`,
27+
e = "2" + `1` + `1`
28+
}
29+
30+
enum T5 {
31+
a = `1`,
32+
b = `1` + `2`,
33+
c = `1` + `2` + `3`,
34+
d = 1,
35+
e = `1` - `1`,
36+
~~~~~~~~~
37+
!!! error TS2553: Computed values are not permitted in an enum with string valued members.
38+
f = `1` + 1,
39+
~~~~~~~
40+
!!! error TS2553: Computed values are not permitted in an enum with string valued members.
41+
g = `1${"2"}3`,
42+
~~~~~~~~~~
43+
!!! error TS2553: Computed values are not permitted in an enum with string valued members.
44+
h = `1`.length
45+
~~~~~~~~~~
46+
!!! error TS2553: Computed values are not permitted in an enum with string valued members.
47+
}
48+
49+
enum T6 {
50+
a = 1,
51+
b = `12`.length
52+
}
53+
54+
declare enum T7 {
55+
a = `1`,
56+
b = `1` + `1`,
57+
c = "2" + `1`
58+
}
59+
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
//// [enumConstantMemberWithTemplateLiterals.ts]
2+
enum T1 {
3+
a = `1`
4+
}
5+
6+
enum T2 {
7+
a = `1`,
8+
b = "2",
9+
c = 3
10+
}
11+
12+
enum T3 {
13+
a = `1` + `1`
14+
}
15+
16+
enum T4 {
17+
a = `1`,
18+
b = `1` + `1`,
19+
c = `1` + "2",
20+
d = "2" + `1`,
21+
e = "2" + `1` + `1`
22+
}
23+
24+
enum T5 {
25+
a = `1`,
26+
b = `1` + `2`,
27+
c = `1` + `2` + `3`,
28+
d = 1,
29+
e = `1` - `1`,
30+
f = `1` + 1,
31+
g = `1${"2"}3`,
32+
h = `1`.length
33+
}
34+
35+
enum T6 {
36+
a = 1,
37+
b = `12`.length
38+
}
39+
40+
declare enum T7 {
41+
a = `1`,
42+
b = `1` + `1`,
43+
c = "2" + `1`
44+
}
45+
46+
47+
//// [enumConstantMemberWithTemplateLiterals.js]
48+
var T1;
49+
(function (T1) {
50+
T1["a"] = "1";
51+
})(T1 || (T1 = {}));
52+
var T2;
53+
(function (T2) {
54+
T2["a"] = "1";
55+
T2["b"] = "2";
56+
T2[T2["c"] = 3] = "c";
57+
})(T2 || (T2 = {}));
58+
var T3;
59+
(function (T3) {
60+
T3["a"] = "11";
61+
})(T3 || (T3 = {}));
62+
var T4;
63+
(function (T4) {
64+
T4["a"] = "1";
65+
T4["b"] = "11";
66+
T4["c"] = "12";
67+
T4["d"] = "21";
68+
T4["e"] = "211";
69+
})(T4 || (T4 = {}));
70+
var T5;
71+
(function (T5) {
72+
T5["a"] = "1";
73+
T5["b"] = "12";
74+
T5["c"] = "123";
75+
T5[T5["d"] = 1] = "d";
76+
T5[T5["e"] = 0] = "e";
77+
T5[T5["f"] = 0] = "f";
78+
T5[T5["g"] = 0] = "g";
79+
T5[T5["h"] = 0] = "h";
80+
})(T5 || (T5 = {}));
81+
var T6;
82+
(function (T6) {
83+
T6[T6["a"] = 1] = "a";
84+
T6[T6["b"] = "12".length] = "b";
85+
})(T6 || (T6 = {}));
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
=== tests/cases/conformance/enums/enumConstantMemberWithTemplateLiterals.ts ===
2+
enum T1 {
3+
>T1 : Symbol(T1, Decl(enumConstantMemberWithTemplateLiterals.ts, 0, 0))
4+
5+
a = `1`
6+
>a : Symbol(T1.a, Decl(enumConstantMemberWithTemplateLiterals.ts, 0, 9))
7+
}
8+
9+
enum T2 {
10+
>T2 : Symbol(T2, Decl(enumConstantMemberWithTemplateLiterals.ts, 2, 1))
11+
12+
a = `1`,
13+
>a : Symbol(T2.a, Decl(enumConstantMemberWithTemplateLiterals.ts, 4, 9))
14+
15+
b = "2",
16+
>b : Symbol(T2.b, Decl(enumConstantMemberWithTemplateLiterals.ts, 5, 12))
17+
18+
c = 3
19+
>c : Symbol(T2.c, Decl(enumConstantMemberWithTemplateLiterals.ts, 6, 12))
20+
}
21+
22+
enum T3 {
23+
>T3 : Symbol(T3, Decl(enumConstantMemberWithTemplateLiterals.ts, 8, 1))
24+
25+
a = `1` + `1`
26+
>a : Symbol(T3.a, Decl(enumConstantMemberWithTemplateLiterals.ts, 10, 9))
27+
}
28+
29+
enum T4 {
30+
>T4 : Symbol(T4, Decl(enumConstantMemberWithTemplateLiterals.ts, 12, 1))
31+
32+
a = `1`,
33+
>a : Symbol(T4.a, Decl(enumConstantMemberWithTemplateLiterals.ts, 14, 9))
34+
35+
b = `1` + `1`,
36+
>b : Symbol(T4.b, Decl(enumConstantMemberWithTemplateLiterals.ts, 15, 12))
37+
38+
c = `1` + "2",
39+
>c : Symbol(T4.c, Decl(enumConstantMemberWithTemplateLiterals.ts, 16, 18))
40+
41+
d = "2" + `1`,
42+
>d : Symbol(T4.d, Decl(enumConstantMemberWithTemplateLiterals.ts, 17, 18))
43+
44+
e = "2" + `1` + `1`
45+
>e : Symbol(T4.e, Decl(enumConstantMemberWithTemplateLiterals.ts, 18, 18))
46+
}
47+
48+
enum T5 {
49+
>T5 : Symbol(T5, Decl(enumConstantMemberWithTemplateLiterals.ts, 20, 1))
50+
51+
a = `1`,
52+
>a : Symbol(T5.a, Decl(enumConstantMemberWithTemplateLiterals.ts, 22, 9))
53+
54+
b = `1` + `2`,
55+
>b : Symbol(T5.b, Decl(enumConstantMemberWithTemplateLiterals.ts, 23, 12))
56+
57+
c = `1` + `2` + `3`,
58+
>c : Symbol(T5.c, Decl(enumConstantMemberWithTemplateLiterals.ts, 24, 18))
59+
60+
d = 1,
61+
>d : Symbol(T5.d, Decl(enumConstantMemberWithTemplateLiterals.ts, 25, 24))
62+
63+
e = `1` - `1`,
64+
>e : Symbol(T5.e, Decl(enumConstantMemberWithTemplateLiterals.ts, 26, 10))
65+
66+
f = `1` + 1,
67+
>f : Symbol(T5.f, Decl(enumConstantMemberWithTemplateLiterals.ts, 27, 18))
68+
69+
g = `1${"2"}3`,
70+
>g : Symbol(T5.g, Decl(enumConstantMemberWithTemplateLiterals.ts, 28, 16))
71+
72+
h = `1`.length
73+
>h : Symbol(T5.h, Decl(enumConstantMemberWithTemplateLiterals.ts, 29, 19))
74+
>`1`.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
75+
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
76+
}
77+
78+
enum T6 {
79+
>T6 : Symbol(T6, Decl(enumConstantMemberWithTemplateLiterals.ts, 31, 1))
80+
81+
a = 1,
82+
>a : Symbol(T6.a, Decl(enumConstantMemberWithTemplateLiterals.ts, 33, 9))
83+
84+
b = `12`.length
85+
>b : Symbol(T6.b, Decl(enumConstantMemberWithTemplateLiterals.ts, 34, 10))
86+
>`12`.length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
87+
>length : Symbol(String.length, Decl(lib.es5.d.ts, --, --))
88+
}
89+
90+
declare enum T7 {
91+
>T7 : Symbol(T7, Decl(enumConstantMemberWithTemplateLiterals.ts, 36, 1))
92+
93+
a = `1`,
94+
>a : Symbol(T7.a, Decl(enumConstantMemberWithTemplateLiterals.ts, 38, 17))
95+
96+
b = `1` + `1`,
97+
>b : Symbol(T7.b, Decl(enumConstantMemberWithTemplateLiterals.ts, 39, 12))
98+
99+
c = "2" + `1`
100+
>c : Symbol(T7.c, Decl(enumConstantMemberWithTemplateLiterals.ts, 40, 18))
101+
}
102+

0 commit comments

Comments
 (0)