@@ -2191,23 +2191,23 @@ namespace ts {
21912191 return result;
21922192 }
21932193
2194- function createTypeParameterDeclarationFromType(type: TypeParameter): TypeParameterDeclaration {
2194+ function createTypeParameterDeclarationFromType(type: TypeParameter, enclosingDeclaration: Node ): TypeParameterDeclaration {
21952195 if (!(type && type.symbol && type.flags & TypeFlags.TypeParameter)) {
21962196 return undefined;
21972197 }
21982198
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) ;
22012201
22022202 const name = symbolToString(type.symbol);
22032203 return createTypeParameterDeclaration(name, constraint, defaultParameter);
22042204 }
22052205
22062206 // TODO: enclosing declaration appears to be unused in getTypeOfSymbolAtLocation
2207- function createParameterDeclarationFromSymbol(parameterSymbol: Symbol): ParameterDeclaration {
2207+ function createParameterDeclarationFromSymbol(parameterSymbol: Symbol, enclosingDeclaration: Node ): ParameterDeclaration {
22082208 const parameterDeclaration = parameterSymbol.declarations[0] as ParameterDeclaration;
22092209 const parameterType = getTypeOfSymbol(parameterSymbol);
2210- const parameterTypeNode = checker. createTypeNode(parameterType);
2210+ const parameterTypeNode = createTypeNode(parameterType, enclosingDeclaration );
22112211 // TODO: clone binding names correctly.
22122212 // TODO: copy initialzer in a way that checks whether all symbols used in expression are accessible here, and qualify them appropriately.
22132213 const parameterNode = createParameter(
@@ -2222,25 +2222,24 @@ namespace ts {
22222222 }
22232223
22242224 // 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 {
22262226 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) ),
22292229 type: createTypeNodeExceptAny(getReturnTypeOfSignature(signature))
22302230 }
22312231
22322232 function createTypeNodeExceptAny(type: Type): TypeNode | undefined {
2233- const typeNode = createTypeNode(type);
2233+ const typeNode = createTypeNode(type, enclosingDeclaration );
22342234 return typeNode && typeNode.kind !== SyntaxKind.AnyKeyword ? typeNode : undefined;
22352235 }
22362236 }
22372237
2238- function createTypeNode(type: Type): TypeNode {
2238+ function createTypeNode(type: Type, enclosingDeclaration: Node ): TypeNode {
22392239 let undefinedArgumentIsError = true;
22402240 let encounteredError = false;
22412241 let inObjectTypeLiteral = false;
22422242 let checkAlias = true;
2243- let enclosingDeclaration: Node = undefined; // TODO: add parameter.
22442243 let symbolStack: Symbol[] = undefined;
22452244
22462245 let result = createTypeNodeWorker(type);
@@ -2256,7 +2255,7 @@ namespace ts {
22562255 return undefined;
22572256 }
22582257
2259- const typeString = typeToString(type); typeString; // TODO: remove.
2258+ const typeString = typeToString(type, enclosingDeclaration ); typeString; // TODO: remove.
22602259
22612260 if (type.flags & TypeFlags.Any) {
22622261 // TODO: add other case where type ends up being `any`.
@@ -2315,15 +2314,8 @@ namespace ts {
23152314
23162315 if (objectFlags & ObjectFlags.Reference) {
23172316 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.
23212317 return createTypeReferenceNodeFromType(<TypeReference>type);
23222318 }
2323-
2324- if (type.flags & TypeFlags.EnumLiteral) {
2325- throw new Error("Enum literal not implemented");
2326- }
23272319 if (objectFlags & ObjectFlags.ClassOrInterface) {
23282320 Debug.assert(!!(type.flags & TypeFlags.Object));
23292321 // TODO: Detect whether class is named and fail if not.
@@ -2397,9 +2389,9 @@ namespace ts {
23972389 // TODO: does typeParameter have the same constraint or do we need to overwrite it somehow?
23982390 const typeParameter = getTypeParameterFromMappedType(<MappedType>type);
23992391 // const constraintType = getConstraintTypeFromMappedType(<MappedType>type);
2400- const typeParameterNode = createTypeParameterDeclarationFromType(typeParameter);
2392+ const typeParameterNode = createTypeParameterDeclarationFromType(typeParameter, enclosingDeclaration );
24012393
2402- const templateTypeNode = createTypeNode(getTemplateTypeFromMappedType(<MappedType>type));
2394+ const templateTypeNode = createTypeNode(getTemplateTypeFromMappedType(<MappedType>type), enclosingDeclaration );
24032395 const readonlyToken = (<MappedType>type).declaration && (<MappedType>type).declaration.readonlyToken ? createToken(SyntaxKind.ReadonlyKeyword) : undefined;
24042396 const questionToken = (<MappedType>type).declaration && (<MappedType>type).declaration.questionToken ? createToken(SyntaxKind.QuestionToken) : undefined;
24052397
@@ -2474,12 +2466,12 @@ namespace ts {
24742466
24752467 if (resolved.callSignatures.length === 1 && !resolved.constructSignatures.length) {
24762468 const signature = resolved.callSignatures[0];
2477- const signatureParts = createSignatureParts(signature);
2469+ const signatureParts = createSignatureParts(signature, enclosingDeclaration );
24782470 return createSignatureDeclaration<FunctionTypeNode>(SyntaxKind.FunctionType, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type);
24792471 }
24802472 if (resolved.constructSignatures.length === 1 && !resolved.callSignatures.length) {
24812473 const signature = resolved.constructSignatures[0];
2482- const signatureParts = createSignatureParts(signature);
2474+ const signatureParts = createSignatureParts(signature, enclosingDeclaration );
24832475 return createSignatureDeclaration<ConstructorTypeNode>(SyntaxKind.ConstructorType, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type);
24842476 }
24852477 }
@@ -2559,18 +2551,18 @@ namespace ts {
25592551 function createTypeNodesFromResolvedType(resolvedType: ResolvedType): TypeElement[] {
25602552 const typeElements: TypeElement[] = [];
25612553 for (const signature of resolvedType.callSignatures) {
2562- const signatureParts = createSignatureParts(signature);
2554+ const signatureParts = createSignatureParts(signature, enclosingDeclaration );
25632555 typeElements.push(createSignatureDeclaration<CallSignatureDeclaration>(SyntaxKind.CallSignature, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type));
25642556 }
25652557 for (const signature of resolvedType.constructSignatures) {
2566- const signatureParts = createSignatureParts(signature);
2558+ const signatureParts = createSignatureParts(signature, enclosingDeclaration );
25672559 typeElements.push(createSignatureDeclaration<ConstructSignatureDeclaration>(SyntaxKind.ConstructSignature, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type));
25682560 }
25692561 if (resolvedType.stringIndexInfo) {
2570- typeElements.push(createIndexSignatureFromIndexInfo(resolvedType.stringIndexInfo, IndexKind.String));
2562+ typeElements.push(createIndexSignatureFromIndexInfo(resolvedType.stringIndexInfo, IndexKind.String, enclosingDeclaration ));
25712563 }
25722564 if (resolvedType.numberIndexInfo) {
2573- typeElements.push(createIndexSignatureFromIndexInfo(resolvedType.numberIndexInfo, IndexKind.Number));
2565+ typeElements.push(createIndexSignatureFromIndexInfo(resolvedType.numberIndexInfo, IndexKind.Number, enclosingDeclaration ));
25742566 }
25752567
25762568 const properties = resolvedType.properties;
@@ -2589,7 +2581,7 @@ namespace ts {
25892581 if (propertySymbol.flags & (SymbolFlags.Function | SymbolFlags.Method) && !getPropertiesOfObjectType(propertyType).length) {
25902582 const signatures = getSignaturesOfType(propertyType, SignatureKind.Call);
25912583 for (const signature of signatures) {
2592- const signatureParts = createSignatureParts(signature);
2584+ const signatureParts = createSignatureParts(signature, enclosingDeclaration );
25932585 const methodDeclaration = createSignatureDeclaration<MethodSignature>(SyntaxKind.MethodSignature, signatureParts.typeParameters, signatureParts.parameters, signatureParts.type, propertyName, optionalToken);
25942586 methodDeclaration.questionToken = optionalToken;
25952587 typeElements.push(methodDeclaration);
@@ -2599,7 +2591,7 @@ namespace ts {
25992591 typeElements.push(createPropertySignature(
26002592 propertyName
26012593 , optionalToken
2602- , createTypeNode (propertyType)
2594+ , createTypeNodeWorker (propertyType)
26032595 , /*initializer*/undefined));
26042596 }
26052597 }
@@ -2608,7 +2600,7 @@ namespace ts {
26082600 }
26092601 }
26102602
2611- function createIndexSignatureFromIndexInfo(indexInfo: IndexInfo, kind: IndexKind): IndexSignatureDeclaration {
2603+ function createIndexSignatureFromIndexInfo(indexInfo: IndexInfo, kind: IndexKind, enclosingDeclaration: Node ): IndexSignatureDeclaration {
26122604 const indexerTypeNode = createKeywordTypeNode(kind === IndexKind.String ? SyntaxKind.StringKeyword : SyntaxKind.NumberKeyword);
26132605
26142606 const name = getNameFromIndexInfo(indexInfo);
@@ -2620,7 +2612,7 @@ namespace ts {
26202612 , /*questionToken*/ undefined
26212613 , indexerTypeNode
26222614 , /*initializer*/ undefined);
2623- const typeNode = createTypeNode(indexInfo.type);
2615+ const typeNode = createTypeNode(indexInfo.type, enclosingDeclaration );
26242616 return createIndexSignatureDeclaration(
26252617 [indexingParameter]
26262618 , typeNode
0 commit comments