@@ -2279,7 +2279,7 @@ namespace ts {
2279
2279
}
2280
2280
2281
2281
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 );
2283
2283
Debug.assert(typeNode !== undefined, "should always get typenode?");
2284
2284
const options = { removeComments: true };
2285
2285
const writer = createTextWriter("");
@@ -2360,10 +2360,8 @@ namespace ts {
2360
2360
}
2361
2361
2362
2362
function typeToTypeNodeHelper(type: Type, context: NodeBuilderContext): TypeNode {
2363
- const inElementType = context.flags & NodeBuilderFlags.InElementType;
2364
- const inFirstTypeArgument = context.flags & NodeBuilderFlags.InFirstTypeArgument;
2365
2363
const inTypeAlias = context.flags & NodeBuilderFlags.InTypeAlias;
2366
- context.flags &= ~(NodeBuilderFlags.StateClearingFlags );
2364
+ context.flags &= ~(NodeBuilderFlags.InTypeAlias );
2367
2365
2368
2366
if (!type) {
2369
2367
context.encounteredError = true;
@@ -2443,15 +2441,15 @@ namespace ts {
2443
2441
if (!inTypeAlias && type.aliasSymbol &&
2444
2442
isSymbolAccessible(type.aliasSymbol, context.enclosingDeclaration, SymbolFlags.Type, /*shouldComputeAliasesToMakeVisible*/ false).accessibility === SymbolAccessibility.Accessible) {
2445
2443
const name = symbolToTypeReferenceName(type.aliasSymbol);
2446
- const typeArgumentNodes = toTypeArgumentNodes (type.aliasTypeArguments, context);
2444
+ const typeArgumentNodes = type.aliasTypeArguments && mapToTypeNodeArray (type.aliasTypeArguments, context);
2447
2445
return createTypeReferenceNode(name, typeArgumentNodes);
2448
2446
}
2449
2447
if (type.flags & (TypeFlags.Union | TypeFlags.Intersection)) {
2450
2448
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);
2452
2450
if (typeNodes && typeNodes.length > 0) {
2453
2451
const unionOrIntersectionTypeNode = createUnionOrIntersectionTypeNode(type.flags & TypeFlags.Union ? SyntaxKind.UnionType : SyntaxKind.IntersectionType, typeNodes);
2454
- return inElementType ? createParenthesizedType(unionOrIntersectionTypeNode) : unionOrIntersectionTypeNode;
2452
+ return unionOrIntersectionTypeNode;
2455
2453
}
2456
2454
else {
2457
2455
if (!context.encounteredError && !(context.flags & NodeBuilderFlags.AllowEmptyUnionOrIntersection)) {
@@ -2467,15 +2465,11 @@ namespace ts {
2467
2465
}
2468
2466
if (type.flags & TypeFlags.Index) {
2469
2467
const indexedType = (<IndexType>type).type;
2470
- context.flags |= NodeBuilderFlags.InElementType;
2471
2468
const indexTypeNode = typeToTypeNodeHelper(indexedType, context);
2472
- Debug.assert(!(context.flags & NodeBuilderFlags.InElementType));
2473
2469
return createTypeOperatorNode(indexTypeNode);
2474
2470
}
2475
2471
if (type.flags & TypeFlags.IndexedAccess) {
2476
- context.flags |= NodeBuilderFlags.InElementType;
2477
2472
const objectTypeNode = typeToTypeNodeHelper((<IndexedAccessType>type).objectType, context);
2478
- Debug.assert(!(context.flags & NodeBuilderFlags.InElementType));
2479
2473
const indexTypeNode = typeToTypeNodeHelper((<IndexedAccessType>type).indexType, context);
2480
2474
return createIndexedAccessTypeNode(objectTypeNode, indexTypeNode);
2481
2475
}
@@ -2561,17 +2555,14 @@ namespace ts {
2561
2555
if (resolved.callSignatures.length === 1 && !resolved.constructSignatures.length) {
2562
2556
const signature = resolved.callSignatures[0];
2563
2557
const signatureNode = <FunctionTypeNode>signatureToSignatureDeclarationHelper(signature, SyntaxKind.FunctionType, context);
2564
- return shouldAddParenthesisAroundFunctionType(signature, context) ?
2565
- createParenthesizedType(signatureNode) :
2566
- signatureNode;
2558
+ return signatureNode;
2567
2559
2568
2560
}
2561
+
2569
2562
if (resolved.constructSignatures.length === 1 && !resolved.callSignatures.length) {
2570
2563
const signature = resolved.constructSignatures[0];
2571
2564
const signatureNode = <ConstructorTypeNode>signatureToSignatureDeclarationHelper(signature, SyntaxKind.ConstructorType, context);
2572
- return shouldAddParenthesisAroundFunctionType(signature, context) ?
2573
- createParenthesizedType(signatureNode) :
2574
- signatureNode;
2565
+ return signatureNode;
2575
2566
}
2576
2567
}
2577
2568
@@ -2583,19 +2574,6 @@ namespace ts {
2583
2574
return setEmitFlags(typeLiteralNode, EmitFlags.SingleLine);
2584
2575
}
2585
2576
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
-
2599
2577
function createTypeQueryNodeFromSymbol(symbol: Symbol, symbolFlags: SymbolFlags) {
2600
2578
const entityName = symbolToName(symbol, context, symbolFlags, /*expectsIdentifier*/ false);
2601
2579
return createTypeQueryNode(entityName);
@@ -2615,15 +2593,13 @@ namespace ts {
2615
2593
return createTypeReferenceNode("Array", [typeArgumentNode]);
2616
2594
}
2617
2595
2618
- context.flags |= NodeBuilderFlags.InElementType;
2619
2596
const elementType = typeToTypeNodeHelper(typeArguments[0], context);
2620
- Debug.assert(!(context.flags & NodeBuilderFlags.InElementType));
2621
-
2622
2597
return createArrayTypeNode(elementType);
2623
2598
}
2624
2599
else if (type.target.objectFlags & ObjectFlags.Tuple) {
2625
2600
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);
2627
2603
if (tupleConstituentNodes && tupleConstituentNodes.length > 0) {
2628
2604
return createTupleTypeNode(tupleConstituentNodes);
2629
2605
}
@@ -2649,7 +2625,8 @@ namespace ts {
2649
2625
// When type parameters are their own type arguments for the whole group (i.e. we have
2650
2626
// the default outer type arguments), we don't show the group.
2651
2627
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));
2653
2630
const namePart = symbolToTypeReferenceName(parent);
2654
2631
(namePart.kind === SyntaxKind.Identifier ? <Identifier>namePart : namePart.right).typeArguments = typeArgumentNodes;
2655
2632
@@ -2680,7 +2657,7 @@ namespace ts {
2680
2657
if (some(typeArguments)) {
2681
2658
const typeParameterCount = (type.target.typeParameters || emptyArray).length;
2682
2659
const slice = typeArguments && typeArguments.slice(i, typeParameterCount);
2683
- typeArgumentNodes = toTypeArgumentNodes (slice, context);
2660
+ typeArgumentNodes = slice && mapToTypeNodeArray (slice, context);
2684
2661
}
2685
2662
2686
2663
if (typeArgumentNodes) {
@@ -2763,28 +2740,17 @@ namespace ts {
2763
2740
}
2764
2741
}
2765
2742
2766
- function mapToTypeNodeArray(types: Type[], context: NodeBuilderContext, addInElementTypeFlag: boolean, addInFirstTypeArgumentFlag: boolean ): TypeNode[] {
2743
+ function mapToTypeNodeArray(types: Type[], context: NodeBuilderContext): TypeNode[] {
2767
2744
const result = [];
2768
- Debug.assert(!(context.flags & NodeBuilderFlags.InElementType), "should be unset at the beginning of the helper");
2769
2745
for (let i = 0; i < types.length; ++i) {
2770
2746
const type = types[i];
2771
- if (addInElementTypeFlag) {
2772
- context.flags |= NodeBuilderFlags.InElementType;
2773
- }
2774
- if (i === 0 && addInFirstTypeArgumentFlag) {
2775
- context.flags |= NodeBuilderFlags.InFirstTypeArgument;
2776
- }
2777
2747
const typeNode = typeToTypeNodeHelper(type, context);
2778
2748
if (typeNode) {
2779
2749
result.push(typeNode);
2780
2750
}
2781
2751
}
2782
- Debug.assert(!(context.flags & NodeBuilderFlags.InElementType), "should be unset at the end of the helper");
2783
- return result;
2784
- }
2785
2752
2786
- function toTypeArgumentNodes(typeArguments: Type[], context: NodeBuilderContext) {
2787
- return typeArguments && mapToTypeNodeArray(typeArguments, context, /*addInElementTypeFlag*/ false, /*addInFirstTypeArgumentFlag*/ true);
2753
+ return result;
2788
2754
}
2789
2755
2790
2756
function indexInfoToIndexSignatureDeclarationHelper(indexInfo: IndexInfo, kind: IndexKind, context: NodeBuilderContext): IndexSignatureDeclaration {
@@ -2909,7 +2875,7 @@ namespace ts {
2909
2875
Debug.assert(chain && 0 <= index && index < chain.length);
2910
2876
const symbol = chain[index];
2911
2877
let typeParameterNodes: TypeNode[] | undefined;
2912
- if (index > 0) {
2878
+ if (context.flags & NodeBuilderFlags.WriteTypeParametersInQualifiedName && index > 0) {
2913
2879
const parentSymbol = chain[index - 1];
2914
2880
let typeParameters: TypeParameter[];
2915
2881
if (getCheckFlags(symbol) & CheckFlags.Instantiated) {
@@ -2921,11 +2887,9 @@ namespace ts {
2921
2887
typeParameters = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol);
2922
2888
}
2923
2889
}
2890
+
2924
2891
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);
2929
2893
}
2930
2894
}
2931
2895
0 commit comments