Skip to content

Commit bdac6ca

Browse files
committed
Merge pull request #841 from chrisbubernak/disallowNumericEnumMembers
Fix for issue #134 (Disallow numeric enum members)
2 parents 50ff899 + 708ddf1 commit bdac6ca

File tree

48 files changed

+462
-433
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+462
-433
lines changed

src/compiler/checker.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4084,7 +4084,7 @@ module ts {
40844084
}
40854085

40864086
function isNumericName(name: string) {
4087-
return !isNaN(<number><any>name);
4087+
return (name !== "") && !isNaN(<number><any>name);
40884088
}
40894089

40904090
function checkObjectLiteral(node: ObjectLiteral, contextualMapper?: TypeMapper): Type {
@@ -6643,6 +6643,9 @@ module ts {
66436643
var ambient = isInAmbientContext(node);
66446644

66456645
forEach(node.members, member => {
6646+
if(isNumericName(member.name.text)) {
6647+
error(member.name, Diagnostics.An_enum_member_cannot_have_a_numeric_name);
6648+
}
66466649
var initializer = member.initializer;
66476650
if (initializer) {
66486651
autoValue = getConstantValueForExpression(initializer);

src/compiler/diagnosticInformationMap.generated.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ module ts {
114114
Cannot_compile_external_modules_unless_the_module_flag_is_provided: { code: 1148, category: DiagnosticCategory.Error, key: "Cannot compile external modules unless the '--module' flag is provided." },
115115
Filename_0_differs_from_already_included_filename_1_only_in_casing: { code: 1149, category: DiagnosticCategory.Error, key: "Filename '{0}' differs from already included filename '{1}' only in casing" },
116116
new_T_cannot_be_used_to_create_an_array_Use_new_Array_T_instead: { code: 1150, category: DiagnosticCategory.Error, key: "'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead." },
117+
An_enum_member_cannot_have_a_numeric_name: { code: 1151, category: DiagnosticCategory.Error, key: "An enum member cannot have a numeric name." },
117118
Duplicate_identifier_0: { code: 2300, category: DiagnosticCategory.Error, key: "Duplicate identifier '{0}'." },
118119
Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: { code: 2301, category: DiagnosticCategory.Error, key: "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor." },
119120
Static_members_cannot_reference_class_type_parameters: { code: 2302, category: DiagnosticCategory.Error, key: "Static members cannot reference class type parameters." },

src/compiler/diagnosticMessages.json

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"category": "Error",
1212
"code": 1005
1313
},
14-
"A file cannot have a reference to itself.": {
14+
"A file cannot have a reference to itself.": {
1515
"category": "Error",
1616
"code": 1006
1717
},
@@ -187,7 +187,7 @@
187187
"category": "Error",
188188
"code": 1066
189189
},
190-
"Unexpected token. A constructor, method, accessor, or property was expected." : {
190+
"Unexpected token. A constructor, method, accessor, or property was expected.": {
191191
"category": "Error",
192192
"code": 1068
193193
},
@@ -444,9 +444,13 @@
444444
"code": 1149
445445
},
446446
"'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead.": {
447-
"category": "Error",
448-
"code": 1150
449-
},
447+
"category": "Error",
448+
"code": 1150
449+
},
450+
"An enum member cannot have a numeric name.": {
451+
"category": "Error",
452+
"code": 1151
453+
},
450454

451455
"Duplicate identifier '{0}'.": {
452456
"category": "Error",
@@ -556,7 +560,7 @@
556560
"category": "Error",
557561
"code": 2326
558562
},
559-
"Property '{0}' is optional in type '{1}' but required in type '{2}'.": {
563+
"Property '{0}' is optional in type '{1}' but required in type '{2}'.": {
560564
"category": "Error",
561565
"code": 2327
562566
},
Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,40 @@
11
//// [bitwiseNotOperatorWithEnumType.ts]
22
// ~ operator on enum type
33

4-
enum ENUM1 { 1, 2, "" };
4+
enum ENUM1 { A, B, "" };
55

66
// enum type var
77
var ResultIsNumber1 = ~ENUM1;
88

99
// enum type expressions
10-
var ResultIsNumber2 = ~ENUM1[1];
11-
var ResultIsNumber3 = ~(ENUM1[1] + ENUM1[2]);
10+
var ResultIsNumber2 = ~ENUM1["A"];
11+
var ResultIsNumber3 = ~(ENUM1.A + ENUM1["B"]);
1212

1313
// multiple ~ operators
14-
var ResultIsNumber4 = ~~~(ENUM1[1] + ENUM1[2]);
14+
var ResultIsNumber4 = ~~~(ENUM1["A"] + ENUM1.B);
1515

1616
// miss assignment operators
1717
~ENUM1;
18-
~ENUM1[1];
19-
~ENUM1[1], ~ENUM1[2];
18+
~ENUM1["A"];
19+
~ENUM1.A, ~ENUM1["B"];
2020

2121
//// [bitwiseNotOperatorWithEnumType.js]
2222
// ~ operator on enum type
2323
var ENUM1;
2424
(function (ENUM1) {
25-
ENUM1[ENUM1["1"] = 0] = "1";
26-
ENUM1[ENUM1["2"] = 1] = "2";
25+
ENUM1[ENUM1["A"] = 0] = "A";
26+
ENUM1[ENUM1["B"] = 1] = "B";
2727
ENUM1[ENUM1[""] = 2] = "";
2828
})(ENUM1 || (ENUM1 = {}));
2929
;
3030
// enum type var
3131
var ResultIsNumber1 = ~ENUM1;
3232
// enum type expressions
33-
var ResultIsNumber2 = ~ENUM1[1];
34-
var ResultIsNumber3 = ~(ENUM1[1] + ENUM1[2]);
33+
var ResultIsNumber2 = ~ENUM1["A"];
34+
var ResultIsNumber3 = ~(0 /* A */ + ENUM1["B"]);
3535
// multiple ~ operators
36-
var ResultIsNumber4 = ~~~(ENUM1[1] + ENUM1[2]);
36+
var ResultIsNumber4 = ~~~(ENUM1["A"] + 1 /* B */);
3737
// miss assignment operators
3838
~ENUM1;
39-
~ENUM1[1];
40-
~ENUM1[1], ~ENUM1[2];
39+
~ENUM1["A"];
40+
~0 /* A */, ~ENUM1["B"];
Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
=== tests/cases/conformance/expressions/unaryOperators/bitwiseNotOperator/bitwiseNotOperatorWithEnumType.ts ===
22
// ~ operator on enum type
33

4-
enum ENUM1 { 1, 2, "" };
4+
enum ENUM1 { A, B, "" };
55
>ENUM1 : ENUM1
6+
>A : ENUM1
7+
>B : ENUM1
68

79
// enum type var
810
var ResultIsNumber1 = ~ENUM1;
@@ -11,51 +13,54 @@ var ResultIsNumber1 = ~ENUM1;
1113
>ENUM1 : typeof ENUM1
1214

1315
// enum type expressions
14-
var ResultIsNumber2 = ~ENUM1[1];
16+
var ResultIsNumber2 = ~ENUM1["A"];
1517
>ResultIsNumber2 : number
16-
>~ENUM1[1] : number
17-
>ENUM1[1] : ENUM1
18+
>~ENUM1["A"] : number
19+
>ENUM1["A"] : ENUM1
1820
>ENUM1 : typeof ENUM1
1921

20-
var ResultIsNumber3 = ~(ENUM1[1] + ENUM1[2]);
22+
var ResultIsNumber3 = ~(ENUM1.A + ENUM1["B"]);
2123
>ResultIsNumber3 : number
22-
>~(ENUM1[1] + ENUM1[2]) : number
23-
>(ENUM1[1] + ENUM1[2]) : number
24-
>ENUM1[1] + ENUM1[2] : number
25-
>ENUM1[1] : ENUM1
24+
>~(ENUM1.A + ENUM1["B"]) : number
25+
>(ENUM1.A + ENUM1["B"]) : number
26+
>ENUM1.A + ENUM1["B"] : number
27+
>ENUM1.A : ENUM1
2628
>ENUM1 : typeof ENUM1
27-
>ENUM1[2] : ENUM1
29+
>A : ENUM1
30+
>ENUM1["B"] : ENUM1
2831
>ENUM1 : typeof ENUM1
2932

3033
// multiple ~ operators
31-
var ResultIsNumber4 = ~~~(ENUM1[1] + ENUM1[2]);
34+
var ResultIsNumber4 = ~~~(ENUM1["A"] + ENUM1.B);
3235
>ResultIsNumber4 : number
33-
>~~~(ENUM1[1] + ENUM1[2]) : number
34-
>~~(ENUM1[1] + ENUM1[2]) : number
35-
>~(ENUM1[1] + ENUM1[2]) : number
36-
>(ENUM1[1] + ENUM1[2]) : number
37-
>ENUM1[1] + ENUM1[2] : number
38-
>ENUM1[1] : ENUM1
36+
>~~~(ENUM1["A"] + ENUM1.B) : number
37+
>~~(ENUM1["A"] + ENUM1.B) : number
38+
>~(ENUM1["A"] + ENUM1.B) : number
39+
>(ENUM1["A"] + ENUM1.B) : number
40+
>ENUM1["A"] + ENUM1.B : number
41+
>ENUM1["A"] : ENUM1
3942
>ENUM1 : typeof ENUM1
40-
>ENUM1[2] : ENUM1
43+
>ENUM1.B : ENUM1
4144
>ENUM1 : typeof ENUM1
45+
>B : ENUM1
4246

4347
// miss assignment operators
4448
~ENUM1;
4549
>~ENUM1 : number
4650
>ENUM1 : typeof ENUM1
4751

48-
~ENUM1[1];
49-
>~ENUM1[1] : number
50-
>ENUM1[1] : ENUM1
52+
~ENUM1["A"];
53+
>~ENUM1["A"] : number
54+
>ENUM1["A"] : ENUM1
5155
>ENUM1 : typeof ENUM1
5256

53-
~ENUM1[1], ~ENUM1[2];
54-
>~ENUM1[1], ~ENUM1[2] : number
55-
>~ENUM1[1] : number
56-
>ENUM1[1] : ENUM1
57+
~ENUM1.A, ~ENUM1["B"];
58+
>~ENUM1.A, ~ENUM1["B"] : number
59+
>~ENUM1.A : number
60+
>ENUM1.A : ENUM1
5761
>ENUM1 : typeof ENUM1
58-
>~ENUM1[2] : number
59-
>ENUM1[2] : ENUM1
62+
>A : ENUM1
63+
>~ENUM1["B"] : number
64+
>ENUM1["B"] : ENUM1
6065
>ENUM1 : typeof ENUM1
6166

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumType.ts(7,23): error TS2357: The operand of an increment or decrement operator must be a variable, property or indexer.
2+
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumType.ts(12,1): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
3+
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumType.ts(12,7): error TS2304: Cannot find name 'A'.
4+
5+
6+
==== tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumType.ts (3 errors) ====
7+
// -- operator on enum type
8+
9+
enum ENUM1 { A, B, "" };
10+
11+
// expression
12+
var ResultIsNumber1 = --ENUM1["A"];
13+
var ResultIsNumber2 = ENUM1.A--;
14+
~~~~~~~
15+
!!! error TS2357: The operand of an increment or decrement operator must be a variable, property or indexer.
16+
17+
// miss assignment operator
18+
--ENUM1["A"];
19+
20+
ENUM1[A]--;
21+
~~~~~~~~
22+
!!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
23+
~
24+
!!! error TS2304: Cannot find name 'A'.
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
//// [decrementOperatorWithEnumType.ts]
22
// -- operator on enum type
33

4-
enum ENUM1 { 1, 2, "" };
4+
enum ENUM1 { A, B, "" };
55

66
// expression
7-
var ResultIsNumber1 = --ENUM1[1];
8-
var ResultIsNumber2 = ENUM1[1]--;
7+
var ResultIsNumber1 = --ENUM1["A"];
8+
var ResultIsNumber2 = ENUM1.A--;
99

1010
// miss assignment operator
11-
--ENUM1[1];
11+
--ENUM1["A"];
1212

13-
ENUM1[1]--;
13+
ENUM1[A]--;
1414

1515
//// [decrementOperatorWithEnumType.js]
1616
// -- operator on enum type
1717
var ENUM1;
1818
(function (ENUM1) {
19-
ENUM1[ENUM1["1"] = 0] = "1";
20-
ENUM1[ENUM1["2"] = 1] = "2";
19+
ENUM1[ENUM1["A"] = 0] = "A";
20+
ENUM1[ENUM1["B"] = 1] = "B";
2121
ENUM1[ENUM1[""] = 2] = "";
2222
})(ENUM1 || (ENUM1 = {}));
2323
;
2424
// expression
25-
var ResultIsNumber1 = --ENUM1[1];
26-
var ResultIsNumber2 = ENUM1[1]--;
25+
var ResultIsNumber1 = --ENUM1["A"];
26+
var ResultIsNumber2 = 0 /* A */--;
2727
// miss assignment operator
28-
--ENUM1[1];
29-
ENUM1[1]--;
28+
--ENUM1["A"];
29+
ENUM1[A]--;

tests/baselines/reference/decrementOperatorWithEnumType.types

Lines changed: 0 additions & 30 deletions
This file was deleted.

tests/baselines/reference/decrementOperatorWithEnumTypeInvalidOperations.errors.txt

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,21 @@ tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOp
22
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts(8,25): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
33
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts(10,23): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
44
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts(11,23): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
5-
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts(14,25): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
6-
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts(15,23): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
5+
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts(14,25): error TS2357: The operand of an increment or decrement operator must be a variable, property or indexer.
6+
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts(14,43): error TS2339: Property 'B' does not exist on type 'typeof ENUM'.
7+
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts(15,23): error TS2357: The operand of an increment or decrement operator must be a variable, property or indexer.
8+
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts(15,29): error TS2339: Property 'A' does not exist on type 'typeof ENUM'.
79
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts(18,3): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
810
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts(19,3): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
911
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts(21,1): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
1012
tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts(22,1): error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
1113

1214

13-
==== tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts (10 errors) ====
15+
==== tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOperatorWithEnumTypeInvalidOperations.ts (12 errors) ====
1416
// -- operator on enum type
1517

1618
enum ENUM { };
17-
enum ENUM1 { 1, 2, "" };
19+
enum ENUM1 { A, B, "" };
1820

1921
// enum type var
2022
var ResultIsNumber1 = --ENUM;
@@ -32,12 +34,16 @@ tests/cases/conformance/expressions/unaryOperators/decrementOperator/decrementOp
3234
!!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
3335

3436
// enum type expressions
35-
var ResultIsNumber5 = --(ENUM[1] + ENUM[2]);
36-
~~~~~~~~~~~~~~~~~~~
37-
!!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
38-
var ResultIsNumber6 = (ENUM[1] + ENUM[2])--;
39-
~~~~~~~~~~~~~~~~~~~
40-
!!! error TS2356: An arithmetic operand must be of type 'any', 'number' or an enum type.
37+
var ResultIsNumber5 = --(ENUM["A"] + ENUM.B);
38+
~~~~~~~~~~~~~~~~~~~~
39+
!!! error TS2357: The operand of an increment or decrement operator must be a variable, property or indexer.
40+
~
41+
!!! error TS2339: Property 'B' does not exist on type 'typeof ENUM'.
42+
var ResultIsNumber6 = (ENUM.A + ENUM["B"])--;
43+
~~~~~~~~~~~~~~~~~~~~
44+
!!! error TS2357: The operand of an increment or decrement operator must be a variable, property or indexer.
45+
~
46+
!!! error TS2339: Property 'A' does not exist on type 'typeof ENUM'.
4147

4248
// miss assignment operator
4349
--ENUM;

0 commit comments

Comments
 (0)