@@ -368,6 +368,7 @@ class NodePrinter {
368368 case Node::Kind::DefaultAssociatedConformanceAccessor:
369369 case Node::Kind::DependentAssociatedTypeRef:
370370 case Node::Kind::DependentGenericSignature:
371+ case Node::Kind::DependentGenericParamPackMarker:
371372 case Node::Kind::DependentGenericParamCount:
372373 case Node::Kind::DependentGenericConformanceRequirement:
373374 case Node::Kind::DependentGenericLayoutRequirement:
@@ -982,6 +983,92 @@ class NodePrinter {
982983 }
983984 }
984985
986+ void printGenericSignature (NodePointer Node, unsigned depth) {
987+ Printer << ' <' ;
988+
989+ unsigned numChildren = Node->getNumChildren ();
990+
991+ unsigned numGenericParams = 0 ;
992+ for (; numGenericParams < numChildren; ++numGenericParams) {
993+ if (Node->getChild (numGenericParams)->getKind ()
994+ != Node::Kind::DependentGenericParamCount) {
995+ break ;
996+ }
997+ }
998+
999+ unsigned firstRequirement = numGenericParams;
1000+ for (; firstRequirement < numChildren; ++firstRequirement) {
1001+ auto child = Node->getChild (firstRequirement);
1002+ if (child->getKind () == Node::Kind::Type)
1003+ child = child->getChild (0 );
1004+ if (child->getKind () != Node::Kind::DependentGenericParamPackMarker) {
1005+ break ;
1006+ }
1007+ }
1008+
1009+ auto isGenericParamPack = [&](unsigned depth, unsigned index) {
1010+ for (unsigned i = numGenericParams; i < firstRequirement; ++i) {
1011+ auto child = Node->getChild (i);
1012+ if (child->getKind () != Node::Kind::DependentGenericParamPackMarker)
1013+ continue ;
1014+ child = child->getChild (0 );
1015+
1016+ if (child->getKind () != Node::Kind::Type)
1017+ continue ;
1018+
1019+ child = child->getChild (0 );
1020+ if (child->getKind () != Node::Kind::DependentGenericParamType)
1021+ continue ;
1022+
1023+ if (index == child->getChild (0 )->getIndex () &&
1024+ depth == child->getChild (1 )->getIndex ()) {
1025+ return true ;
1026+ }
1027+ }
1028+
1029+ return false ;
1030+ };
1031+
1032+ unsigned gpDepth = 0 ;
1033+ for (; gpDepth < numGenericParams; ++gpDepth) {
1034+ if (gpDepth != 0 )
1035+ Printer << " ><" ;
1036+
1037+ unsigned count = Node->getChild (gpDepth)->getIndex ();
1038+ for (unsigned index = 0 ; index < count; ++index) {
1039+ if (index != 0 )
1040+ Printer << " , " ;
1041+
1042+ // Limit the number of printed generic parameters. In practice this
1043+ // it will never be exceeded. The limit is only important for malformed
1044+ // symbols where count can be really huge.
1045+ if (index >= 128 ) {
1046+ Printer << " ..." ;
1047+ break ;
1048+ }
1049+
1050+ if (isGenericParamPack (gpDepth, index))
1051+ Printer << " each " ;
1052+
1053+ // FIXME: Depth won't match when a generic signature applies to a
1054+ // method in generic type context.
1055+ Printer << Options.GenericParameterName (gpDepth, index);
1056+ }
1057+ }
1058+
1059+ if (firstRequirement != numChildren) {
1060+ if (Options.DisplayWhereClauses ) {
1061+ Printer << " where " ;
1062+ for (unsigned i = firstRequirement; i < numChildren; ++i) {
1063+ if (i > firstRequirement)
1064+ Printer << " , " ;
1065+ print (Node->getChild (i), depth + 1 );
1066+ }
1067+ }
1068+ }
1069+ Printer << ' >' ;
1070+ }
1071+
9851072 void printFunctionSigSpecializationParams (NodePointer Node, unsigned depth);
9861073
9871074 void printSpecializationPrefix (NodePointer node, StringRef Description,
@@ -2634,49 +2721,11 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
26342721
26352722 case Node::Kind::DependentPseudogenericSignature:
26362723 case Node::Kind::DependentGenericSignature: {
2637- Printer << ' <' ;
2638-
2639- unsigned depth = 0 ;
2640- unsigned numChildren = Node->getNumChildren ();
2641- for (;
2642- depth < numChildren
2643- && Node->getChild (depth)->getKind ()
2644- == Node::Kind::DependentGenericParamCount;
2645- ++depth) {
2646- if (depth != 0 )
2647- Printer << " ><" ;
2648-
2649- unsigned count = Node->getChild (depth)->getIndex ();
2650- for (unsigned index = 0 ; index < count; ++index) {
2651- if (index != 0 )
2652- Printer << " , " ;
2653- // Limit the number of printed generic parameters. In practice this
2654- // it will never be exceeded. The limit is only important for malformed
2655- // symbols where count can be really huge.
2656- if (index >= 128 ) {
2657- Printer << " ..." ;
2658- break ;
2659- }
2660- // FIXME: Depth won't match when a generic signature applies to a
2661- // method in generic type context.
2662- Printer << Options.GenericParameterName (depth, index);
2663- }
2664- }
2665-
2666- if (depth != numChildren) {
2667- if (Options.DisplayWhereClauses ) {
2668- Printer << " where " ;
2669- for (unsigned i = depth; i < numChildren; ++i) {
2670- if (i > depth)
2671- Printer << " , " ;
2672- print (Node->getChild (i), depth + 1 );
2673- }
2674- }
2675- }
2676- Printer << ' >' ;
2724+ printGenericSignature (Node, depth);
26772725 return nullptr ;
26782726 }
26792727 case Node::Kind::DependentGenericParamCount:
2728+ case Node::Kind::DependentGenericParamPackMarker:
26802729 printer_unreachable (" should be printed as a child of a "
26812730 " DependentGenericSignature" );
26822731 case Node::Kind::DependentGenericConformanceRequirement: {
0 commit comments