@@ -2235,14 +2235,14 @@ namespace ts {
22352235 let checkAlias = true;
22362236 let symbolStack: Symbol[] = undefined;
22372237
2238- return typeToTypeNodeWorker(type, flags );
2238+ return typeToTypeNodeWorker(type);
22392239
2240- function typeToTypeNodeWorker(type: Type, flags: NodeBuilderFlags ): TypeNode {
2240+ function typeToTypeNodeWorker(type: Type): TypeNode {
22412241 if (!type) {
2242- encounteredError = encounteredError || !(flags & NodeBuilderFlags.allowUndefinedNode);
2242+ encounteredError = true;
2243+ // TODO(aozgaa): should we return implict any (undefined) or explicit any (keywordtypenode)?
22432244 return undefined;
22442245 }
2245- flags = flags & ~NodeBuilderFlags.allowUndefinedNode;
22462246
22472247 if (type.flags & TypeFlags.Any) {
22482248 return createKeywordTypeNode(SyntaxKind.AnyKeyword);
@@ -2302,7 +2302,7 @@ namespace ts {
23022302
23032303 if (objectFlags & ObjectFlags.Reference) {
23042304 Debug.assert(!!(type.flags & TypeFlags.Object));
2305- return typeReferenceToTypeReferenceNode (<TypeReference>type);
2305+ return typeReferenceToTypeNode (<TypeReference>type);
23062306 }
23072307 if (objectFlags & ObjectFlags.ClassOrInterface) {
23082308 Debug.assert(!!(type.flags & TypeFlags.Object));
@@ -2339,27 +2339,28 @@ namespace ts {
23392339
23402340 if (type.flags & TypeFlags.Index) {
23412341 const indexedType = (<IndexType>type).type;
2342- const indexTypeNode = typeToTypeNodeWorker(indexedType, flags );
2342+ const indexTypeNode = typeToTypeNodeWorker(indexedType);
23432343 return createTypeOperatorNode(indexTypeNode);
23442344 }
23452345 if (type.flags & TypeFlags.IndexedAccess) {
2346- const objectTypeNode = typeToTypeNodeWorker((<IndexedAccessType>type).objectType, flags );
2347- const indexTypeNode = typeToTypeNodeWorker((<IndexedAccessType>type).indexType, flags );
2346+ const objectTypeNode = typeToTypeNodeWorker((<IndexedAccessType>type).objectType);
2347+ const indexTypeNode = typeToTypeNodeWorker((<IndexedAccessType>type).indexType);
23482348 return createIndexedAccessTypeNode(objectTypeNode, indexTypeNode);
23492349 }
23502350
23512351 Debug.fail("Should be unreachable.");
23522352
23532353 function mapToTypeNodeArray(types: Type[]): NodeArray<TypeNode> {
2354- return types && asNodeArray(types.map(typeToTypeNodeWorker) as TypeNode[] );
2354+ return types && asNodeArray(types.map(typeToTypeNodeWorker).filter(node => !!node) );
23552355 }
23562356
23572357 function createMappedTypeNodeFromType(type: MappedType) {
23582358 Debug.assert(!!(type.flags & TypeFlags.Object));
23592359 const typeParameter = getTypeParameterFromMappedType(<MappedType>type);
23602360 const typeParameterNode = typeParameterToDeclaration(typeParameter, enclosingDeclaration, flags);
23612361
2362- const templateTypeNode = typeToTypeNodeWorker(getTemplateTypeFromMappedType(<MappedType>type), flags | NodeBuilderFlags.allowUndefinedNode);
2362+ const templateType = getTemplateTypeFromMappedType(<MappedType>type)
2363+ const templateTypeNode = templateType && typeToTypeNodeWorker(templateType);
23632364 const readonlyToken = (<MappedType>type).declaration && (<MappedType>type).declaration.readonlyToken ? createToken(SyntaxKind.ReadonlyKeyword) : undefined;
23642365 const questionToken = (<MappedType>type).declaration && (<MappedType>type).declaration.questionToken ? createToken(SyntaxKind.QuestionToken) : undefined;
23652366
@@ -2456,10 +2457,10 @@ namespace ts {
24562457 }
24572458 }
24582459
2459- function typeReferenceToTypeReferenceNode (type: TypeReference) {
2460+ function typeReferenceToTypeNode (type: TypeReference) {
24602461 const typeArguments: Type[] = type.typeArguments || emptyArray;
24612462 if (type.target === globalArrayType) {
2462- const elementType = typeToTypeNodeWorker(typeArguments[0], flags );
2463+ const elementType = typeToTypeNodeWorker(typeArguments[0]);
24632464 return createArrayTypeNode(elementType);
24642465 }
24652466 else if (type.target.objectFlags & ObjectFlags.Tuple) {
@@ -2547,10 +2548,12 @@ namespace ts {
25472548 }
25482549 }
25492550 else {
2551+ // TODO(aozgaa): should we create a node with explicit or implict any?
2552+ const propertyTypeNode = propertyType ? typeToTypeNodeWorker(propertyType) : createKeywordTypeNode(SyntaxKind.AnyKeyword);
25502553 typeElements.push(createPropertySignature(
25512554 propertyName,
25522555 optionalToken,
2553- typeToTypeNodeWorker(propertyType, flags) ,
2556+ propertyTypeNode ,
25542557 /*initializer*/undefined));
25552558 }
25562559 }
@@ -2599,11 +2602,12 @@ namespace ts {
25992602 return undefined;
26002603 }
26012604
2602- const constraint = typeToTypeNodeHelper(getConstraintFromTypeParameter(type), enclosingDeclaration, flags | NodeBuilderFlags.allowUndefinedNode);
2603- const defaultParameter = typeToTypeNodeHelper(getDefaultFromTypeParameter(type), enclosingDeclaration, flags | NodeBuilderFlags.allowUndefinedNode);
2604- ;
2605+ const constraint = getConstraintFromTypeParameter(type);
2606+ const constraintNode = constraint && typeToTypeNodeHelper(constraint, enclosingDeclaration, flags);
2607+ const defaultParameter = getDefaultFromTypeParameter(type);
2608+ const defaultParameterNode = defaultParameter && typeToTypeNodeHelper(defaultParameter, enclosingDeclaration, flags);
26052609 const name = symbolToName(type.symbol, enclosingDeclaration, /*mustBeIdentifier*/ true, flags);
2606- return createTypeParameterDeclaration(name, constraint, defaultParameter );
2610+ return createTypeParameterDeclaration(name, constraintNode, defaultParameterNode );
26072611 }
26082612
26092613 function symbolToParameterDeclaration(parameterSymbol: Symbol, enclosingDeclaration: Node, flags: NodeBuilderFlags): ParameterDeclaration {
@@ -2635,7 +2639,7 @@ namespace ts {
26352639 const isTypeParameter = symbol.flags & SymbolFlags.TypeParameter;
26362640 if (!isTypeParameter && enclosingDeclaration) {
26372641 chain = getSymbolChain(symbol, meaning, /*endOfChain*/ true);
2638- // TODO: check whether type pointed to by symbol requires type arguments to be printed.
2642+ // TODO(aozgaa) : check whether type pointed to by symbol requires type arguments to be printed.
26392643 Debug.assert(chain && chain.length > 0);
26402644 }
26412645 else {
@@ -2645,7 +2649,7 @@ namespace ts {
26452649 parentSymbol = undefined;
26462650 if (mustBeIdentifier && chain.length !== 1) {
26472651 encounteredError = encounteredError || !(flags & NodeBuilderFlags.allowQualifedNameInPlaceOfIdentifier);
2648- // TODO: failing to get an identifier when we expect one generates an unprintable node.
2652+ // TODO(aozgaa) : failing to get an identifier when we expect one generates an unprintable node.
26492653 // Should error handling be more severe?
26502654 }
26512655 return createEntityNameFromSymbolChain(chain, chain.length - 1);
@@ -2656,7 +2660,7 @@ namespace ts {
26562660 const symbol = chain[index];
26572661 let typeParameterString = "";
26582662 if (index > 0) {
2659- // TODO: is the parentSymbol wrong?
2663+ // TODO(aozgaa) : is the parentSymbol wrong?
26602664 const parentSymbol = chain[index - 1];
26612665 let typeParameters: TypeParameter[];
26622666 if (getCheckFlags(symbol) & CheckFlags.Instantiated) {
0 commit comments