Skip to content

Commit 79272d7

Browse files
committed
Merge pull request #2199 from Microsoft/enumCleanup
Fixes #2183, #1797
2 parents 3e7e9f4 + b82fd59 commit 79272d7

File tree

126 files changed

+968
-977
lines changed

Some content is hidden

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

126 files changed

+968
-977
lines changed

src/compiler/checker.ts

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9805,7 +9805,7 @@ module ts {
98059805
}
98069806
let initializer = member.initializer;
98079807
if (initializer) {
9808-
autoValue = getConstantValueForEnumMemberInitializer(initializer, enumIsConst);
9808+
autoValue = getConstantValueForEnumMemberInitializer(initializer);
98099809
if (autoValue === undefined) {
98109810
if (enumIsConst) {
98119811
error(initializer, Diagnostics.In_const_enum_declarations_member_initializer_must_be_constant_expression);
@@ -9840,7 +9840,7 @@ module ts {
98409840
nodeLinks.flags |= NodeCheckFlags.EnumValuesComputed;
98419841
}
98429842

9843-
function getConstantValueForEnumMemberInitializer(initializer: Expression, enumIsConst: boolean): number {
9843+
function getConstantValueForEnumMemberInitializer(initializer: Expression): number {
98449844
return evalConstant(initializer);
98459845

98469846
function evalConstant(e: Node): number {
@@ -9853,14 +9853,10 @@ module ts {
98539853
switch ((<PrefixUnaryExpression>e).operator) {
98549854
case SyntaxKind.PlusToken: return value;
98559855
case SyntaxKind.MinusToken: return -value;
9856-
case SyntaxKind.TildeToken: return enumIsConst ? ~value : undefined;
9856+
case SyntaxKind.TildeToken: return ~value;
98579857
}
98589858
return undefined;
98599859
case SyntaxKind.BinaryExpression:
9860-
if (!enumIsConst) {
9861-
return undefined;
9862-
}
9863-
98649860
let left = evalConstant((<BinaryExpression>e).left);
98659861
if (left === undefined) {
98669862
return undefined;
@@ -9886,14 +9882,10 @@ module ts {
98869882
case SyntaxKind.NumericLiteral:
98879883
return +(<LiteralExpression>e).text;
98889884
case SyntaxKind.ParenthesizedExpression:
9889-
return enumIsConst ? evalConstant((<ParenthesizedExpression>e).expression) : undefined;
9885+
return evalConstant((<ParenthesizedExpression>e).expression);
98909886
case SyntaxKind.Identifier:
98919887
case SyntaxKind.ElementAccessExpression:
98929888
case SyntaxKind.PropertyAccessExpression:
9893-
if (!enumIsConst) {
9894-
return undefined;
9895-
}
9896-
98979889
let member = initializer.parent;
98989890
let currentType = getTypeOfSymbol(getSymbolOfNode(member.parent));
98999891
let enumType: Type;
@@ -9906,30 +9898,50 @@ module ts {
99069898
propertyName = (<Identifier>e).text;
99079899
}
99089900
else {
9901+
let expression: Expression;
99099902
if (e.kind === SyntaxKind.ElementAccessExpression) {
99109903
if ((<ElementAccessExpression>e).argumentExpression === undefined ||
99119904
(<ElementAccessExpression>e).argumentExpression.kind !== SyntaxKind.StringLiteral) {
99129905
return undefined;
99139906
}
9914-
enumType = getTypeOfNode((<ElementAccessExpression>e).expression);
9907+
expression = (<ElementAccessExpression>e).expression;
99159908
propertyName = (<LiteralExpression>(<ElementAccessExpression>e).argumentExpression).text;
99169909
}
99179910
else {
9918-
enumType = getTypeOfNode((<PropertyAccessExpression>e).expression);
9911+
expression = (<PropertyAccessExpression>e).expression;
99199912
propertyName = (<PropertyAccessExpression>e).name.text;
99209913
}
9921-
if (enumType !== currentType) {
9914+
9915+
// expression part in ElementAccess\PropertyAccess should be either identifier or dottedName
9916+
var current = expression;
9917+
while (current) {
9918+
if (current.kind === SyntaxKind.Identifier) {
9919+
break;
9920+
}
9921+
else if (current.kind === SyntaxKind.PropertyAccessExpression) {
9922+
current = (<ElementAccessExpression>current).expression;
9923+
}
9924+
else {
9925+
return undefined;
9926+
}
9927+
}
9928+
9929+
enumType = checkExpression(expression);
9930+
// allow references to constant members of other enums
9931+
if (!(enumType.symbol && (enumType.symbol.flags & SymbolFlags.Enum))) {
99229932
return undefined;
99239933
}
99249934
}
99259935

99269936
if (propertyName === undefined) {
99279937
return undefined;
99289938
}
9939+
99299940
let property = getPropertyOfObjectType(enumType, propertyName);
99309941
if (!property || !(property.flags & SymbolFlags.EnumMember)) {
99319942
return undefined;
99329943
}
9944+
99339945
let propertyDecl = property.valueDeclaration;
99349946
// self references are illegal
99359947
if (member === propertyDecl) {
@@ -9940,6 +9952,7 @@ module ts {
99409952
if (!isDefinedBefore(propertyDecl, member)) {
99419953
return undefined;
99429954
}
9955+
99439956
return <number>getNodeLinks(propertyDecl).enumMemberValue;
99449957
}
99459958
}
@@ -11190,10 +11203,9 @@ module ts {
1119011203

1119111204
let symbol = getNodeLinks(node).resolvedSymbol;
1119211205
if (symbol && (symbol.flags & SymbolFlags.EnumMember)) {
11193-
let declaration = symbol.valueDeclaration;
11194-
let constantValue: number;
11195-
if (declaration.kind === SyntaxKind.EnumMember) {
11196-
return getEnumMemberValue(<EnumMember>declaration);
11206+
// inline property\index accesses only for const enums
11207+
if (isConstEnumDeclaration(symbol.valueDeclaration.parent)) {
11208+
return getEnumMemberValue(<EnumMember>symbol.valueDeclaration);
1119711209
}
1119811210
}
1119911211

src/compiler/emitter.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3545,15 +3545,12 @@ module ts {
35453545
}
35463546

35473547
function writeEnumMemberDeclarationValue(member: EnumMember) {
3548-
if (!member.initializer || isConst(member.parent)) {
3549-
let value = resolver.getConstantValue(member);
3550-
if (value !== undefined) {
3551-
write(value.toString());
3552-
return;
3553-
}
3548+
let value = resolver.getConstantValue(member);
3549+
if (value !== undefined) {
3550+
write(value.toString());
3551+
return;
35543552
}
3555-
3556-
if (member.initializer) {
3553+
else if (member.initializer) {
35573554
emit(member.initializer);
35583555
}
35593556
else {

tests/baselines/reference/EnumAndModuleWithSameNameAndCommonRoot.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,6 @@ var enumdule;
3434
enumdule.Point = Point;
3535
})(enumdule || (enumdule = {}));
3636
var x;
37-
var x = 0 /* Red */;
37+
var x = enumdule.Red;
3838
var y;
3939
var y = new enumdule.Point(0, 0);

tests/baselines/reference/ModuleAndEnumWithSameNameAndCommonRoot.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,6 @@ var enumdule;
3434
enumdule[enumdule["Blue"] = 1] = "Blue";
3535
})(enumdule || (enumdule = {}));
3636
var x;
37-
var x = 0 /* Red */;
37+
var x = enumdule.Red;
3838
var y;
3939
var y = new enumdule.Point(0, 0);

tests/baselines/reference/ModuleWithExportedAndNonExportedEnums.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ var A;
2626
})(Day || (Day = {}));
2727
})(A || (A = {}));
2828
// not an error since exported
29-
var a = 0 /* Red */;
29+
var a = A.Color.Red;
3030
// error not exported
3131
var b = A.Day.Monday;

tests/baselines/reference/additionOperatorWithAnyAndEveryType.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ var r11 = a + foo();
8181
var r12 = a + C;
8282
var r13 = a + new C();
8383
var r14 = a + E;
84-
var r15 = a + 0 /* a */;
84+
var r15 = a + E.a;
8585
var r16 = a + M;
8686
var r17 = a + '';
8787
var r18 = a + 123;

tests/baselines/reference/additionOperatorWithInvalidOperands.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,6 @@ var r14 = b + d;
8585
var r15 = b + foo;
8686
var r16 = b + foo();
8787
var r17 = b + C;
88-
var r18 = 0 /* a */ + new C();
89-
var r19 = 0 /* a */ + C.foo();
90-
var r20 = 0 /* a */ + M;
88+
var r18 = E.a + new C();
89+
var r19 = E.a + C.foo();
90+
var r20 = E.a + M;

tests/baselines/reference/additionOperatorWithNullValueAndValidOperator.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,13 @@ var r2 = a + null;
4949
var r3 = null + b;
5050
var r4 = null + 1;
5151
var r5 = null + c;
52-
var r6 = null + 0 /* a */;
53-
var r7 = null + 0 /* 'a' */;
52+
var r6 = null + E.a;
53+
var r7 = null + E['a'];
5454
var r8 = b + null;
5555
var r9 = 1 + null;
5656
var r10 = c + null;
57-
var r11 = 0 /* a */ + null;
58-
var r12 = 0 /* 'a' */ + null;
57+
var r11 = E.a + null;
58+
var r12 = E['a'] + null;
5959
// null + string
6060
var r13 = null + d;
6161
var r14 = null + '';

tests/baselines/reference/additionOperatorWithNumberAndEnum.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ var r2 = a + b;
4343
var r3 = b + a;
4444
var r4 = b + b;
4545
var r5 = 0 + a;
46-
var r6 = 0 /* a */ + 0;
47-
var r7 = 0 /* a */ + 1 /* b */;
48-
var r8 = 0 /* 'a' */ + 1 /* 'b' */;
49-
var r9 = 0 /* 'a' */ + 0 /* 'c' */;
46+
var r6 = E.a + 0;
47+
var r7 = E.a + E.b;
48+
var r8 = E['a'] + E['b'];
49+
var r9 = E['a'] + F['c'];
5050
var r10 = a + c;
5151
var r11 = c + a;
5252
var r12 = b + c;

tests/baselines/reference/additionOperatorWithStringAndEveryType.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ var r13 = f + x;
7272
var r14 = g + x;
7373
// other cases
7474
var r15 = x + E;
75-
var r16 = x + 0 /* a */;
75+
var r16 = x + E.a;
7676
var r17 = x + '';
7777
var r18 = x + 0;
7878
var r19 = x + {

tests/baselines/reference/additionOperatorWithUndefinedValueAndValidOperator.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,13 @@ var r2 = a + undefined;
4949
var r3 = undefined + b;
5050
var r4 = undefined + 1;
5151
var r5 = undefined + c;
52-
var r6 = undefined + 0 /* a */;
53-
var r7 = undefined + 0 /* 'a' */;
52+
var r6 = undefined + E.a;
53+
var r7 = undefined + E['a'];
5454
var r8 = b + undefined;
5555
var r9 = 1 + undefined;
5656
var r10 = c + undefined;
57-
var r11 = 0 /* a */ + undefined;
58-
var r12 = 0 /* 'a' */ + undefined;
57+
var r11 = E.a + undefined;
58+
var r12 = E['a'] + undefined;
5959
// undefined + string
6060
var r13 = undefined + d;
6161
var r14 = undefined + '';

tests/baselines/reference/amdImportAsPrimaryExpression.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@ define(["require", "exports"], function (require, exports) {
2323
});
2424
//// [foo_1.js]
2525
define(["require", "exports", "./foo_0"], function (require, exports, foo) {
26-
if (0 /* A */ === 0) {
26+
if (foo.E1.A === 0) {
2727
}
2828
});

0 commit comments

Comments
 (0)