@@ -2191,43 +2191,44 @@ namespace ts {
2191
2191
return result;
2192
2192
}
2193
2193
2194
- function createTypeParameterDeclarationFromType (type: TypeParameter, enclosingDeclaration: Node): TypeParameterDeclaration {
2194
+ function typeParameterToDeclaration (type: TypeParameter, enclosingDeclaration? : Node): TypeParameterDeclaration {
2195
2195
if (!(type && type.symbol && type.flags & TypeFlags.TypeParameter)) {
2196
2196
return undefined;
2197
2197
}
2198
2198
2199
2199
const constraint = typeToTypeNode(getConstraintFromTypeParameter(type), enclosingDeclaration);
2200
2200
const defaultParameter = typeToTypeNode(getDefaultFromTypeParameter(type), enclosingDeclaration);
2201
2201
2202
+ // TODO: use method internal to typeToTypeNode.
2202
2203
const name = symbolToString(type.symbol);
2203
2204
return createTypeParameterDeclaration(name, constraint, defaultParameter);
2204
2205
}
2205
2206
2206
- function createParameterDeclarationFromSymbol (parameterSymbol: Symbol, enclosingDeclaration: Node): ParameterDeclaration {
2207
+ function symbolToParameterDeclaration (parameterSymbol: Symbol, enclosingDeclaration? : Node): ParameterDeclaration {
2207
2208
const parameterDeclaration = parameterSymbol.declarations[0] as ParameterDeclaration;
2208
2209
const parameterType = getTypeOfSymbol(parameterSymbol);
2209
2210
const parameterTypeNode = typeToTypeNode(parameterType, enclosingDeclaration);
2210
2211
// TODO: how should we clone members/modifiers?
2211
2212
// TODO: check initializer accessibility correctly.
2212
2213
const parameterNode = createParameter(
2213
- parameterDeclaration.decorators && parameterDeclaration.decorators.map(getSynthesizedDeepClone) ,
2214
- parameterDeclaration.modifiers && parameterDeclaration.modifiers.map(getSynthesizedDeepClone) ,
2214
+ parameterDeclaration.decorators,
2215
+ parameterDeclaration.modifiers,
2215
2216
parameterDeclaration.dotDotDotToken && createToken(SyntaxKind.DotDotDotToken),
2216
- getSynthesizedDeepClone( parameterDeclaration.name) ,
2217
+ parameterDeclaration.name,
2217
2218
parameterDeclaration.questionToken && createToken(SyntaxKind.QuestionToken),
2218
2219
parameterTypeNode,
2219
- parameterDeclaration.initializer && getSynthesizedDeepClone(parameterDeclaration.initializer) );
2220
+ parameterDeclaration.initializer);
2220
2221
return parameterNode;
2221
2222
}
2222
2223
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));
2227
2228
2228
2229
return createSignatureDeclaration(kind, typeParameters, parameters, type);
2229
2230
2230
- function createTypeNodeExceptAny (type: Type): TypeNode | undefined {
2231
+ function typeToTypeNodeExceptAny (type: Type): TypeNode | undefined {
2231
2232
const typeNode = typeToTypeNode(type, enclosingDeclaration);
2232
2233
return typeNode && typeNode.kind !== SyntaxKind.AnyKeyword ? typeNode : undefined;
2233
2234
}
@@ -2236,17 +2237,17 @@ namespace ts {
2236
2237
2237
2238
// function typeToDisplayParts
2238
2239
2239
- function typeToTypeNode(type: Type, enclosingDeclaration: Node, returnNodeOnError?: boolean): TypeNode {
2240
+ function typeToTypeNode(type: Type, enclosingDeclaration? : Node, returnNodeOnError?: boolean): TypeNode {
2240
2241
let encounteredError = false;
2241
2242
let inObjectTypeLiteral = false;
2242
2243
let checkAlias = true;
2243
2244
let symbolStack: Symbol[] = undefined;
2244
2245
2245
- const result = createTypeNodeWorker (type);
2246
+ const result = typeToTypeNodeWorker (type);
2246
2247
// returnNodeOnError = true; // TODO: unset.
2247
2248
return encounteredError && !returnNodeOnError ? undefined: result;
2248
2249
2249
- function createTypeNodeWorker (type: Type): TypeNode {
2250
+ function typeToTypeNodeWorker (type: Type): TypeNode {
2250
2251
if (!type) {
2251
2252
encounteredError = true;
2252
2253
return undefined;
@@ -2308,7 +2309,7 @@ namespace ts {
2308
2309
2309
2310
if (objectFlags & ObjectFlags.Reference) {
2310
2311
Debug.assert(!!(type.flags & TypeFlags.Object));
2311
- return createTypeReferenceNodeFromType (<TypeReference>type);
2312
+ return typeReferenceToTypeReferenceNode (<TypeReference>type);
2312
2313
}
2313
2314
if (objectFlags & ObjectFlags.ClassOrInterface) {
2314
2315
Debug.assert(!!(type.flags & TypeFlags.Object));
@@ -2347,25 +2348,25 @@ namespace ts {
2347
2348
2348
2349
if (type.flags & TypeFlags.Index) {
2349
2350
const indexedType = (<IndexType>type).type;
2350
- const indexTypeNode = createTypeNodeWorker (indexedType);
2351
+ const indexTypeNode = typeToTypeNodeWorker (indexedType);
2351
2352
return createTypeOperatorNode(indexTypeNode);
2352
2353
}
2353
2354
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);
2356
2357
return createIndexedAccessTypeNode(objectTypeNode, indexTypeNode);
2357
2358
}
2358
2359
2359
2360
Debug.fail("Should be unreachable.");
2360
2361
2361
2362
function mapToTypeNodeArray(types: Type[]): NodeArray<TypeNode> {
2362
- return types && asNodeArray(types.map(createTypeNodeWorker ) as TypeNode[]);
2363
+ return types && asNodeArray(types.map(typeToTypeNodeWorker ) as TypeNode[]);
2363
2364
}
2364
2365
2365
2366
function createMappedTypeNodeFromType(type: MappedType) {
2366
2367
Debug.assert(!!(type.flags & TypeFlags.Object));
2367
2368
const typeParameter = getTypeParameterFromMappedType(<MappedType>type);
2368
- const typeParameterNode = createTypeParameterDeclarationFromType (typeParameter, enclosingDeclaration);
2369
+ const typeParameterNode = typeParameterToDeclaration (typeParameter, enclosingDeclaration);
2369
2370
2370
2371
const templateTypeNode = typeToTypeNode(getTemplateTypeFromMappedType(<MappedType>type), enclosingDeclaration);
2371
2372
const readonlyToken = (<MappedType>type).declaration && (<MappedType>type).declaration.readonlyToken ? createToken(SyntaxKind.ReadonlyKeyword) : undefined;
@@ -2464,10 +2465,10 @@ namespace ts {
2464
2465
}
2465
2466
}
2466
2467
2467
- function createTypeReferenceNodeFromType (type: TypeReference) {
2468
+ function typeReferenceToTypeReferenceNode (type: TypeReference) {
2468
2469
const typeArguments: Type[] = type.typeArguments || emptyArray;
2469
2470
if (type.target === globalArrayType) {
2470
- const elementType = createTypeNodeWorker (typeArguments[0]);
2471
+ const elementType = typeToTypeNodeWorker (typeArguments[0]);
2471
2472
return createArrayTypeNode(elementType);
2472
2473
}
2473
2474
else if (type.target.objectFlags & ObjectFlags.Tuple) {
@@ -2489,21 +2490,20 @@ namespace ts {
2489
2490
// When type parameters are their own type arguments for the whole group (i.e. we have
2490
2491
// the default outer type arguments), we don't show the group.
2491
2492
if (!rangeEquals(outerTypeParameters, typeArguments, start, i)) {
2492
- const name = createNameFromSymbol(parent);
2493
- const qualifiedNamePart = name;
2493
+ const qualifiedNamePart = createNameFromSymbol(parent, /*mustBeIdentifier*/ true);
2494
2494
if (!qualifiedName) {
2495
- qualifiedName = createQualifiedName(qualifiedNamePart, /*right*/undefined);
2495
+ qualifiedName = createQualifiedName(qualifiedNamePart, /*right*/ undefined);
2496
2496
}
2497
2497
else {
2498
2498
Debug.assert(!qualifiedName.right);
2499
2499
qualifiedName.right = qualifiedNamePart;
2500
- qualifiedName = createQualifiedName(qualifiedName, /*right*/undefined);
2500
+ qualifiedName = createQualifiedName(qualifiedName, /*right*/ undefined);
2501
2501
}
2502
2502
}
2503
2503
}
2504
2504
}
2505
2505
let entityName: EntityName = undefined;
2506
- const nameIdentifier = createNameFromSymbol(type.symbol);
2506
+ const nameIdentifier = createNameFromSymbol(type.symbol, /*mustBeIdentifier*/ true );
2507
2507
if (qualifiedName) {
2508
2508
Debug.assert(!qualifiedName.right);
2509
2509
qualifiedName.right = nameIdentifier;
@@ -2544,7 +2544,7 @@ namespace ts {
2544
2544
if (!oldDeclaration) {
2545
2545
return;
2546
2546
}
2547
- const propertyName = getSynthesizedDeepClone( oldDeclaration.name) ;
2547
+ const propertyName = oldDeclaration.name;
2548
2548
const optionalToken = propertySymbol.flags & SymbolFlags.Optional ? createToken(SyntaxKind.QuestionToken) : undefined;;
2549
2549
if (propertySymbol.flags & (SymbolFlags.Function | SymbolFlags.Method) && !getPropertiesOfObjectType(propertyType).length) {
2550
2550
const signatures = getSignaturesOfType(propertyType, SignatureKind.Call);
@@ -2559,16 +2559,16 @@ namespace ts {
2559
2559
typeElements.push(createPropertySignature(
2560
2560
propertyName,
2561
2561
optionalToken,
2562
- createTypeNodeWorker (propertyType),
2562
+ typeToTypeNodeWorker (propertyType),
2563
2563
/*initializer*/undefined));
2564
2564
}
2565
2565
}
2566
2566
return typeElements.length ? typeElements : undefined;
2567
2567
}
2568
2568
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 {
2572
2572
let parentSymbol: Symbol;
2573
2573
let meaning: SymbolFlags;
2574
2574
@@ -2586,8 +2586,12 @@ namespace ts {
2586
2586
}
2587
2587
2588
2588
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);
2591
2595
2592
2596
function createEntityNameFromSymbolChain(chain: Symbol[], index: number): EntityName {
2593
2597
Debug.assert(chain && 0 <= index && index < chain.length);
0 commit comments