@@ -2279,7 +2279,7 @@ namespace ts {
22792279 }
22802280
22812281 function typeToString(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string {
2282- const typeNode = nodeBuilder.typeToTypeNode(type, enclosingDeclaration, toNodeBuilderFlags(flags) | NodeBuilderFlags.ignoreErrors);
2282+ const typeNode = nodeBuilder.typeToTypeNode(type, enclosingDeclaration, toNodeBuilderFlags(flags) | NodeBuilderFlags.ignoreErrors | NodeBuilderFlags.WriteTypeParametersInQualifiedName );
22832283 Debug.assert(typeNode !== undefined, "should always get typenode?");
22842284 const options = { removeComments: true };
22852285 const writer = createTextWriter("");
@@ -2360,10 +2360,8 @@ namespace ts {
23602360 }
23612361
23622362 function typeToTypeNodeHelper(type: Type, context: NodeBuilderContext): TypeNode {
2363- const inElementType = context.flags & NodeBuilderFlags.InElementType;
2364- const inFirstTypeArgument = context.flags & NodeBuilderFlags.InFirstTypeArgument;
23652363 const inTypeAlias = context.flags & NodeBuilderFlags.InTypeAlias;
2366- context.flags &= ~(NodeBuilderFlags.StateClearingFlags );
2364+ context.flags &= ~(NodeBuilderFlags.InTypeAlias );
23672365
23682366 if (!type) {
23692367 context.encounteredError = true;
@@ -2443,15 +2441,15 @@ namespace ts {
24432441 if (!inTypeAlias && type.aliasSymbol &&
24442442 isSymbolAccessible(type.aliasSymbol, context.enclosingDeclaration, SymbolFlags.Type, /*shouldComputeAliasesToMakeVisible*/ false).accessibility === SymbolAccessibility.Accessible) {
24452443 const name = symbolToTypeReferenceName(type.aliasSymbol);
2446- const typeArgumentNodes = toTypeArgumentNodes (type.aliasTypeArguments, context);
2444+ const typeArgumentNodes = type.aliasTypeArguments && mapToTypeNodeArray (type.aliasTypeArguments, context);
24472445 return createTypeReferenceNode(name, typeArgumentNodes);
24482446 }
24492447 if (type.flags & (TypeFlags.Union | TypeFlags.Intersection)) {
24502448 const types = type.flags & TypeFlags.Union ? formatUnionTypes((<UnionType>type).types) : (<IntersectionType>type).types;
2451- const typeNodes = types && mapToTypeNodeArray(types, context, /*addInElementTypeFlag*/ true, /*addInFirstTypeArgumentFlag*/ false );
2449+ const typeNodes = types && mapToTypeNodeArray(types, context);
24522450 if (typeNodes && typeNodes.length > 0) {
24532451 const unionOrIntersectionTypeNode = createUnionOrIntersectionTypeNode(type.flags & TypeFlags.Union ? SyntaxKind.UnionType : SyntaxKind.IntersectionType, typeNodes);
2454- return inElementType ? createParenthesizedType(unionOrIntersectionTypeNode) : unionOrIntersectionTypeNode;
2452+ return unionOrIntersectionTypeNode;
24552453 }
24562454 else {
24572455 if (!context.encounteredError && !(context.flags & NodeBuilderFlags.AllowEmptyUnionOrIntersection)) {
@@ -2467,15 +2465,11 @@ namespace ts {
24672465 }
24682466 if (type.flags & TypeFlags.Index) {
24692467 const indexedType = (<IndexType>type).type;
2470- context.flags |= NodeBuilderFlags.InElementType;
24712468 const indexTypeNode = typeToTypeNodeHelper(indexedType, context);
2472- Debug.assert(!(context.flags & NodeBuilderFlags.InElementType));
24732469 return createTypeOperatorNode(indexTypeNode);
24742470 }
24752471 if (type.flags & TypeFlags.IndexedAccess) {
2476- context.flags |= NodeBuilderFlags.InElementType;
24772472 const objectTypeNode = typeToTypeNodeHelper((<IndexedAccessType>type).objectType, context);
2478- Debug.assert(!(context.flags & NodeBuilderFlags.InElementType));
24792473 const indexTypeNode = typeToTypeNodeHelper((<IndexedAccessType>type).indexType, context);
24802474 return createIndexedAccessTypeNode(objectTypeNode, indexTypeNode);
24812475 }
@@ -2561,17 +2555,14 @@ namespace ts {
25612555 if (resolved.callSignatures.length === 1 && !resolved.constructSignatures.length) {
25622556 const signature = resolved.callSignatures[0];
25632557 const signatureNode = <FunctionTypeNode>signatureToSignatureDeclarationHelper(signature, SyntaxKind.FunctionType, context);
2564- return shouldAddParenthesisAroundFunctionType(signature, context) ?
2565- createParenthesizedType(signatureNode) :
2566- signatureNode;
2558+ return signatureNode;
25672559
25682560 }
2561+
25692562 if (resolved.constructSignatures.length === 1 && !resolved.callSignatures.length) {
25702563 const signature = resolved.constructSignatures[0];
25712564 const signatureNode = <ConstructorTypeNode>signatureToSignatureDeclarationHelper(signature, SyntaxKind.ConstructorType, context);
2572- return shouldAddParenthesisAroundFunctionType(signature, context) ?
2573- createParenthesizedType(signatureNode) :
2574- signatureNode;
2565+ return signatureNode;
25752566 }
25762567 }
25772568
@@ -2583,19 +2574,6 @@ namespace ts {
25832574 return setEmitFlags(typeLiteralNode, EmitFlags.SingleLine);
25842575 }
25852576
2586- function shouldAddParenthesisAroundFunctionType(callSignature: Signature, context: NodeBuilderContext) {
2587- if (inElementType) {
2588- return true;
2589- }
2590- else if (inFirstTypeArgument) {
2591- // Add parenthesis around function type for the first type argument to avoid ambiguity
2592- const typeParameters = callSignature.target && (context.flags & NodeBuilderFlags.WriteTypeArgumentsOfSignature) ?
2593- callSignature.target.typeParameters : callSignature.typeParameters;
2594- return typeParameters && typeParameters.length !== 0;
2595- }
2596- return false;
2597- }
2598-
25992577 function createTypeQueryNodeFromSymbol(symbol: Symbol, symbolFlags: SymbolFlags) {
26002578 const entityName = symbolToName(symbol, context, symbolFlags, /*expectsIdentifier*/ false);
26012579 return createTypeQueryNode(entityName);
@@ -2615,15 +2593,13 @@ namespace ts {
26152593 return createTypeReferenceNode("Array", [typeArgumentNode]);
26162594 }
26172595
2618- context.flags |= NodeBuilderFlags.InElementType;
26192596 const elementType = typeToTypeNodeHelper(typeArguments[0], context);
2620- Debug.assert(!(context.flags & NodeBuilderFlags.InElementType));
2621-
26222597 return createArrayTypeNode(elementType);
26232598 }
26242599 else if (type.target.objectFlags & ObjectFlags.Tuple) {
26252600 if (typeArguments.length > 0) {
2626- const tupleConstituentNodes = mapToTypeNodeArray(typeArguments.slice(0, getTypeReferenceArity(type)), context, /*addInElementTypeFlag*/ false, /*addInFirstTypeArgumentFlag*/ false);
2601+ const slice = typeArguments.slice(0, getTypeReferenceArity(type));
2602+ const tupleConstituentNodes = slice && mapToTypeNodeArray(slice, context);
26272603 if (tupleConstituentNodes && tupleConstituentNodes.length > 0) {
26282604 return createTupleTypeNode(tupleConstituentNodes);
26292605 }
@@ -2649,7 +2625,8 @@ namespace ts {
26492625 // When type parameters are their own type arguments for the whole group (i.e. we have
26502626 // the default outer type arguments), we don't show the group.
26512627 if (!rangeEquals(outerTypeParameters, typeArguments, start, i)) {
2652- const typeArgumentNodes = createNodeArray(toTypeArgumentNodes(typeArguments.slice(start, i), context));
2628+ const slice = typeArguments.slice(start, i);
2629+ const typeArgumentNodes = slice && createNodeArray(mapToTypeNodeArray(slice, context));
26532630 const namePart = symbolToTypeReferenceName(parent);
26542631 (namePart.kind === SyntaxKind.Identifier ? <Identifier>namePart : namePart.right).typeArguments = typeArgumentNodes;
26552632
@@ -2680,7 +2657,7 @@ namespace ts {
26802657 if (some(typeArguments)) {
26812658 const typeParameterCount = (type.target.typeParameters || emptyArray).length;
26822659 const slice = typeArguments && typeArguments.slice(i, typeParameterCount);
2683- typeArgumentNodes = toTypeArgumentNodes (slice, context);
2660+ typeArgumentNodes = slice && mapToTypeNodeArray (slice, context);
26842661 }
26852662
26862663 if (typeArgumentNodes) {
@@ -2763,28 +2740,17 @@ namespace ts {
27632740 }
27642741 }
27652742
2766- function mapToTypeNodeArray(types: Type[], context: NodeBuilderContext, addInElementTypeFlag: boolean, addInFirstTypeArgumentFlag: boolean ): TypeNode[] {
2743+ function mapToTypeNodeArray(types: Type[], context: NodeBuilderContext): TypeNode[] {
27672744 const result = [];
2768- Debug.assert(!(context.flags & NodeBuilderFlags.InElementType), "should be unset at the beginning of the helper");
27692745 for (let i = 0; i < types.length; ++i) {
27702746 const type = types[i];
2771- if (addInElementTypeFlag) {
2772- context.flags |= NodeBuilderFlags.InElementType;
2773- }
2774- if (i === 0 && addInFirstTypeArgumentFlag) {
2775- context.flags |= NodeBuilderFlags.InFirstTypeArgument;
2776- }
27772747 const typeNode = typeToTypeNodeHelper(type, context);
27782748 if (typeNode) {
27792749 result.push(typeNode);
27802750 }
27812751 }
2782- Debug.assert(!(context.flags & NodeBuilderFlags.InElementType), "should be unset at the end of the helper");
2783- return result;
2784- }
27852752
2786- function toTypeArgumentNodes(typeArguments: Type[], context: NodeBuilderContext) {
2787- return typeArguments && mapToTypeNodeArray(typeArguments, context, /*addInElementTypeFlag*/ false, /*addInFirstTypeArgumentFlag*/ true);
2753+ return result;
27882754 }
27892755
27902756 function indexInfoToIndexSignatureDeclarationHelper(indexInfo: IndexInfo, kind: IndexKind, context: NodeBuilderContext): IndexSignatureDeclaration {
@@ -2909,7 +2875,7 @@ namespace ts {
29092875 Debug.assert(chain && 0 <= index && index < chain.length);
29102876 const symbol = chain[index];
29112877 let typeParameterNodes: TypeNode[] | undefined;
2912- if (index > 0) {
2878+ if (context.flags & NodeBuilderFlags.WriteTypeParametersInQualifiedName && index > 0) {
29132879 const parentSymbol = chain[index - 1];
29142880 let typeParameters: TypeParameter[];
29152881 if (getCheckFlags(symbol) & CheckFlags.Instantiated) {
@@ -2921,11 +2887,9 @@ namespace ts {
29212887 typeParameters = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol);
29222888 }
29232889 }
2890+
29242891 if (typeParameters && typeParameters.length > 0) {
2925- if (!context.encounteredError && !(context.flags & NodeBuilderFlags.AllowTypeParameterInQualifiedName)) {
2926- context.encounteredError = true;
2927- }
2928- typeParameterNodes = toTypeArgumentNodes(typeParameters, context);
2892+ typeParameterNodes = mapToTypeNodeArray(typeParameters, context);
29292893 }
29302894 }
29312895
0 commit comments