Skip to content

Commit d23effc

Browse files
authored
Non-latebound computed property names should print as their underlying name type (#29084)
1 parent fd7fd13 commit d23effc

6 files changed

+134
-11
lines changed

src/compiler/checker.ts

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4426,6 +4426,22 @@ namespace ts {
44264426
return location.kind === SyntaxKind.SourceFile || isAmbientModule(location);
44274427
}
44284428

4429+
function getNameOfSymbolFromNameType(symbol: Symbol, context?: NodeBuilderContext) {
4430+
const nameType = symbol.nameType;
4431+
if (nameType) {
4432+
if (nameType.flags & TypeFlags.StringOrNumberLiteral) {
4433+
const name = "" + (<StringLiteralType | NumberLiteralType>nameType).value;
4434+
if (!isIdentifierText(name, compilerOptions.target) && !isNumericLiteralName(name)) {
4435+
return `"${escapeString(name, CharacterCodes.doubleQuote)}"`;
4436+
}
4437+
return name;
4438+
}
4439+
if (nameType.flags & TypeFlags.UniqueESSymbol) {
4440+
return `[${getNameOfSymbolAsWritten((<UniqueESSymbolType>nameType).symbol, context)}]`;
4441+
}
4442+
}
4443+
}
4444+
44294445
/**
44304446
* Gets a human-readable name for a symbol.
44314447
* Should *not* be used for the right-hand side of a `.` -- use `symbolName(symbol)` for that instead.
@@ -4450,6 +4466,13 @@ namespace ts {
44504466
if (isCallExpression(declaration) && isBindableObjectDefinePropertyCall(declaration)) {
44514467
return symbolName(symbol);
44524468
}
4469+
if (isComputedPropertyName(name) && !(getCheckFlags(symbol) & CheckFlags.Late) && symbol.nameType && symbol.nameType.flags & TypeFlags.StringOrNumberLiteral) {
4470+
// Computed property name isn't late bound, but has a well-known name type - use name type to generate a symbol name
4471+
const result = getNameOfSymbolFromNameType(symbol, context);
4472+
if (result !== undefined) {
4473+
return result;
4474+
}
4475+
}
44534476
return declarationNameToString(name);
44544477
}
44554478
if (declaration.parent && declaration.parent.kind === SyntaxKind.VariableDeclaration) {
@@ -4465,16 +4488,8 @@ namespace ts {
44654488
return declaration.kind === SyntaxKind.ClassExpression ? "(Anonymous class)" : "(Anonymous function)";
44664489
}
44674490
}
4468-
const nameType = symbol.nameType;
4469-
if (nameType) {
4470-
if (nameType.flags & TypeFlags.StringLiteral && !isIdentifierText((<StringLiteralType>nameType).value, compilerOptions.target)) {
4471-
return `"${escapeString((<StringLiteralType>nameType).value, CharacterCodes.doubleQuote)}"`;
4472-
}
4473-
if (nameType && nameType.flags & TypeFlags.UniqueESSymbol) {
4474-
return `[${getNameOfSymbolAsWritten((<UniqueESSymbolType>nameType).symbol, context)}]`;
4475-
}
4476-
}
4477-
return symbolName(symbol);
4491+
const name = getNameOfSymbolFromNameType(symbol, context);
4492+
return name !== undefined ? name : symbolName(symbol);
44784493
}
44794494

44804495
function isDeclarationVisible(node: Node): boolean {
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//// [tests/cases/compiler/declarationEmitComputedNameConstEnumAlias.ts] ////
2+
3+
//// [EnumExample.ts]
4+
enum EnumExample {
5+
TEST = 'TEST',
6+
}
7+
8+
export default EnumExample;
9+
10+
//// [index.ts]
11+
import EnumExample from './EnumExample';
12+
13+
export default {
14+
[EnumExample.TEST]: {},
15+
};
16+
17+
//// [EnumExample.js]
18+
"use strict";
19+
exports.__esModule = true;
20+
var EnumExample;
21+
(function (EnumExample) {
22+
EnumExample["TEST"] = "TEST";
23+
})(EnumExample || (EnumExample = {}));
24+
exports["default"] = EnumExample;
25+
//// [index.js]
26+
"use strict";
27+
exports.__esModule = true;
28+
var _a;
29+
var EnumExample_1 = require("./EnumExample");
30+
exports["default"] = (_a = {},
31+
_a[EnumExample_1["default"].TEST] = {},
32+
_a);
33+
34+
35+
//// [EnumExample.d.ts]
36+
declare enum EnumExample {
37+
TEST = "TEST"
38+
}
39+
export default EnumExample;
40+
//// [index.d.ts]
41+
declare const _default: {
42+
TEST: {};
43+
};
44+
export default _default;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
=== tests/cases/compiler/EnumExample.ts ===
2+
enum EnumExample {
3+
>EnumExample : Symbol(EnumExample, Decl(EnumExample.ts, 0, 0))
4+
5+
TEST = 'TEST',
6+
>TEST : Symbol(EnumExample.TEST, Decl(EnumExample.ts, 0, 18))
7+
}
8+
9+
export default EnumExample;
10+
>EnumExample : Symbol(EnumExample, Decl(EnumExample.ts, 0, 0))
11+
12+
=== tests/cases/compiler/index.ts ===
13+
import EnumExample from './EnumExample';
14+
>EnumExample : Symbol(EnumExample, Decl(index.ts, 0, 6))
15+
16+
export default {
17+
[EnumExample.TEST]: {},
18+
>[EnumExample.TEST] : Symbol([EnumExample.TEST], Decl(index.ts, 2, 16))
19+
>EnumExample.TEST : Symbol(EnumExample.TEST, Decl(EnumExample.ts, 0, 18))
20+
>EnumExample : Symbol(EnumExample, Decl(index.ts, 0, 6))
21+
>TEST : Symbol(EnumExample.TEST, Decl(EnumExample.ts, 0, 18))
22+
23+
};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
=== tests/cases/compiler/EnumExample.ts ===
2+
enum EnumExample {
3+
>EnumExample : EnumExample
4+
5+
TEST = 'TEST',
6+
>TEST : EnumExample.TEST
7+
>'TEST' : "TEST"
8+
}
9+
10+
export default EnumExample;
11+
>EnumExample : EnumExample
12+
13+
=== tests/cases/compiler/index.ts ===
14+
import EnumExample from './EnumExample';
15+
>EnumExample : typeof EnumExample
16+
17+
export default {
18+
>{ [EnumExample.TEST]: {},} : { [EnumExample.TEST]: {}; }
19+
20+
[EnumExample.TEST]: {},
21+
>[EnumExample.TEST] : {}
22+
>EnumExample.TEST : EnumExample
23+
>EnumExample : typeof EnumExample
24+
>TEST : EnumExample
25+
>{} : {}
26+
27+
};

tests/baselines/reference/parserComputedPropertyName35.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
=== tests/cases/conformance/parser/ecmascript6/ComputedPropertyNames/parserComputedPropertyName35.ts ===
22
var x = {
3-
>x : { [0, 1]: {}; }
3+
>x : { 1: {}; }
44
>{ [0, 1]: { }} : { [0, 1]: {}; }
55

66
[0, 1]: { }
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// @declaration: true
2+
// @filename: EnumExample.ts
3+
enum EnumExample {
4+
TEST = 'TEST',
5+
}
6+
7+
export default EnumExample;
8+
9+
// @filename: index.ts
10+
import EnumExample from './EnumExample';
11+
12+
export default {
13+
[EnumExample.TEST]: {},
14+
};

0 commit comments

Comments
 (0)