@@ -2235,14 +2235,14 @@ namespace ts {
2235
2235
let checkAlias = true;
2236
2236
let symbolStack: Symbol[] = undefined;
2237
2237
2238
- return typeToTypeNodeWorker(type, flags );
2238
+ return typeToTypeNodeWorker(type);
2239
2239
2240
- function typeToTypeNodeWorker(type: Type, flags: NodeBuilderFlags ): TypeNode {
2240
+ function typeToTypeNodeWorker(type: Type): TypeNode {
2241
2241
if (!type) {
2242
- encounteredError = encounteredError || !(flags & NodeBuilderFlags.allowUndefinedNode);
2242
+ encounteredError = true;
2243
+ // TODO(aozgaa): should we return implict any (undefined) or explicit any (keywordtypenode)?
2243
2244
return undefined;
2244
2245
}
2245
- flags = flags & ~NodeBuilderFlags.allowUndefinedNode;
2246
2246
2247
2247
if (type.flags & TypeFlags.Any) {
2248
2248
return createKeywordTypeNode(SyntaxKind.AnyKeyword);
@@ -2302,7 +2302,7 @@ namespace ts {
2302
2302
2303
2303
if (objectFlags & ObjectFlags.Reference) {
2304
2304
Debug.assert(!!(type.flags & TypeFlags.Object));
2305
- return typeReferenceToTypeReferenceNode (<TypeReference>type);
2305
+ return typeReferenceToTypeNode (<TypeReference>type);
2306
2306
}
2307
2307
if (objectFlags & ObjectFlags.ClassOrInterface) {
2308
2308
Debug.assert(!!(type.flags & TypeFlags.Object));
@@ -2339,27 +2339,28 @@ namespace ts {
2339
2339
2340
2340
if (type.flags & TypeFlags.Index) {
2341
2341
const indexedType = (<IndexType>type).type;
2342
- const indexTypeNode = typeToTypeNodeWorker(indexedType, flags );
2342
+ const indexTypeNode = typeToTypeNodeWorker(indexedType);
2343
2343
return createTypeOperatorNode(indexTypeNode);
2344
2344
}
2345
2345
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);
2348
2348
return createIndexedAccessTypeNode(objectTypeNode, indexTypeNode);
2349
2349
}
2350
2350
2351
2351
Debug.fail("Should be unreachable.");
2352
2352
2353
2353
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) );
2355
2355
}
2356
2356
2357
2357
function createMappedTypeNodeFromType(type: MappedType) {
2358
2358
Debug.assert(!!(type.flags & TypeFlags.Object));
2359
2359
const typeParameter = getTypeParameterFromMappedType(<MappedType>type);
2360
2360
const typeParameterNode = typeParameterToDeclaration(typeParameter, enclosingDeclaration, flags);
2361
2361
2362
- const templateTypeNode = typeToTypeNodeWorker(getTemplateTypeFromMappedType(<MappedType>type), flags | NodeBuilderFlags.allowUndefinedNode);
2362
+ const templateType = getTemplateTypeFromMappedType(<MappedType>type)
2363
+ const templateTypeNode = templateType && typeToTypeNodeWorker(templateType);
2363
2364
const readonlyToken = (<MappedType>type).declaration && (<MappedType>type).declaration.readonlyToken ? createToken(SyntaxKind.ReadonlyKeyword) : undefined;
2364
2365
const questionToken = (<MappedType>type).declaration && (<MappedType>type).declaration.questionToken ? createToken(SyntaxKind.QuestionToken) : undefined;
2365
2366
@@ -2456,10 +2457,10 @@ namespace ts {
2456
2457
}
2457
2458
}
2458
2459
2459
- function typeReferenceToTypeReferenceNode (type: TypeReference) {
2460
+ function typeReferenceToTypeNode (type: TypeReference) {
2460
2461
const typeArguments: Type[] = type.typeArguments || emptyArray;
2461
2462
if (type.target === globalArrayType) {
2462
- const elementType = typeToTypeNodeWorker(typeArguments[0], flags );
2463
+ const elementType = typeToTypeNodeWorker(typeArguments[0]);
2463
2464
return createArrayTypeNode(elementType);
2464
2465
}
2465
2466
else if (type.target.objectFlags & ObjectFlags.Tuple) {
@@ -2547,10 +2548,12 @@ namespace ts {
2547
2548
}
2548
2549
}
2549
2550
else {
2551
+ // TODO(aozgaa): should we create a node with explicit or implict any?
2552
+ const propertyTypeNode = propertyType ? typeToTypeNodeWorker(propertyType) : createKeywordTypeNode(SyntaxKind.AnyKeyword);
2550
2553
typeElements.push(createPropertySignature(
2551
2554
propertyName,
2552
2555
optionalToken,
2553
- typeToTypeNodeWorker(propertyType, flags) ,
2556
+ propertyTypeNode ,
2554
2557
/*initializer*/undefined));
2555
2558
}
2556
2559
}
@@ -2599,11 +2602,12 @@ namespace ts {
2599
2602
return undefined;
2600
2603
}
2601
2604
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);
2605
2609
const name = symbolToName(type.symbol, enclosingDeclaration, /*mustBeIdentifier*/ true, flags);
2606
- return createTypeParameterDeclaration(name, constraint, defaultParameter );
2610
+ return createTypeParameterDeclaration(name, constraintNode, defaultParameterNode );
2607
2611
}
2608
2612
2609
2613
function symbolToParameterDeclaration(parameterSymbol: Symbol, enclosingDeclaration: Node, flags: NodeBuilderFlags): ParameterDeclaration {
@@ -2635,7 +2639,7 @@ namespace ts {
2635
2639
const isTypeParameter = symbol.flags & SymbolFlags.TypeParameter;
2636
2640
if (!isTypeParameter && enclosingDeclaration) {
2637
2641
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.
2639
2643
Debug.assert(chain && chain.length > 0);
2640
2644
}
2641
2645
else {
@@ -2645,7 +2649,7 @@ namespace ts {
2645
2649
parentSymbol = undefined;
2646
2650
if (mustBeIdentifier && chain.length !== 1) {
2647
2651
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.
2649
2653
// Should error handling be more severe?
2650
2654
}
2651
2655
return createEntityNameFromSymbolChain(chain, chain.length - 1);
@@ -2656,7 +2660,7 @@ namespace ts {
2656
2660
const symbol = chain[index];
2657
2661
let typeParameterString = "";
2658
2662
if (index > 0) {
2659
- // TODO: is the parentSymbol wrong?
2663
+ // TODO(aozgaa) : is the parentSymbol wrong?
2660
2664
const parentSymbol = chain[index - 1];
2661
2665
let typeParameters: TypeParameter[];
2662
2666
if (getCheckFlags(symbol) & CheckFlags.Instantiated) {
0 commit comments