Skip to content

Commit 74d76e9

Browse files
authored
fix(49546): create computed property name for symbol props (#49554)
1 parent c01afb5 commit 74d76e9

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

src/services/codefixes/fixAddMissingMember.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ namespace ts.codefix {
485485
const checker = context.program.getTypeChecker();
486486
const props = map(info.properties, prop => {
487487
const initializer = tryGetValueFromType(context, checker, importAdder, quotePreference, checker.getTypeOfSymbol(prop), info.parentDeclaration);
488-
return factory.createPropertyAssignment(createPropertyNameNodeForIdentifierOrLiteral(prop.name, target, quotePreference === QuotePreference.Single), initializer);
488+
return factory.createPropertyAssignment(createPropertyNameFromSymbol(prop, target, quotePreference, checker), initializer);
489489
});
490490
const options = {
491491
leadingTriviaOption: textChanges.LeadingTriviaOption.Exclude,
@@ -608,4 +608,14 @@ namespace ts.codefix {
608608
const declaration = findAncestor(callExpression, n => isMethodDeclaration(n) || isConstructorDeclaration(n));
609609
return declaration && declaration.parent === node ? declaration : undefined;
610610
}
611+
612+
function createPropertyNameFromSymbol(symbol: Symbol, target: ScriptTarget, quotePreference: QuotePreference, checker: TypeChecker) {
613+
if (isTransientSymbol(symbol) && symbol.nameType && symbol.nameType.flags & TypeFlags.UniqueESSymbol) {
614+
const expression = checker.symbolToExpression((symbol.nameType as UniqueESSymbolType).symbol, SymbolFlags.Value, symbol.valueDeclaration, NodeBuilderFlags.AllowUniqueESSymbolType);
615+
if (expression) {
616+
return factory.createComputedPropertyName(expression);
617+
}
618+
}
619+
return createPropertyNameNodeForIdentifierOrLiteral(symbol.name, target, quotePreference === QuotePreference.Single);
620+
}
611621
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/// <reference path="fourslash.ts" />
2+
3+
// @lib: es2020
4+
////const x: Iterable<number> = {}
5+
6+
verify.codeFix({
7+
index: 0,
8+
description: ts.Diagnostics.Add_missing_properties.message,
9+
newFileContent:
10+
`const x: Iterable<number> = {
11+
[Symbol.iterator]: function(): Iterator<number, any, undefined> {
12+
throw new Error("Function not implemented.");
13+
}
14+
}`,
15+
});

0 commit comments

Comments
 (0)