Skip to content

Commit dfb4df9

Browse files
author
Arthur Ozga
committed
move undefined handling to caller
1 parent 1f3029d commit dfb4df9

File tree

2 files changed

+28
-25
lines changed

2 files changed

+28
-25
lines changed

src/compiler/checker.ts

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {

src/compiler/types.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2540,11 +2540,10 @@ namespace ts {
25402540

25412541
export enum NodeBuilderFlags {
25422542
None = 0,
2543-
allowUndefinedNode = 1 << 0,
2544-
allowThisInObjectLiteral = 1 << 1,
2545-
allowQualifedNameInPlaceOfIdentifier = 1 << 2,
2546-
allowTypeParameterInQualifiedName = 1 << 3,
2547-
allowAnonymousIdentifier = 1 << 4
2543+
allowThisInObjectLiteral = 1 << 0,
2544+
allowQualifedNameInPlaceOfIdentifier = 1 << 1,
2545+
allowTypeParameterInQualifiedName = 1 << 2,
2546+
allowAnonymousIdentifier = 1 << 3
25482547
}
25492548

25502549
export interface SymbolDisplayBuilder {

0 commit comments

Comments
 (0)