@@ -2449,13 +2449,13 @@ namespace ts {
2449
2449
if (!inTypeAlias && type.aliasSymbol &&
2450
2450
isSymbolAccessible(type.aliasSymbol, context.enclosingDeclaration, SymbolFlags.Type, /*shouldComputeAliasesToMakeVisible*/ false).accessibility === SymbolAccessibility.Accessible) {
2451
2451
const name = symbolToName(type.aliasSymbol, /*expectsIdentifier*/ false, SymbolFlags.Type, context);
2452
- const typeArgumentNodes = type.aliasTypeArguments && mapToTypeNodeArray(type.aliasTypeArguments, /*addInElementTypeFlag*/ false);
2452
+ const typeArgumentNodes = type.aliasTypeArguments && mapToTypeNodeArray(type.aliasTypeArguments, context, /*addInElementTypeFlag*/ false, /*addInFirstTypeArgumentFlag*/ true );
2453
2453
return createTypeReferenceNode(name, typeArgumentNodes);
2454
2454
}
2455
2455
2456
2456
if (type.flags & (TypeFlags.Union | TypeFlags.Intersection)) {
2457
2457
const types = type.flags & TypeFlags.Union ? formatUnionTypes((<UnionType>type).types) : (<IntersectionType>type).types;
2458
- const typeNodes = types && mapToTypeNodeArray(types, /*addInElementTypeFlag*/ true);
2458
+ const typeNodes = types && mapToTypeNodeArray(types, context, /*addInElementTypeFlag*/ true, /*addInFirstTypeArgumentFlag*/ false );
2459
2459
if (typeNodes && typeNodes.length > 0) {
2460
2460
const unionOrIntersectionTypeNode = createUnionOrIntersectionTypeNode(type.flags & TypeFlags.Union ? SyntaxKind.UnionType : SyntaxKind.IntersectionType, typeNodes);
2461
2461
return InElementType ? createParenthesizedTypeNode(unionOrIntersectionTypeNode) : unionOrIntersectionTypeNode;
@@ -2492,20 +2492,6 @@ namespace ts {
2492
2492
2493
2493
Debug.fail("Should be unreachable.");
2494
2494
2495
- function mapToTypeNodeArray(types: Type[], addInElementTypeFlag: boolean): TypeNode[] {
2496
- const result = [];
2497
- Debug.assert(context.InElementType === false, "should be unset at the beginning of the helper");
2498
- for (const type of types) {
2499
- context.InElementType = addInElementTypeFlag;
2500
- const typeNode = typeToTypeNodeHelper(type, context);
2501
- if (typeNode) {
2502
- result.push(typeNode);
2503
- }
2504
- }
2505
- Debug.assert(context.InElementType === false, "should be unset at the beginning of the helper");
2506
- return result;
2507
- }
2508
-
2509
2495
function createMappedTypeNodeFromType(type: MappedType) {
2510
2496
Debug.assert(!!(type.flags & TypeFlags.Object));
2511
2497
const typeParameter = getTypeParameterFromMappedType(type);
@@ -2642,7 +2628,7 @@ namespace ts {
2642
2628
}
2643
2629
else if (type.target.objectFlags & ObjectFlags.Tuple) {
2644
2630
if (typeArguments.length > 0) {
2645
- const tupleConstituentNodes = mapToTypeNodeArray(typeArguments.slice(0, getTypeReferenceArity(type)), /*addInElementTypeFlag*/ false);
2631
+ const tupleConstituentNodes = mapToTypeNodeArray(typeArguments.slice(0, getTypeReferenceArity(type)), context, /*addInElementTypeFlag*/ false, /*addInFirstTypeArgumentFlag */ false);
2646
2632
if (tupleConstituentNodes && tupleConstituentNodes.length > 0) {
2647
2633
return createTupleTypeNode(tupleConstituentNodes);
2648
2634
}
@@ -2669,8 +2655,11 @@ namespace ts {
2669
2655
// When type parameters are their own type arguments for the whole group (i.e. we have
2670
2656
// the default outer type arguments), we don't show the group.
2671
2657
if (!rangeEquals(outerTypeParameters, typeArguments, start, i)) {
2672
- // inFirstTypeArgument???
2658
+ const qualifiedNamePartTypeArguments = typeArguments.slice(start,i);
2659
+ const qualifiedNamePartTypeArgumentNodes = qualifiedNamePartTypeArguments && createNodeArray(mapToTypeNodeArray(qualifiedNamePartTypeArguments, context, /*addInElementTypeFlag*/ false, /*addInFirstTypeArgumentFlag*/ true));
2673
2660
const qualifiedNamePart = symbolToName(parent, /*expectsIdentifier*/ true, SymbolFlags.Type, context);
2661
+ qualifiedNamePart.typeArguments = qualifiedNamePartTypeArgumentNodes;
2662
+
2674
2663
if (!qualifiedName) {
2675
2664
qualifiedName = createQualifiedName(qualifiedNamePart, /*right*/ undefined);
2676
2665
}
@@ -2699,7 +2688,7 @@ namespace ts {
2699
2688
if (some(typeArguments)) {
2700
2689
const slice = typeArguments.slice(i, typeParameterCount - i);
2701
2690
context.InFirstTypeArgument = true;
2702
- typeArgumentNodes = mapToTypeNodeArray(slice, /*addInElementTypeFlag*/ false);
2691
+ typeArgumentNodes = mapToTypeNodeArray(slice, context, /*addInElementTypeFlag*/ false, /*addInFirstTypeArgumentFlag*/ true );
2703
2692
}
2704
2693
2705
2694
return createTypeReferenceNode(entityName, typeArgumentNodes);
@@ -2761,6 +2750,24 @@ namespace ts {
2761
2750
}
2762
2751
}
2763
2752
2753
+ function mapToTypeNodeArray(types: Type[], context: NodeBuilderContext, addInElementTypeFlag: boolean, addInFirstTypeArgumentFlag: boolean): TypeNode[] {
2754
+ const result = [];
2755
+ Debug.assert(context.InElementType === false, "should be unset at the beginning of the helper");
2756
+ for (let i = 0; i < types.length; ++i) {
2757
+ let type = types[i]
2758
+ context.InElementType = addInElementTypeFlag;
2759
+ if (i === 0) {
2760
+ context.InFirstTypeArgument = addInFirstTypeArgumentFlag;
2761
+ }
2762
+ const typeNode = typeToTypeNodeHelper(type, context);
2763
+ if (typeNode) {
2764
+ result.push(typeNode);
2765
+ }
2766
+ }
2767
+ Debug.assert(context.InElementType === false, "should be unset at the beginning of the helper");
2768
+ return result;
2769
+ }
2770
+
2764
2771
function indexInfoToIndexSignatureDeclarationHelper(indexInfo: IndexInfo, kind: IndexKind, context: NodeBuilderContext): IndexSignatureDeclaration {
2765
2772
const indexerTypeNode = createKeywordTypeNode(kind === IndexKind.String ? SyntaxKind.StringKeyword : SyntaxKind.NumberKeyword);
2766
2773
const name = getNameFromIndexInfo(indexInfo) || "x";
@@ -2889,9 +2896,8 @@ namespace ts {
2889
2896
Debug.assert(chain && 0 <= index && index < chain.length);
2890
2897
// const parentIndex = index - 1;
2891
2898
const symbol = chain[index];
2892
- let typeParameterString = "" ;
2899
+ let typeParameterNodes: TypeNode[] | undefined ;
2893
2900
if (index > 0) {
2894
-
2895
2901
const parentSymbol = chain[index - 1];
2896
2902
let typeParameters: TypeParameter[];
2897
2903
if (getCheckFlags(symbol) & CheckFlags.Instantiated) {
@@ -2907,17 +2913,12 @@ namespace ts {
2907
2913
if (!context.encounteredError && !(context.flags & NodeBuilderFlags.allowTypeParameterInQualifiedName)) {
2908
2914
context.encounteredError = true;
2909
2915
}
2910
- const writer = getSingleLineStringWriter();
2911
- const displayBuilder = getSymbolDisplayBuilder();
2912
- displayBuilder.buildDisplayForTypeParametersAndDelimiters(typeParameters, writer, context.enclosingDeclaration, 0);
2913
- typeParameterString = writer.string();
2914
- releaseStringWriter(writer);
2915
-
2916
+ typeParameterNodes = typeParameters && mapToTypeNodeArray(typeParameters, context, /*addInElementTypeFlag*/ false, /*addInFirstTypeArgumentFlag*/ true);
2916
2917
}
2917
2918
}
2919
+
2918
2920
const symbolName = getNameOfSymbol(symbol, context);
2919
- const symbolNameWithTypeParameters = typeParameterString.length > 0 ? `${symbolName}<${typeParameterString}>` : symbolName;
2920
- const identifier = createIdentifier(symbolNameWithTypeParameters);
2921
+ const identifier = createIdentifier(symbolName, typeParameterNodes);
2921
2922
2922
2923
return index > 0 ? createQualifiedName(createEntityNameFromSymbolChain(chain, index - 1), identifier) : identifier;
2923
2924
}
0 commit comments