Skip to content

Commit 2d94030

Browse files
committed
inline enum constant values for indexed access when index is string literal
1 parent 0b738e8 commit 2d94030

19 files changed

+56
-46
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5136,6 +5136,7 @@ module ts {
51365136
var name = (<LiteralExpression>node.index).text;
51375137
var prop = getPropertyOfType(objectType, name);
51385138
if (prop) {
5139+
getNodeLinks(node).resolvedSymbol = prop;
51395140
return getTypeOfSymbol(prop);
51405141
}
51415142
}
@@ -8833,7 +8834,7 @@ module ts {
88338834
return getNodeLinks(node).enumMemberValue;
88348835
}
88358836

8836-
function getConstantValue(node: PropertyAccess): number {
8837+
function getConstantValue(node: PropertyAccess | IndexedAccess): number {
88378838
var symbol = getNodeLinks(node).resolvedSymbol;
88388839
if (symbol && (symbol.flags & SymbolFlags.EnumMember)) {
88398840
var declaration = symbol.valueDeclaration;

src/compiler/emitter.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,19 +1031,29 @@ module ts {
10311031
emitTrailingComments(node);
10321032
}
10331033

1034-
function emitPropertyAccess(node: PropertyAccess) {
1034+
function tryEmitConstantValue(node: PropertyAccess | IndexedAccess): boolean {
10351035
var constantValue = resolver.getConstantValue(node);
10361036
if (constantValue !== undefined) {
1037-
write(constantValue.toString() + " /* " + identifierToString(node.right) + " */");
1037+
var propertyName = node.kind === SyntaxKind.PropertyAccess ? identifierToString((<PropertyAccess>node).right) : getTextOfNode((<IndexedAccess>node).index);
1038+
write(constantValue.toString() + " /* " + propertyName + " */");
1039+
return true;
10381040
}
1039-
else {
1040-
emit(node.left);
1041-
write(".");
1042-
emit(node.right);
1041+
return false;
1042+
}
1043+
1044+
function emitPropertyAccess(node: PropertyAccess) {
1045+
if (tryEmitConstantValue(node)) {
1046+
return;
10431047
}
1048+
emit(node.left);
1049+
write(".");
1050+
emit(node.right);
10441051
}
10451052

10461053
function emitIndexedAccess(node: IndexedAccess) {
1054+
if (tryEmitConstantValue(node)) {
1055+
return;
1056+
}
10471057
emit(node.object);
10481058
write("[");
10491059
emit(node.index);

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,7 +774,7 @@ module ts {
774774
isSymbolAccessible(symbol: Symbol, enclosingDeclaration: Node, meaning: SymbolFlags): SymbolAccessiblityResult;
775775
isImportDeclarationEntityNameReferenceDeclarationVisibile(entityName: EntityName): SymbolAccessiblityResult;
776776
// Returns the constant value this property access resolves to, or 'undefined' for a non-constant
777-
getConstantValue(node: PropertyAccess): number;
777+
getConstantValue(node: PropertyAccess | IndexedAccess): number;
778778
hasEarlyErrors(sourceFile?: SourceFile): boolean;
779779
}
780780

tests/baselines/reference/additionOperatorWithNullValueAndValidOperator.js

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

tests/baselines/reference/additionOperatorWithNumberAndEnum.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@ var r4 = b + b;
2929
var r5 = 0 + a;
3030
var r6 = 0 /* a */ + 0;
3131
var r7 = 0 /* a */ + 1 /* b */;
32-
var r8 = E['a'] + E['b'];
32+
var r8 = 0 /* 'a' */ + 1 /* 'b' */;

tests/baselines/reference/additionOperatorWithUndefinedValueAndValidOperator.js

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

tests/baselines/reference/bitwiseNotOperatorWithEnumType.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ var ENUM1;
3030
// enum type var
3131
var ResultIsNumber1 = ~ENUM1;
3232
// enum type expressions
33-
var ResultIsNumber2 = ~ENUM1["A"];
34-
var ResultIsNumber3 = ~(0 /* A */ + ENUM1["B"]);
33+
var ResultIsNumber2 = ~0 /* "A" */;
34+
var ResultIsNumber3 = ~(0 /* A */ + 1 /* "B" */);
3535
// multiple ~ operators
36-
var ResultIsNumber4 = ~~~(ENUM1["A"] + 1 /* B */);
36+
var ResultIsNumber4 = ~~~(0 /* "A" */ + 1 /* B */);
3737
// miss assignment operators
3838
~ENUM1;
39-
~ENUM1["A"];
40-
~0 /* A */, ~ENUM1["B"];
39+
~0 /* "A" */;
40+
~0 /* A */, ~1 /* "B" */;

tests/baselines/reference/constEnums.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ function foo(x: Enum1) {
131131
case Enum1.Q:
132132
case Enum1.R:
133133
case Enum1.S:
134-
case Enum1.T:
134+
case Enum1["T"]:
135135
case Enum1.U:
136136
case Enum1.V:
137137
case Enum1.W:
@@ -203,7 +203,7 @@ function foo(x) {
203203
case -1 /* Q */:
204204
case 0 /* R */:
205205
case 0 /* S */:
206-
case 11 /* T */:
206+
case 11 /* "T" */:
207207
case 11 /* U */:
208208
case 11 /* V */:
209209
case 11 /* W */:

tests/baselines/reference/constEnums.types

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -466,10 +466,9 @@ function foo(x: Enum1) {
466466
>Enum1 : typeof Enum1
467467
>S : Enum1
468468

469-
case Enum1.T:
470-
>Enum1.T : Enum1
469+
case Enum1["T"]:
470+
>Enum1["T"] : Enum1
471471
>Enum1 : typeof Enum1
472-
>T : Enum1
473472

474473
case Enum1.U:
475474
>Enum1.U : Enum1

tests/baselines/reference/decrementOperatorWithEnumType.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ var ENUM1;
2222
})(ENUM1 || (ENUM1 = {}));
2323
;
2424
// expression
25-
var ResultIsNumber1 = --ENUM1["A"];
25+
var ResultIsNumber1 = --0 /* "A" */;
2626
var ResultIsNumber2 = 0 /* A */--;
2727
// miss assignment operator
28-
--ENUM1["A"];
28+
--0 /* "A" */;
2929
ENUM1[A]--;

tests/baselines/reference/deleteOperatorWithEnumType.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ var ENUM1;
3939
var ResultIsBoolean1 = delete ENUM;
4040
var ResultIsBoolean2 = delete ENUM1;
4141
// enum type expressions
42-
var ResultIsBoolean3 = delete ENUM1["A"];
43-
var ResultIsBoolean4 = delete (ENUM[0] + ENUM1["B"]);
42+
var ResultIsBoolean3 = delete 0 /* "A" */;
43+
var ResultIsBoolean4 = delete (ENUM[0] + 1 /* "B" */);
4444
// multiple delete operators
4545
var ResultIsBoolean5 = delete delete ENUM;
46-
var ResultIsBoolean6 = delete delete delete (ENUM[0] + ENUM1["B"]);
46+
var ResultIsBoolean6 = delete delete delete (ENUM[0] + 1 /* "B" */);
4747
// miss assignment operators
4848
delete ENUM;
4949
delete ENUM1;

tests/baselines/reference/incrementOperatorWithEnumType.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ var ENUM1;
2222
})(ENUM1 || (ENUM1 = {}));
2323
;
2424
// expression
25-
var ResultIsNumber1 = ++ENUM1["B"];
25+
var ResultIsNumber1 = ++1 /* "B" */;
2626
var ResultIsNumber2 = 1 /* B */++;
2727
// miss assignment operator
28-
++ENUM1["B"];
28+
++1 /* "B" */;
2929
1 /* B */++;

tests/baselines/reference/logicalNotOperatorWithEnumType.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ var ENUM1;
3737
// enum type var
3838
var ResultIsBoolean1 = !ENUM;
3939
// enum type expressions
40-
var ResultIsBoolean2 = !ENUM["B"];
41-
var ResultIsBoolean3 = !(1 /* B */ + ENUM["C"]);
40+
var ResultIsBoolean2 = !1 /* "B" */;
41+
var ResultIsBoolean3 = !(1 /* B */ + 2 /* "C" */);
4242
// multiple ! operators
4343
var ResultIsBoolean4 = !!ENUM;
44-
var ResultIsBoolean5 = !!!(ENUM["B"] + 2 /* C */);
44+
var ResultIsBoolean5 = !!!(1 /* "B" */ + 2 /* C */);
4545
// miss assignment operators
4646
!ENUM;
4747
!ENUM1;

tests/baselines/reference/negateOperatorWithEnumType.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ var ENUM1;
3333
// enum type var
3434
var ResultIsNumber1 = -ENUM;
3535
// expressions
36-
var ResultIsNumber2 = -ENUM1["B"];
37-
var ResultIsNumber3 = -(1 /* B */ + ENUM1[""]);
36+
var ResultIsNumber2 = -1 /* "B" */;
37+
var ResultIsNumber3 = -(1 /* B */ + 2 /* "" */);
3838
// miss assignment operators
3939
-ENUM;
4040
-ENUM1;
41-
-ENUM1["B"];
41+
-1 /* "B" */;
4242
-ENUM, ENUM1;

tests/baselines/reference/noImplicitAnyIndexing.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ var strRepresentation2 = MyEmusEnum[0 /* emu */];
6161
// Should be implicit 'any' ; property access fails, no string indexer.
6262
var strRepresentation3 = MyEmusEnum["monehh"];
6363
// Should be okay; should be a MyEmusEnum
64-
var strRepresentation4 = MyEmusEnum["emu"];
64+
var strRepresentation4 = 0 /* "emu" */;
6565
// Should report an implicit 'any'.
6666
var x = {}["hi"];
6767
// Should report an implicit 'any'.

tests/baselines/reference/plusOperatorWithEnumType.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ var ENUM1;
3535
var ResultIsNumber1 = +ENUM;
3636
var ResultIsNumber2 = +ENUM1;
3737
// enum type expressions
38-
var ResultIsNumber3 = +ENUM1["A"];
39-
var ResultIsNumber4 = +(ENUM[0] + ENUM1["B"]);
38+
var ResultIsNumber3 = +0 /* "A" */;
39+
var ResultIsNumber4 = +(ENUM[0] + 1 /* "B" */);
4040
// miss assignment operators
4141
+ENUM;
4242
+ENUM1;

tests/baselines/reference/typeofOperatorWithEnumType.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ var ENUM1;
4444
var ResultIsString1 = typeof ENUM;
4545
var ResultIsString2 = typeof ENUM1;
4646
// enum type expressions
47-
var ResultIsString3 = typeof ENUM1["A"];
48-
var ResultIsString4 = typeof (ENUM[0] + ENUM1["B"]);
47+
var ResultIsString3 = typeof 0 /* "A" */;
48+
var ResultIsString4 = typeof (ENUM[0] + 1 /* "B" */);
4949
// multiple typeof operators
5050
var ResultIsString5 = typeof typeof ENUM;
5151
var ResultIsString6 = typeof typeof typeof (ENUM[0] + 1 /* B */);
5252
// miss assignment operators
5353
typeof ENUM;
5454
typeof ENUM1;
55-
typeof ENUM1["B"];
55+
typeof 1 /* "B" */;
5656
typeof ENUM, ENUM1;
5757
// use typeof in type query
5858
var z;

tests/baselines/reference/voidOperatorWithEnumType.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@ var ENUM1;
3939
var ResultIsAny1 = void ENUM;
4040
var ResultIsAny2 = void ENUM1;
4141
// enum type expressions
42-
var ResultIsAny3 = void ENUM1["A"];
43-
var ResultIsAny4 = void (ENUM[0] + ENUM1["B"]);
42+
var ResultIsAny3 = void 0 /* "A" */;
43+
var ResultIsAny4 = void (ENUM[0] + 1 /* "B" */);
4444
// multiple void operators
4545
var ResultIsAny5 = void void ENUM;
4646
var ResultIsAny6 = void void void (ENUM[0] + 1 /* B */);
4747
// miss assignment operators
4848
void ENUM;
4949
void ENUM1;
50-
void ENUM1["B"];
50+
void 1 /* "B" */;
5151
void ENUM, ENUM1;

tests/cases/compiler/constEnums.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ function foo(x: Enum1) {
130130
case Enum1.Q:
131131
case Enum1.R:
132132
case Enum1.S:
133-
case Enum1.T:
133+
case Enum1["T"]:
134134
case Enum1.U:
135135
case Enum1.V:
136136
case Enum1.W:

0 commit comments

Comments
 (0)