@@ -2191,43 +2191,44 @@ namespace ts {
21912191 return result;
21922192 }
21932193
2194- function createTypeParameterDeclarationFromType (type: TypeParameter, enclosingDeclaration: Node): TypeParameterDeclaration {
2194+ function typeParameterToDeclaration (type: TypeParameter, enclosingDeclaration? : Node): TypeParameterDeclaration {
21952195 if (!(type && type.symbol && type.flags & TypeFlags.TypeParameter)) {
21962196 return undefined;
21972197 }
21982198
21992199 const constraint = typeToTypeNode(getConstraintFromTypeParameter(type), enclosingDeclaration);
22002200 const defaultParameter = typeToTypeNode(getDefaultFromTypeParameter(type), enclosingDeclaration);
22012201
2202+ // TODO: use method internal to typeToTypeNode.
22022203 const name = symbolToString(type.symbol);
22032204 return createTypeParameterDeclaration(name, constraint, defaultParameter);
22042205 }
22052206
2206- function createParameterDeclarationFromSymbol (parameterSymbol: Symbol, enclosingDeclaration: Node): ParameterDeclaration {
2207+ function symbolToParameterDeclaration (parameterSymbol: Symbol, enclosingDeclaration? : Node): ParameterDeclaration {
22072208 const parameterDeclaration = parameterSymbol.declarations[0] as ParameterDeclaration;
22082209 const parameterType = getTypeOfSymbol(parameterSymbol);
22092210 const parameterTypeNode = typeToTypeNode(parameterType, enclosingDeclaration);
22102211 // TODO: how should we clone members/modifiers?
22112212 // TODO: check initializer accessibility correctly.
22122213 const parameterNode = createParameter(
2213- parameterDeclaration.decorators && parameterDeclaration.decorators.map(getSynthesizedDeepClone) ,
2214- parameterDeclaration.modifiers && parameterDeclaration.modifiers.map(getSynthesizedDeepClone) ,
2214+ parameterDeclaration.decorators,
2215+ parameterDeclaration.modifiers,
22152216 parameterDeclaration.dotDotDotToken && createToken(SyntaxKind.DotDotDotToken),
2216- getSynthesizedDeepClone( parameterDeclaration.name) ,
2217+ parameterDeclaration.name,
22172218 parameterDeclaration.questionToken && createToken(SyntaxKind.QuestionToken),
22182219 parameterTypeNode,
2219- parameterDeclaration.initializer && getSynthesizedDeepClone(parameterDeclaration.initializer) );
2220+ parameterDeclaration.initializer);
22202221 return parameterNode;
22212222 }
22222223
2223- function signatureToSignatureDeclaration(signature: Signature, kind: SyntaxKind, enclosingDeclaration: Node): SignatureDeclaration {
2224- const typeParameters = signature.typeParameters && signature.typeParameters.map(parameter => createTypeParameterDeclarationFromType (parameter, enclosingDeclaration));
2225- const parameters = signature.parameters.map(parameter => createParameterDeclarationFromSymbol (parameter, enclosingDeclaration));
2226- const type = createTypeNodeExceptAny (getReturnTypeOfSignature(signature));
2224+ function signatureToSignatureDeclaration(signature: Signature, kind: SyntaxKind, enclosingDeclaration? : Node): SignatureDeclaration {
2225+ const typeParameters = signature.typeParameters && signature.typeParameters.map(parameter => typeParameterToDeclaration (parameter, enclosingDeclaration));
2226+ const parameters = signature.parameters.map(parameter => symbolToParameterDeclaration (parameter, enclosingDeclaration));
2227+ const type = typeToTypeNodeExceptAny (getReturnTypeOfSignature(signature));
22272228
22282229 return createSignatureDeclaration(kind, typeParameters, parameters, type);
22292230
2230- function createTypeNodeExceptAny (type: Type): TypeNode | undefined {
2231+ function typeToTypeNodeExceptAny (type: Type): TypeNode | undefined {
22312232 const typeNode = typeToTypeNode(type, enclosingDeclaration);
22322233 return typeNode && typeNode.kind !== SyntaxKind.AnyKeyword ? typeNode : undefined;
22332234 }
@@ -2236,17 +2237,17 @@ namespace ts {
22362237
22372238 // function typeToDisplayParts
22382239
2239- function typeToTypeNode(type: Type, enclosingDeclaration: Node, returnNodeOnError?: boolean): TypeNode {
2240+ function typeToTypeNode(type: Type, enclosingDeclaration? : Node, returnNodeOnError?: boolean): TypeNode {
22402241 let encounteredError = false;
22412242 let inObjectTypeLiteral = false;
22422243 let checkAlias = true;
22432244 let symbolStack: Symbol[] = undefined;
22442245
2245- const result = createTypeNodeWorker (type);
2246+ const result = typeToTypeNodeWorker (type);
22462247 // returnNodeOnError = true; // TODO: unset.
22472248 return encounteredError && !returnNodeOnError ? undefined: result;
22482249
2249- function createTypeNodeWorker (type: Type): TypeNode {
2250+ function typeToTypeNodeWorker (type: Type): TypeNode {
22502251 if (!type) {
22512252 encounteredError = true;
22522253 return undefined;
@@ -2308,7 +2309,7 @@ namespace ts {
23082309
23092310 if (objectFlags & ObjectFlags.Reference) {
23102311 Debug.assert(!!(type.flags & TypeFlags.Object));
2311- return createTypeReferenceNodeFromType (<TypeReference>type);
2312+ return typeReferenceToTypeReferenceNode (<TypeReference>type);
23122313 }
23132314 if (objectFlags & ObjectFlags.ClassOrInterface) {
23142315 Debug.assert(!!(type.flags & TypeFlags.Object));
@@ -2347,25 +2348,25 @@ namespace ts {
23472348
23482349 if (type.flags & TypeFlags.Index) {
23492350 const indexedType = (<IndexType>type).type;
2350- const indexTypeNode = createTypeNodeWorker (indexedType);
2351+ const indexTypeNode = typeToTypeNodeWorker (indexedType);
23512352 return createTypeOperatorNode(indexTypeNode);
23522353 }
23532354 if (type.flags & TypeFlags.IndexedAccess) {
2354- const objectTypeNode = createTypeNodeWorker ((<IndexedAccessType>type).objectType);
2355- const indexTypeNode = createTypeNodeWorker ((<IndexedAccessType>type).indexType);
2355+ const objectTypeNode = typeToTypeNodeWorker ((<IndexedAccessType>type).objectType);
2356+ const indexTypeNode = typeToTypeNodeWorker ((<IndexedAccessType>type).indexType);
23562357 return createIndexedAccessTypeNode(objectTypeNode, indexTypeNode);
23572358 }
23582359
23592360 Debug.fail("Should be unreachable.");
23602361
23612362 function mapToTypeNodeArray(types: Type[]): NodeArray<TypeNode> {
2362- return types && asNodeArray(types.map(createTypeNodeWorker ) as TypeNode[]);
2363+ return types && asNodeArray(types.map(typeToTypeNodeWorker ) as TypeNode[]);
23632364 }
23642365
23652366 function createMappedTypeNodeFromType(type: MappedType) {
23662367 Debug.assert(!!(type.flags & TypeFlags.Object));
23672368 const typeParameter = getTypeParameterFromMappedType(<MappedType>type);
2368- const typeParameterNode = createTypeParameterDeclarationFromType (typeParameter, enclosingDeclaration);
2369+ const typeParameterNode = typeParameterToDeclaration (typeParameter, enclosingDeclaration);
23692370
23702371 const templateTypeNode = typeToTypeNode(getTemplateTypeFromMappedType(<MappedType>type), enclosingDeclaration);
23712372 const readonlyToken = (<MappedType>type).declaration && (<MappedType>type).declaration.readonlyToken ? createToken(SyntaxKind.ReadonlyKeyword) : undefined;
@@ -2464,10 +2465,10 @@ namespace ts {
24642465 }
24652466 }
24662467
2467- function createTypeReferenceNodeFromType (type: TypeReference) {
2468+ function typeReferenceToTypeReferenceNode (type: TypeReference) {
24682469 const typeArguments: Type[] = type.typeArguments || emptyArray;
24692470 if (type.target === globalArrayType) {
2470- const elementType = createTypeNodeWorker (typeArguments[0]);
2471+ const elementType = typeToTypeNodeWorker (typeArguments[0]);
24712472 return createArrayTypeNode(elementType);
24722473 }
24732474 else if (type.target.objectFlags & ObjectFlags.Tuple) {
@@ -2489,21 +2490,20 @@ namespace ts {
24892490 // When type parameters are their own type arguments for the whole group (i.e. we have
24902491 // the default outer type arguments), we don't show the group.
24912492 if (!rangeEquals(outerTypeParameters, typeArguments, start, i)) {
2492- const name = createNameFromSymbol(parent);
2493- const qualifiedNamePart = name;
2493+ const qualifiedNamePart = createNameFromSymbol(parent, /*mustBeIdentifier*/ true);
24942494 if (!qualifiedName) {
2495- qualifiedName = createQualifiedName(qualifiedNamePart, /*right*/undefined);
2495+ qualifiedName = createQualifiedName(qualifiedNamePart, /*right*/ undefined);
24962496 }
24972497 else {
24982498 Debug.assert(!qualifiedName.right);
24992499 qualifiedName.right = qualifiedNamePart;
2500- qualifiedName = createQualifiedName(qualifiedName, /*right*/undefined);
2500+ qualifiedName = createQualifiedName(qualifiedName, /*right*/ undefined);
25012501 }
25022502 }
25032503 }
25042504 }
25052505 let entityName: EntityName = undefined;
2506- const nameIdentifier = createNameFromSymbol(type.symbol);
2506+ const nameIdentifier = createNameFromSymbol(type.symbol, /*mustBeIdentifier*/ true );
25072507 if (qualifiedName) {
25082508 Debug.assert(!qualifiedName.right);
25092509 qualifiedName.right = nameIdentifier;
@@ -2544,7 +2544,7 @@ namespace ts {
25442544 if (!oldDeclaration) {
25452545 return;
25462546 }
2547- const propertyName = getSynthesizedDeepClone( oldDeclaration.name) ;
2547+ const propertyName = oldDeclaration.name;
25482548 const optionalToken = propertySymbol.flags & SymbolFlags.Optional ? createToken(SyntaxKind.QuestionToken) : undefined;;
25492549 if (propertySymbol.flags & (SymbolFlags.Function | SymbolFlags.Method) && !getPropertiesOfObjectType(propertyType).length) {
25502550 const signatures = getSignaturesOfType(propertyType, SignatureKind.Call);
@@ -2559,16 +2559,16 @@ namespace ts {
25592559 typeElements.push(createPropertySignature(
25602560 propertyName,
25612561 optionalToken,
2562- createTypeNodeWorker (propertyType),
2562+ typeToTypeNodeWorker (propertyType),
25632563 /*initializer*/undefined));
25642564 }
25652565 }
25662566 return typeElements.length ? typeElements : undefined;
25672567 }
25682568
2569- function createNameFromSymbol(symbol: Symbol): Identifier;
2570- function createNameFromSymbol(symbol: Symbol): EntityName;
2571- function createNameFromSymbol(symbol: Symbol): EntityName {
2569+ function createNameFromSymbol(symbol: Symbol, mustBeIdentifier: true ): Identifier;
2570+ function createNameFromSymbol(symbol: Symbol, mustBeIdentifier?: false ): EntityName;
2571+ function createNameFromSymbol(symbol: Symbol, mustBeIdentifier: boolean | undefined ): EntityName {
25722572 let parentSymbol: Symbol;
25732573 let meaning: SymbolFlags;
25742574
@@ -2586,8 +2586,12 @@ namespace ts {
25862586 }
25872587
25882588 parentSymbol = undefined;
2589- const result = createEntityNameFromSymbolChain(chain, chain.length - 1);
2590- return result;
2589+ if(mustBeIdentifier && chain.length !== 1) {
2590+ encounteredError = true;
2591+ // TODO: failing to get an identifier when we expect one generates an unprintable node.
2592+ // Should error handling be more severe?
2593+ }
2594+ return createEntityNameFromSymbolChain(chain, chain.length - 1);
25912595
25922596 function createEntityNameFromSymbolChain(chain: Symbol[], index: number): EntityName {
25932597 Debug.assert(chain && 0 <= index && index < chain.length);
0 commit comments