Skip to content

Commit 6a2f996

Browse files
author
王文璐
committed
allow string concat in enum member declaration
1 parent d0721e4 commit 6a2f996

6 files changed

+331
-0
lines changed

src/compiler/checker.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4973,6 +4973,16 @@ namespace ts {
49734973
return links.declaredType;
49744974
}
49754975

4976+
function isStringConcatExpression(expr: Node): boolean {
4977+
if (expr.kind === SyntaxKind.StringLiteral) {
4978+
return true;
4979+
}
4980+
else if (expr.kind === SyntaxKind.BinaryExpression) {
4981+
return isStringConcatExpression((<BinaryExpression>expr).left) && isStringConcatExpression((<BinaryExpression>expr).right);
4982+
}
4983+
return false;
4984+
}
4985+
49764986
function isLiteralEnumMember(member: EnumMember) {
49774987
const expr = member.initializer;
49784988
if (!expr) {
@@ -4987,6 +4997,8 @@ namespace ts {
49874997
(<PrefixUnaryExpression>expr).operand.kind === SyntaxKind.NumericLiteral;
49884998
case SyntaxKind.Identifier:
49894999
return nodeIsMissing(expr) || !!getSymbolOfNode(member.parent).exports.get((<Identifier>expr).escapedText);
5000+
case SyntaxKind.BinaryExpression:
5001+
return isStringConcatExpression(expr);
49905002
default:
49915003
return false;
49925004
}
@@ -22962,6 +22974,9 @@ namespace ts {
2296222974
case SyntaxKind.AsteriskAsteriskToken: return left ** right;
2296322975
}
2296422976
}
22977+
else if (typeof left === "string" && typeof right === "string" && (<BinaryExpression>expr).operatorToken.kind === SyntaxKind.PlusToken) {
22978+
return left + right;
22979+
}
2296522980
break;
2296622981
case SyntaxKind.StringLiteral:
2296722982
return (<StringLiteral>expr).text;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
tests/cases/conformance/enums/enumConstantMemberWithString.ts(5,9): error TS2553: Computed values are not permitted in an enum with string valued members.
2+
tests/cases/conformance/enums/enumConstantMemberWithString.ts(6,9): error TS2553: Computed values are not permitted in an enum with string valued members.
3+
tests/cases/conformance/enums/enumConstantMemberWithString.ts(18,9): error TS2553: Computed values are not permitted in an enum with string valued members.
4+
5+
6+
==== tests/cases/conformance/enums/enumConstantMemberWithString.ts (3 errors) ====
7+
enum T1 {
8+
a = "1",
9+
b = "1" + "2",
10+
c = "1" + "2" + "3",
11+
d = "a" - "a",
12+
~~~~~~~~~
13+
!!! error TS2553: Computed values are not permitted in an enum with string valued members.
14+
e = "a" + 1
15+
~~~~~~~
16+
!!! error TS2553: Computed values are not permitted in an enum with string valued members.
17+
}
18+
19+
enum T2 {
20+
a = "1",
21+
b = "1" + "2"
22+
}
23+
24+
enum T3 {
25+
a = "1",
26+
b = "1" + "2",
27+
c = 1,
28+
d = 1 + 2
29+
~~~~~
30+
!!! error TS2553: Computed values are not permitted in an enum with string valued members.
31+
}
32+
33+
enum T4 {
34+
a = "1"
35+
}
36+
37+
enum T5 {
38+
a = "1" + "2"
39+
}
40+
41+
declare enum T6 {
42+
a = "1",
43+
b = "1" + "2"
44+
}
45+
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
//// [enumConstantMemberWithString.ts]
2+
enum T1 {
3+
a = "1",
4+
b = "1" + "2",
5+
c = "1" + "2" + "3",
6+
d = "a" - "a",
7+
e = "a" + 1
8+
}
9+
10+
enum T2 {
11+
a = "1",
12+
b = "1" + "2"
13+
}
14+
15+
enum T3 {
16+
a = "1",
17+
b = "1" + "2",
18+
c = 1,
19+
d = 1 + 2
20+
}
21+
22+
enum T4 {
23+
a = "1"
24+
}
25+
26+
enum T5 {
27+
a = "1" + "2"
28+
}
29+
30+
declare enum T6 {
31+
a = "1",
32+
b = "1" + "2"
33+
}
34+
35+
36+
//// [enumConstantMemberWithString.js]
37+
var T1;
38+
(function (T1) {
39+
T1["a"] = "1";
40+
T1["b"] = "12";
41+
T1["c"] = "123";
42+
T1[T1["d"] = 0] = "d";
43+
T1[T1["e"] = 0] = "e";
44+
})(T1 || (T1 = {}));
45+
var T2;
46+
(function (T2) {
47+
T2["a"] = "1";
48+
T2["b"] = "12";
49+
})(T2 || (T2 = {}));
50+
var T3;
51+
(function (T3) {
52+
T3["a"] = "1";
53+
T3["b"] = "12";
54+
T3[T3["c"] = 1] = "c";
55+
T3[T3["d"] = 0] = "d";
56+
})(T3 || (T3 = {}));
57+
var T4;
58+
(function (T4) {
59+
T4["a"] = "1";
60+
})(T4 || (T4 = {}));
61+
var T5;
62+
(function (T5) {
63+
T5["a"] = "12";
64+
})(T5 || (T5 = {}));
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
=== tests/cases/conformance/enums/enumConstantMemberWithString.ts ===
2+
enum T1 {
3+
>T1 : Symbol(T1, Decl(enumConstantMemberWithString.ts, 0, 0))
4+
5+
a = "1",
6+
>a : Symbol(T1.a, Decl(enumConstantMemberWithString.ts, 0, 9))
7+
8+
b = "1" + "2",
9+
>b : Symbol(T1.b, Decl(enumConstantMemberWithString.ts, 1, 12))
10+
11+
c = "1" + "2" + "3",
12+
>c : Symbol(T1.c, Decl(enumConstantMemberWithString.ts, 2, 18))
13+
14+
d = "a" - "a",
15+
>d : Symbol(T1.d, Decl(enumConstantMemberWithString.ts, 3, 24))
16+
17+
e = "a" + 1
18+
>e : Symbol(T1.e, Decl(enumConstantMemberWithString.ts, 4, 18))
19+
}
20+
21+
enum T2 {
22+
>T2 : Symbol(T2, Decl(enumConstantMemberWithString.ts, 6, 1))
23+
24+
a = "1",
25+
>a : Symbol(T2.a, Decl(enumConstantMemberWithString.ts, 8, 9))
26+
27+
b = "1" + "2"
28+
>b : Symbol(T2.b, Decl(enumConstantMemberWithString.ts, 9, 12))
29+
}
30+
31+
enum T3 {
32+
>T3 : Symbol(T3, Decl(enumConstantMemberWithString.ts, 11, 1))
33+
34+
a = "1",
35+
>a : Symbol(T3.a, Decl(enumConstantMemberWithString.ts, 13, 9))
36+
37+
b = "1" + "2",
38+
>b : Symbol(T3.b, Decl(enumConstantMemberWithString.ts, 14, 12))
39+
40+
c = 1,
41+
>c : Symbol(T3.c, Decl(enumConstantMemberWithString.ts, 15, 18))
42+
43+
d = 1 + 2
44+
>d : Symbol(T3.d, Decl(enumConstantMemberWithString.ts, 16, 10))
45+
}
46+
47+
enum T4 {
48+
>T4 : Symbol(T4, Decl(enumConstantMemberWithString.ts, 18, 1))
49+
50+
a = "1"
51+
>a : Symbol(T4.a, Decl(enumConstantMemberWithString.ts, 20, 9))
52+
}
53+
54+
enum T5 {
55+
>T5 : Symbol(T5, Decl(enumConstantMemberWithString.ts, 22, 1))
56+
57+
a = "1" + "2"
58+
>a : Symbol(T5.a, Decl(enumConstantMemberWithString.ts, 24, 9))
59+
}
60+
61+
declare enum T6 {
62+
>T6 : Symbol(T6, Decl(enumConstantMemberWithString.ts, 26, 1))
63+
64+
a = "1",
65+
>a : Symbol(T6.a, Decl(enumConstantMemberWithString.ts, 28, 17))
66+
67+
b = "1" + "2"
68+
>b : Symbol(T6.b, Decl(enumConstantMemberWithString.ts, 29, 12))
69+
}
70+
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
=== tests/cases/conformance/enums/enumConstantMemberWithString.ts ===
2+
enum T1 {
3+
>T1 : T1
4+
5+
a = "1",
6+
>a : T1.a
7+
>"1" : "1"
8+
9+
b = "1" + "2",
10+
>b : T1.b
11+
>"1" + "2" : string
12+
>"1" : "1"
13+
>"2" : "2"
14+
15+
c = "1" + "2" + "3",
16+
>c : T1.c
17+
>"1" + "2" + "3" : string
18+
>"1" + "2" : string
19+
>"1" : "1"
20+
>"2" : "2"
21+
>"3" : "3"
22+
23+
d = "a" - "a",
24+
>d : T1.d
25+
>"a" - "a" : number
26+
>"a" : "a"
27+
>"a" : "a"
28+
29+
e = "a" + 1
30+
>e : T1.d
31+
>"a" + 1 : string
32+
>"a" : "a"
33+
>1 : 1
34+
}
35+
36+
enum T2 {
37+
>T2 : T2
38+
39+
a = "1",
40+
>a : T2.a
41+
>"1" : "1"
42+
43+
b = "1" + "2"
44+
>b : T2.b
45+
>"1" + "2" : string
46+
>"1" : "1"
47+
>"2" : "2"
48+
}
49+
50+
enum T3 {
51+
>T3 : T3
52+
53+
a = "1",
54+
>a : T3.a
55+
>"1" : "1"
56+
57+
b = "1" + "2",
58+
>b : T3.b
59+
>"1" + "2" : string
60+
>"1" : "1"
61+
>"2" : "2"
62+
63+
c = 1,
64+
>c : T3.c
65+
>1 : 1
66+
67+
d = 1 + 2
68+
>d : T3.d
69+
>1 + 2 : number
70+
>1 : 1
71+
>2 : 2
72+
}
73+
74+
enum T4 {
75+
>T4 : T4
76+
77+
a = "1"
78+
>a : T4
79+
>"1" : "1"
80+
}
81+
82+
enum T5 {
83+
>T5 : T5
84+
85+
a = "1" + "2"
86+
>a : T5
87+
>"1" + "2" : string
88+
>"1" : "1"
89+
>"2" : "2"
90+
}
91+
92+
declare enum T6 {
93+
>T6 : T6
94+
95+
a = "1",
96+
>a : T6.a
97+
>"1" : "1"
98+
99+
b = "1" + "2"
100+
>b : T6.b
101+
>"1" + "2" : string
102+
>"1" : "1"
103+
>"2" : "2"
104+
}
105+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
enum T1 {
2+
a = "1",
3+
b = "1" + "2",
4+
c = "1" + "2" + "3",
5+
d = "a" - "a",
6+
e = "a" + 1
7+
}
8+
9+
enum T2 {
10+
a = "1",
11+
b = "1" + "2"
12+
}
13+
14+
enum T3 {
15+
a = "1",
16+
b = "1" + "2",
17+
c = 1,
18+
d = 1 + 2
19+
}
20+
21+
enum T4 {
22+
a = "1"
23+
}
24+
25+
enum T5 {
26+
a = "1" + "2"
27+
}
28+
29+
declare enum T6 {
30+
a = "1",
31+
b = "1" + "2"
32+
}

0 commit comments

Comments
 (0)