@@ -464,6 +464,7 @@ namespace ts {
464
464
signatureToSignatureDeclaration: nodeBuilder.signatureToSignatureDeclaration,
465
465
symbolToEntityName: nodeBuilder.symbolToEntityName,
466
466
symbolToExpression: nodeBuilder.symbolToExpression,
467
+ symbolToNode: nodeBuilder.symbolToNode,
467
468
symbolToTypeParameterDeclarations: nodeBuilder.symbolToTypeParameterDeclarations,
468
469
symbolToParameterDeclaration: nodeBuilder.symbolToParameterDeclaration,
469
470
typeParameterToDeclaration: nodeBuilder.typeParameterToDeclaration,
@@ -4822,7 +4823,10 @@ namespace ts {
4822
4823
if (flags & SymbolFormatFlags.DoNotIncludeSymbolChain) {
4823
4824
nodeFlags |= NodeBuilderFlags.DoNotIncludeSymbolChain;
4824
4825
}
4825
- const builder = flags & SymbolFormatFlags.AllowAnyNodeKind ? nodeBuilder.symbolToExpression : nodeBuilder.symbolToEntityName;
4826
+ if (flags & SymbolFormatFlags.WriteComputedProps) {
4827
+ nodeFlags |= NodeBuilderFlags.WriteComputedProps;
4828
+ }
4829
+ const builder = flags & SymbolFormatFlags.AllowAnyNodeKind ? nodeBuilder.symbolToNode : nodeBuilder.symbolToEntityName;
4826
4830
return writer ? symbolToStringWorker(writer).getText() : usingSingleLineStringWriter(symbolToStringWorker);
4827
4831
4828
4832
function symbolToStringWorker(writer: EmitTextWriter) {
@@ -4919,8 +4923,25 @@ namespace ts {
4919
4923
withContext(enclosingDeclaration, flags, tracker, context => typeParameterToDeclaration(parameter, context)),
4920
4924
symbolTableToDeclarationStatements: (symbolTable: SymbolTable, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker, bundled?: boolean) =>
4921
4925
withContext(enclosingDeclaration, flags, tracker, context => symbolTableToDeclarationStatements(symbolTable, context, bundled)),
4926
+ symbolToNode: (symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) =>
4927
+ withContext(enclosingDeclaration, flags, tracker, context => symbolToNode(symbol, context, meaning)),
4922
4928
};
4923
4929
4930
+ function symbolToNode(symbol: Symbol, context: NodeBuilderContext, meaning: SymbolFlags) {
4931
+ if (context.flags & NodeBuilderFlags.WriteComputedProps) {
4932
+ if (symbol.valueDeclaration) {
4933
+ const name = getNameOfDeclaration(symbol.valueDeclaration);
4934
+ if (name && isComputedPropertyName(name)) return name;
4935
+ }
4936
+ const nameType = getSymbolLinks(symbol).nameType;
4937
+ if (nameType && nameType.flags & (TypeFlags.EnumLiteral | TypeFlags.UniqueESSymbol)) {
4938
+ context.enclosingDeclaration = nameType.symbol.valueDeclaration;
4939
+ return factory.createComputedPropertyName(symbolToExpression(nameType.symbol, context, meaning));
4940
+ }
4941
+ }
4942
+ return symbolToExpression(symbol, context, meaning);
4943
+ }
4944
+
4924
4945
function withContext<T>(enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined, tracker: SymbolTracker | undefined, cb: (context: NodeBuilderContext) => T): T | undefined {
4925
4946
Debug.assert(enclosingDeclaration === undefined || (enclosingDeclaration.flags & NodeFlags.Synthesized) === 0);
4926
4947
const context: NodeBuilderContext = {
@@ -20310,7 +20331,7 @@ namespace ts {
20310
20331
shouldSkipElaboration = true; // Retain top-level error for interface implementing issues, otherwise omit it
20311
20332
}
20312
20333
if (props.length === 1) {
20313
- const propName = symbolToString(unmatchedProperty);
20334
+ const propName = symbolToString(unmatchedProperty, /*enclosingDeclaration*/ undefined, SymbolFlags.None, SymbolFormatFlags.AllowAnyNodeKind | SymbolFormatFlags.WriteComputedProps );
20314
20335
reportError(Diagnostics.Property_0_is_missing_in_type_1_but_required_in_type_2, propName, ...getTypeNamesForErrorDisplay(source, target));
20315
20336
if (length(unmatchedProperty.declarations)) {
20316
20337
associateRelatedInfo(createDiagnosticForNode(unmatchedProperty.declarations![0], Diagnostics._0_is_declared_here, propName));
0 commit comments