Skip to content

Commit 03d9f72

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

6 files changed

+309
-0
lines changed

src/compiler/checker.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4987,6 +4987,11 @@ namespace ts {
49874987
(<PrefixUnaryExpression>expr).operand.kind === SyntaxKind.NumericLiteral;
49884988
case SyntaxKind.Identifier:
49894989
return nodeIsMissing(expr) || !!getSymbolOfNode(member.parent).exports.get((<Identifier>expr).escapedText);
4990+
case SyntaxKind.BinaryExpression:
4991+
const binaryExpression = <BinaryExpression>expr;
4992+
const left = binaryExpression.left;
4993+
const right = binaryExpression.right;
4994+
return left.kind === SyntaxKind.StringLiteral && right.kind === SyntaxKind.StringLiteral;
49904995
default:
49914996
return false;
49924997
}
@@ -22962,6 +22967,9 @@ namespace ts {
2296222967
case SyntaxKind.AsteriskAsteriskToken: return left ** right;
2296322968
}
2296422969
}
22970+
else if (typeof left === "string" && typeof right === "string" && (<BinaryExpression>expr).operatorToken.kind === SyntaxKind.PlusToken) {
22971+
return left + right;
22972+
}
2296522973
break;
2296622974
case SyntaxKind.StringLiteral:
2296722975
return (<StringLiteral>expr).text;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
tests/cases/conformance/enums/enumConstantMemberWithString.ts(4,9): error TS2553: Computed values are not permitted in an enum with string valued members.
2+
tests/cases/conformance/enums/enumConstantMemberWithString.ts(5,9): error TS2553: Computed values are not permitted in an enum with string valued members.
3+
tests/cases/conformance/enums/enumConstantMemberWithString.ts(17,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 = "a" - "a",
11+
~~~~~~~~~
12+
!!! error TS2553: Computed values are not permitted in an enum with string valued members.
13+
d = "a" + 1
14+
~~~~~~~
15+
!!! error TS2553: Computed values are not permitted in an enum with string valued members.
16+
}
17+
18+
enum T2 {
19+
a = "1",
20+
b = "1" + "2"
21+
}
22+
23+
enum T3 {
24+
a = "1",
25+
b = "1" + "2",
26+
c = 1,
27+
d = 1 + 2
28+
~~~~~
29+
!!! error TS2553: Computed values are not permitted in an enum with string valued members.
30+
}
31+
32+
enum T4 {
33+
a = "1"
34+
}
35+
36+
enum T5 {
37+
a = "1" + "2"
38+
}
39+
40+
declare enum T6 {
41+
a = "1",
42+
b = "1" + "2"
43+
}
44+
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
//// [enumConstantMemberWithString.ts]
2+
enum T1 {
3+
a = "1",
4+
b = "1" + "2",
5+
c = "a" - "a",
6+
d = "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+
}
33+
34+
35+
//// [enumConstantMemberWithString.js]
36+
var T1;
37+
(function (T1) {
38+
T1["a"] = "1";
39+
T1["b"] = "12";
40+
T1[T1["c"] = 0] = "c";
41+
T1[T1["d"] = 0] = "d";
42+
})(T1 || (T1 = {}));
43+
var T2;
44+
(function (T2) {
45+
T2["a"] = "1";
46+
T2["b"] = "12";
47+
})(T2 || (T2 = {}));
48+
var T3;
49+
(function (T3) {
50+
T3["a"] = "1";
51+
T3["b"] = "12";
52+
T3[T3["c"] = 1] = "c";
53+
T3[T3["d"] = 0] = "d";
54+
})(T3 || (T3 = {}));
55+
var T4;
56+
(function (T4) {
57+
T4["a"] = "1";
58+
})(T4 || (T4 = {}));
59+
var T5;
60+
(function (T5) {
61+
T5["a"] = "12";
62+
})(T5 || (T5 = {}));
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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 = "a" - "a",
12+
>c : Symbol(T1.c, Decl(enumConstantMemberWithString.ts, 2, 18))
13+
14+
d = "a" + 1
15+
>d : Symbol(T1.d, Decl(enumConstantMemberWithString.ts, 3, 18))
16+
}
17+
18+
enum T2 {
19+
>T2 : Symbol(T2, Decl(enumConstantMemberWithString.ts, 5, 1))
20+
21+
a = "1",
22+
>a : Symbol(T2.a, Decl(enumConstantMemberWithString.ts, 7, 9))
23+
24+
b = "1" + "2"
25+
>b : Symbol(T2.b, Decl(enumConstantMemberWithString.ts, 8, 12))
26+
}
27+
28+
enum T3 {
29+
>T3 : Symbol(T3, Decl(enumConstantMemberWithString.ts, 10, 1))
30+
31+
a = "1",
32+
>a : Symbol(T3.a, Decl(enumConstantMemberWithString.ts, 12, 9))
33+
34+
b = "1" + "2",
35+
>b : Symbol(T3.b, Decl(enumConstantMemberWithString.ts, 13, 12))
36+
37+
c = 1,
38+
>c : Symbol(T3.c, Decl(enumConstantMemberWithString.ts, 14, 18))
39+
40+
d = 1 + 2
41+
>d : Symbol(T3.d, Decl(enumConstantMemberWithString.ts, 15, 10))
42+
}
43+
44+
enum T4 {
45+
>T4 : Symbol(T4, Decl(enumConstantMemberWithString.ts, 17, 1))
46+
47+
a = "1"
48+
>a : Symbol(T4.a, Decl(enumConstantMemberWithString.ts, 19, 9))
49+
}
50+
51+
enum T5 {
52+
>T5 : Symbol(T5, Decl(enumConstantMemberWithString.ts, 21, 1))
53+
54+
a = "1" + "2"
55+
>a : Symbol(T5.a, Decl(enumConstantMemberWithString.ts, 23, 9))
56+
}
57+
58+
declare enum T6 {
59+
>T6 : Symbol(T6, Decl(enumConstantMemberWithString.ts, 25, 1))
60+
61+
a = "1",
62+
>a : Symbol(T6.a, Decl(enumConstantMemberWithString.ts, 27, 17))
63+
64+
b = "1" + "2"
65+
>b : Symbol(T6.b, Decl(enumConstantMemberWithString.ts, 28, 12))
66+
}
67+
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
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 = "a" - "a",
16+
>c : T1.c
17+
>"a" - "a" : number
18+
>"a" : "a"
19+
>"a" : "a"
20+
21+
d = "a" + 1
22+
>d : T1.c
23+
>"a" + 1 : string
24+
>"a" : "a"
25+
>1 : 1
26+
}
27+
28+
enum T2 {
29+
>T2 : T2
30+
31+
a = "1",
32+
>a : T2.a
33+
>"1" : "1"
34+
35+
b = "1" + "2"
36+
>b : T2.b
37+
>"1" + "2" : string
38+
>"1" : "1"
39+
>"2" : "2"
40+
}
41+
42+
enum T3 {
43+
>T3 : T3
44+
45+
a = "1",
46+
>a : T3.a
47+
>"1" : "1"
48+
49+
b = "1" + "2",
50+
>b : T3.b
51+
>"1" + "2" : string
52+
>"1" : "1"
53+
>"2" : "2"
54+
55+
c = 1,
56+
>c : T3.c
57+
>1 : 1
58+
59+
d = 1 + 2
60+
>d : T3.d
61+
>1 + 2 : number
62+
>1 : 1
63+
>2 : 2
64+
}
65+
66+
enum T4 {
67+
>T4 : T4
68+
69+
a = "1"
70+
>a : T4
71+
>"1" : "1"
72+
}
73+
74+
enum T5 {
75+
>T5 : T5
76+
77+
a = "1" + "2"
78+
>a : T5
79+
>"1" + "2" : string
80+
>"1" : "1"
81+
>"2" : "2"
82+
}
83+
84+
declare enum T6 {
85+
>T6 : T6
86+
87+
a = "1",
88+
>a : T6.a
89+
>"1" : "1"
90+
91+
b = "1" + "2"
92+
>b : T6.b
93+
>"1" + "2" : string
94+
>"1" : "1"
95+
>"2" : "2"
96+
}
97+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
enum T1 {
2+
a = "1",
3+
b = "1" + "2",
4+
c = "a" - "a",
5+
d = "a" + 1
6+
}
7+
8+
enum T2 {
9+
a = "1",
10+
b = "1" + "2"
11+
}
12+
13+
enum T3 {
14+
a = "1",
15+
b = "1" + "2",
16+
c = 1,
17+
d = 1 + 2
18+
}
19+
20+
enum T4 {
21+
a = "1"
22+
}
23+
24+
enum T5 {
25+
a = "1" + "2"
26+
}
27+
28+
declare enum T6 {
29+
a = "1",
30+
b = "1" + "2"
31+
}

0 commit comments

Comments
 (0)