@@ -1530,17 +1530,60 @@ module ts {
1530
1530
}
1531
1531
}
1532
1532
1533
+ function writeSymbolTypeReference(symbol: Symbol, typeArguments: Type[], pos: number, end: number) {
1534
+ if (!isReservedMemberName(symbol.name)) {
1535
+ buildSymbolDisplay(symbol, writer, enclosingDeclaration, SymbolFlags.Type);
1536
+ }
1537
+ if (pos < end) {
1538
+ writePunctuation(writer, SyntaxKind.LessThanToken);
1539
+ writeType(typeArguments[pos++], TypeFormatFlags.None);
1540
+ while (pos < end) {
1541
+ writePunctuation(writer, SyntaxKind.CommaToken);
1542
+ writeSpace(writer);
1543
+ writeType(typeArguments[pos++], TypeFormatFlags.None);
1544
+ }
1545
+ writePunctuation(writer, SyntaxKind.GreaterThanToken);
1546
+ }
1547
+ }
1548
+
1533
1549
function writeTypeReference(type: TypeReference, flags: TypeFormatFlags) {
1550
+ let typeArguments = type.typeArguments;
1534
1551
if (type.target === globalArrayType && !(flags & TypeFormatFlags.WriteArrayAsGenericType)) {
1535
- writeType(type. typeArguments[0], TypeFormatFlags.InElementType);
1552
+ writeType(typeArguments[0], TypeFormatFlags.InElementType);
1536
1553
writePunctuation(writer, SyntaxKind.OpenBracketToken);
1537
1554
writePunctuation(writer, SyntaxKind.CloseBracketToken);
1538
1555
}
1539
1556
else {
1540
- buildSymbolDisplay(type.target.symbol, writer, enclosingDeclaration, SymbolFlags.Type);
1541
- writePunctuation(writer, SyntaxKind.LessThanToken);
1542
- writeTypeList(type.typeArguments, /*union*/ false);
1543
- writePunctuation(writer, SyntaxKind.GreaterThanToken);
1557
+ // Write the type reference in the format f<A>.g<B>.C<X, Y> where A and B are type arguments
1558
+ // for outer type parameters, and f and g are the respective declaring containers of those
1559
+ // type parameters.
1560
+ let outerTypeParameters = type.target.outerTypeParameters;
1561
+ let i = 0;
1562
+ if (outerTypeParameters) {
1563
+ let length = outerTypeParameters.length;
1564
+ let group = 0;
1565
+ while (i < length) {
1566
+ // Find group of type arguments for type parameters with the same declaring container.
1567
+ let start = i;
1568
+ let parent = getParentSymbolOfTypeParameter(outerTypeParameters[i]);
1569
+ do {
1570
+ i++;
1571
+ } while (i < length && getParentSymbolOfTypeParameter(outerTypeParameters[i]) === parent);
1572
+ // When type parameters are their own type arguments for the whole group (i.e. we have
1573
+ // the default outer type arguments), we don't show the group.
1574
+ if (!rangeEquals(outerTypeParameters, typeArguments, start, i)) {
1575
+ if (group) {
1576
+ writePunctuation(writer, SyntaxKind.DotToken);
1577
+ }
1578
+ writeSymbolTypeReference(parent, typeArguments, start, i);
1579
+ group++;
1580
+ }
1581
+ }
1582
+ if (group) {
1583
+ writePunctuation(writer, SyntaxKind.DotToken);
1584
+ }
1585
+ }
1586
+ writeSymbolTypeReference(type.symbol, typeArguments, i, typeArguments.length);
1544
1587
}
1545
1588
}
1546
1589
@@ -1736,7 +1779,7 @@ module ts {
1736
1779
function buildTypeParameterDisplayFromSymbol(symbol: Symbol, writer: SymbolWriter, enclosingDeclaraiton?: Node, flags?: TypeFormatFlags) {
1737
1780
let targetSymbol = getTargetSymbol(symbol);
1738
1781
if (targetSymbol.flags & SymbolFlags.Class || targetSymbol.flags & SymbolFlags.Interface) {
1739
- buildDisplayForTypeParametersAndDelimiters(getTypeParametersOfClassOrInterface (symbol), writer, enclosingDeclaraiton, flags);
1782
+ buildDisplayForTypeParametersAndDelimiters(getLocalTypeParametersOfClassOrInterface (symbol), writer, enclosingDeclaraiton, flags);
1740
1783
}
1741
1784
}
1742
1785
@@ -3356,6 +3399,10 @@ module ts {
3356
3399
return type.constraint === noConstraintType ? undefined : type.constraint;
3357
3400
}
3358
3401
3402
+ function getParentSymbolOfTypeParameter(typeParameter: TypeParameter): Symbol {
3403
+ return getSymbolOfNode(getDeclarationOfKind(typeParameter.symbol, SyntaxKind.TypeParameter).parent);
3404
+ }
3405
+
3359
3406
function getTypeListId(types: Type[]) {
3360
3407
switch (types.length) {
3361
3408
case 1:
0 commit comments