@@ -4258,9 +4258,9 @@ namespace ts {
42584258 }
42594259 }
42604260 }
4261- const propertyName = symbolToName(propertySymbol, context, SymbolFlags.Value, /*expectsIdentifier*/ true);
4262- context.approximateLength += (symbolName(propertySymbol).length + 1);
42634261 context.enclosingDeclaration = saveEnclosingDeclaration;
4262+ const propertyName = getPropertyNameNodeForSymbol(propertySymbol, context);
4263+ context.approximateLength += (symbolName(propertySymbol).length + 1);
42644264 const optionalToken = propertySymbol.flags & SymbolFlags.Optional ? createToken(SyntaxKind.QuestionToken) : undefined;
42654265 if (propertySymbol.flags & (SymbolFlags.Function | SymbolFlags.Method) && !getPropertiesOfObjectType(propertyType).length && !isReadonlySymbol(propertySymbol)) {
42664266 const signatures = getSignaturesOfType(filterType(propertyType, t => !(t.flags & TypeFlags.Undefined)), SignatureKind.Call);
@@ -4892,23 +4892,38 @@ namespace ts {
48924892 }
48934893 }
48944894
4895+ function isSingleQuotedStringNamed(d: Declaration) {
4896+ const name = getNameOfDeclaration(d);
4897+ if (name && isStringLiteral(name) && (
4898+ name.singleQuote ||
4899+ (!nodeIsSynthesized(name) && startsWith(getTextOfNode(name, /*includeTrivia*/ false), "'"))
4900+ )) {
4901+ return true;
4902+ }
4903+ return false;
4904+ }
4905+
48954906 function getPropertyNameNodeForSymbol(symbol: Symbol, context: NodeBuilderContext) {
4896- const fromNameType = getPropertyNameNodeForSymbolFromNameType(symbol, context);
4907+ const singleQuote = !!length(symbol.declarations) && every(symbol.declarations, isSingleQuotedStringNamed);
4908+ const fromNameType = getPropertyNameNodeForSymbolFromNameType(symbol, context, singleQuote);
48974909 if (fromNameType) {
48984910 return fromNameType;
48994911 }
4912+ if (isKnownSymbol(symbol)) {
4913+ return createComputedPropertyName(createPropertyAccess(createIdentifier("Symbol"), (symbol.escapedName as string).substr(3)));
4914+ }
49004915 const rawName = unescapeLeadingUnderscores(symbol.escapedName);
4901- return createPropertyNameNodeForIdentifierOrLiteral(rawName);
4916+ return createPropertyNameNodeForIdentifierOrLiteral(rawName, singleQuote );
49024917 }
49034918
49044919 // See getNameForSymbolFromNameType for a stringy equivalent
4905- function getPropertyNameNodeForSymbolFromNameType(symbol: Symbol, context: NodeBuilderContext) {
4920+ function getPropertyNameNodeForSymbolFromNameType(symbol: Symbol, context: NodeBuilderContext, singleQuote?: boolean ) {
49064921 const nameType = symbol.nameType;
49074922 if (nameType) {
49084923 if (nameType.flags & TypeFlags.StringOrNumberLiteral) {
49094924 const name = "" + (<StringLiteralType | NumberLiteralType>nameType).value;
49104925 if (!isIdentifierText(name, compilerOptions.target) && !isNumericLiteralName(name)) {
4911- return createLiteral(name);
4926+ return createLiteral(name, !!singleQuote );
49124927 }
49134928 if (isNumericLiteralName(name) && startsWith(name, "-")) {
49144929 return createComputedPropertyName(createLiteral(+name));
@@ -4921,8 +4936,8 @@ namespace ts {
49214936 }
49224937 }
49234938
4924- function createPropertyNameNodeForIdentifierOrLiteral(name: string) {
4925- return isIdentifierText(name, compilerOptions.target) ? createIdentifier(name) : createLiteral(isNumericLiteralName(name) ? +name : name) as StringLiteral | NumericLiteral ;
4939+ function createPropertyNameNodeForIdentifierOrLiteral(name: string, singleQuote?: boolean ) {
4940+ return isIdentifierText(name, compilerOptions.target) ? createIdentifier(name) : createLiteral(isNumericLiteralName(name) ? +name : name, !!singleQuote) ;
49264941 }
49274942
49284943 function cloneNodeBuilderContext(context: NodeBuilderContext): NodeBuilderContext {
0 commit comments