@@ -2191,23 +2191,23 @@ namespace ts {
2191
2191
return result;
2192
2192
}
2193
2193
2194
- function createTypeParameterDeclarationFromType(type: TypeParameter): TypeParameterDeclaration {
2194
+ function createTypeParameterDeclarationFromType(type: TypeParameter, enclosingDeclaration: Node ): TypeParameterDeclaration {
2195
2195
if (!(type && type.symbol && type.flags & TypeFlags.TypeParameter)) {
2196
2196
return undefined;
2197
2197
}
2198
2198
2199
- const constraint = createTypeNode(getConstraintFromTypeParameter(type)) as TypeNode ;
2200
- const defaultParameter = createTypeNode(getDefaultFromTypeParameter(type)) as TypeNode ;
2199
+ const constraint = createTypeNode(getConstraintFromTypeParameter(type), enclosingDeclaration) ;
2200
+ const defaultParameter = createTypeNode(getDefaultFromTypeParameter(type), enclosingDeclaration) ;
2201
2201
2202
2202
const name = symbolToString(type.symbol);
2203
2203
return createTypeParameterDeclaration(name, constraint, defaultParameter);
2204
2204
}
2205
2205
2206
2206
// TODO: enclosing declaration appears to be unused in getTypeOfSymbolAtLocation
2207
- function createParameterDeclarationFromSymbol(parameterSymbol: Symbol): ParameterDeclaration {
2207
+ function createParameterDeclarationFromSymbol(parameterSymbol: Symbol, enclosingDeclaration: Node ): ParameterDeclaration {
2208
2208
const parameterDeclaration = parameterSymbol.declarations[0] as ParameterDeclaration;
2209
2209
const parameterType = getTypeOfSymbol(parameterSymbol);
2210
- const parameterTypeNode = checker. createTypeNode(parameterType);
2210
+ const parameterTypeNode = createTypeNode(parameterType, enclosingDeclaration );
2211
2211
// TODO: clone binding names correctly.
2212
2212
// TODO: copy initialzer in a way that checks whether all symbols used in expression are accessible here, and qualify them appropriately.
2213
2213
const parameterNode = createParameter(
@@ -2222,25 +2222,24 @@ namespace ts {
2222
2222
}
2223
2223
2224
2224
// TODO: expose this, remove copy from helper, possibly don't expose createParameter/TypeParameter?
2225
- function createSignatureParts(signature: Signature): SignatureParts {
2225
+ function createSignatureParts(signature: Signature, enclosingDeclaration: Node ): SignatureParts {
2226
2226
return {
2227
- typeParameters: signature.typeParameters && signature.typeParameters.map(createTypeParameterDeclarationFromType),
2228
- parameters: signature.parameters.map(createParameterDeclarationFromSymbol),
2227
+ typeParameters: signature.typeParameters && signature.typeParameters.map(parameter => createTypeParameterDeclarationFromType(parameter,enclosingDeclaration) ),
2228
+ parameters: signature.parameters.map(parameter => createParameterDeclarationFromSymbol(parameter,enclosingDeclaration) ),
2229
2229
type: createTypeNodeExceptAny(getReturnTypeOfSignature(signature))
2230
2230
}
2231
2231
2232
2232
function createTypeNodeExceptAny(type: Type): TypeNode | undefined {
2233
- const typeNode = createTypeNode(type);
2233
+ const typeNode = createTypeNode(type, enclosingDeclaration );
2234
2234
return typeNode && typeNode.kind !== SyntaxKind.AnyKeyword ? typeNode : undefined;
2235
2235
}
2236
2236
}
2237
2237
2238
- function createTypeNode(type: Type): TypeNode {
2238
+ function createTypeNode(type: Type, enclosingDeclaration: Node ): TypeNode {
2239
2239
let undefinedArgumentIsError = true;
2240
2240
let encounteredError = false;
2241
2241
let inObjectTypeLiteral = false;
2242
2242
let checkAlias = true;
2243
- let enclosingDeclaration: Node = undefined; // TODO: add parameter.
2244
2243
let symbolStack: Symbol[] = undefined;
2245
2244
2246
2245
let result = createTypeNodeWorker(type);
@@ -2256,7 +2255,7 @@ namespace ts {
2256
2255
return undefined;
2257
2256
}
2258
2257
2259
- const typeString = typeToString(type); typeString; // TODO: remove.
2258
+ const typeString = typeToString(type, enclosingDeclaration ); typeString; // TODO: remove.
2260
2259
2261
2260
if (type.flags & TypeFlags.Any) {
2262
2261
// TODO: add other case where type ends up being `any`.
@@ -2315,15 +2314,8 @@ namespace ts {
2315
2314
2316
2315
if (objectFlags & ObjectFlags.Reference) {
2317
2316
Debug.assert(!!(type.flags & TypeFlags.Object));
2318
- // and vice versa.
2319
- // this case includes tuple types
2320
- // TODO: test empty tuples, see if they are coherent.
2321
2317
return createTypeReferenceNodeFromType(<TypeReference>type);
2322
2318
}
2323
-
2324
- if (type.flags & TypeFlags.EnumLiteral) {
2325
- throw new Error("Enum literal not implemented");
2326
- }
2327
2319
if (objectFlags & ObjectFlags.ClassOrInterface) {
2328
2320
Debug.assert(!!(type.flags & TypeFlags.Object));
2329
2321
// TODO: Detect whether class is named and fail if not.
@@ -2397,9 +2389,9 @@ namespace ts {
2397
2389
// TODO: does typeParameter have the same constraint or do we need to overwrite it somehow?
2398
2390
const typeParameter = getTypeParameterFromMappedType(<MappedType>type);
2399
2391
// const constraintType = getConstraintTypeFromMappedType(<MappedType>type);
2400
- const typeParameterNode = createTypeParameterDeclarationFromType(typeParameter);
2392
+ const typeParameterNode = createTypeParameterDeclarationFromType(typeParameter, enclosingDeclaration );
2401
2393
2402
- const templateTypeNode = createTypeNode(getTemplateTypeFromMappedType(<MappedType>type));
2394
+ const templateTypeNode = createTypeNode(getTemplateTypeFromMappedType(<MappedType>type), enclosingDeclaration );
2403
2395
const readonlyToken = (<MappedType>type).declaration && (<MappedType>type).declaration.readonlyToken ? createToken(SyntaxKind.ReadonlyKeyword) : undefined;
2404
2396
const questionToken = (<MappedType>type).declaration && (<MappedType>type).declaration.questionToken ? createToken(SyntaxKind.QuestionToken) : undefined;
2405
2397
@@ -2474,12 +2466,12 @@ namespace ts {
2474
2466
2475
2467
if (resolved.callSignatures.length === 1 && !resolved.constructSignatures.length) {
2476
2468
const signature = resolved.callSignatures[0];
2477
- const signatureParts = createSignatureParts(signature);
2469
+ const signatureParts = createSignatureParts(signature, enclosingDeclaration );
2478
2470
return createSignatureDeclaration<FunctionTypeNode>(SyntaxKind.FunctionType, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type);
2479
2471
}
2480
2472
if (resolved.constructSignatures.length === 1 && !resolved.callSignatures.length) {
2481
2473
const signature = resolved.constructSignatures[0];
2482
- const signatureParts = createSignatureParts(signature);
2474
+ const signatureParts = createSignatureParts(signature, enclosingDeclaration );
2483
2475
return createSignatureDeclaration<ConstructorTypeNode>(SyntaxKind.ConstructorType, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type);
2484
2476
}
2485
2477
}
@@ -2559,18 +2551,18 @@ namespace ts {
2559
2551
function createTypeNodesFromResolvedType(resolvedType: ResolvedType): TypeElement[] {
2560
2552
const typeElements: TypeElement[] = [];
2561
2553
for (const signature of resolvedType.callSignatures) {
2562
- const signatureParts = createSignatureParts(signature);
2554
+ const signatureParts = createSignatureParts(signature, enclosingDeclaration );
2563
2555
typeElements.push(createSignatureDeclaration<CallSignatureDeclaration>(SyntaxKind.CallSignature, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type));
2564
2556
}
2565
2557
for (const signature of resolvedType.constructSignatures) {
2566
- const signatureParts = createSignatureParts(signature);
2558
+ const signatureParts = createSignatureParts(signature, enclosingDeclaration );
2567
2559
typeElements.push(createSignatureDeclaration<ConstructSignatureDeclaration>(SyntaxKind.ConstructSignature, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type));
2568
2560
}
2569
2561
if (resolvedType.stringIndexInfo) {
2570
- typeElements.push(createIndexSignatureFromIndexInfo(resolvedType.stringIndexInfo, IndexKind.String));
2562
+ typeElements.push(createIndexSignatureFromIndexInfo(resolvedType.stringIndexInfo, IndexKind.String, enclosingDeclaration ));
2571
2563
}
2572
2564
if (resolvedType.numberIndexInfo) {
2573
- typeElements.push(createIndexSignatureFromIndexInfo(resolvedType.numberIndexInfo, IndexKind.Number));
2565
+ typeElements.push(createIndexSignatureFromIndexInfo(resolvedType.numberIndexInfo, IndexKind.Number, enclosingDeclaration ));
2574
2566
}
2575
2567
2576
2568
const properties = resolvedType.properties;
@@ -2589,7 +2581,7 @@ namespace ts {
2589
2581
if (propertySymbol.flags & (SymbolFlags.Function | SymbolFlags.Method) && !getPropertiesOfObjectType(propertyType).length) {
2590
2582
const signatures = getSignaturesOfType(propertyType, SignatureKind.Call);
2591
2583
for (const signature of signatures) {
2592
- const signatureParts = createSignatureParts(signature);
2584
+ const signatureParts = createSignatureParts(signature, enclosingDeclaration );
2593
2585
const methodDeclaration = createSignatureDeclaration<MethodSignature>(SyntaxKind.MethodSignature, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type, propertyName, optionalToken);
2594
2586
methodDeclaration.questionToken = optionalToken;
2595
2587
typeElements.push(methodDeclaration);
@@ -2599,7 +2591,7 @@ namespace ts {
2599
2591
typeElements.push(createPropertySignature(
2600
2592
propertyName
2601
2593
, optionalToken
2602
- , createTypeNode (propertyType)
2594
+ , createTypeNodeWorker (propertyType)
2603
2595
, /*initializer*/undefined));
2604
2596
}
2605
2597
}
@@ -2608,7 +2600,7 @@ namespace ts {
2608
2600
}
2609
2601
}
2610
2602
2611
- function createIndexSignatureFromIndexInfo(indexInfo: IndexInfo, kind: IndexKind): IndexSignatureDeclaration {
2603
+ function createIndexSignatureFromIndexInfo(indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration: Node ): IndexSignatureDeclaration {
2612
2604
const indexerTypeNode = createKeywordTypeNode(kind === IndexKind.String ? SyntaxKind.StringKeyword : SyntaxKind.NumberKeyword);
2613
2605
2614
2606
const name = getNameFromIndexInfo(indexInfo);
@@ -2620,7 +2612,7 @@ namespace ts {
2620
2612
, /*questionToken*/ undefined
2621
2613
, indexerTypeNode
2622
2614
, /*initializer*/ undefined);
2623
- const typeNode = createTypeNode(indexInfo.type);
2615
+ const typeNode = createTypeNode(indexInfo.type, enclosingDeclaration );
2624
2616
return createIndexSignatureDeclaration(
2625
2617
[indexingParameter]
2626
2618
, typeNode
0 commit comments