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]--;

0 commit comments

Comments
 (0)