Don't fill type parameter declaration lists

Like formal parameter declaration lists, class type parameter
declarations should switch to one declaration per line after the first
line.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=118391112
diff --git a/core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java b/core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java
index 223ccc2..f13e3d4 100644
--- a/core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java
+++ b/core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java
@@ -1264,12 +1264,13 @@
       {
         boolean first = true;
         if (!node.typeParameters().isEmpty()) {
-          visitTypeParameters(node.typeParameters(), ZERO, BreakOrNot.NO);
+          token("<");
+          typeParametersRest(node.typeParameters(), plusFour);
           first = false;
         }
 
         boolean openedNameAndTypeScope = false;
-        // constructor-like declarations that don't match the name of the enclosing class are 
+        // constructor-like declarations that don't match the name of the enclosing class are
         // parsed as method declarations with a null return type
         if (!node.isConstructor() && node.getReturnType2() != null) {
           if (!first) {
@@ -1864,22 +1865,22 @@
         visitModifiers(node.modifiers(), Direction.VERTICAL, Optional.<BreakTag>absent());
     boolean hasSuperclassType = node.getSuperclassType() != null;
     boolean hasSuperInterfaceTypes = !node.superInterfaceTypes().isEmpty();
-    builder.open(ZERO);
     builder.addAll(breaks);
     token(node.isInterface() ? "interface" : "class");
     builder.space();
     visit(node.getName());
     if (!node.typeParameters().isEmpty()) {
-      visitTypeParameters(
-          node.typeParameters(), hasSuperclassType || hasSuperInterfaceTypes ? plusFour : ZERO,
-          BreakOrNot.YES);
+      token("<");
     }
-    if (hasSuperclassType || hasSuperInterfaceTypes) {
-      builder.open(plusFour);
+    builder.open(plusFour);
+    {
+      if (!node.typeParameters().isEmpty()) {
+        typeParametersRest(
+            node.typeParameters(), hasSuperclassType || hasSuperInterfaceTypes ? plusFour : ZERO);
+      }
       if (hasSuperclassType) {
         builder.breakToFill(" ");
         token("extends");
-        // TODO(b/20761216): using a non-breaking space here could cause >100 char lines
         builder.space();
         node.getSuperclassType().accept(this);
       }
@@ -1899,7 +1900,6 @@
         }
         builder.close();
       }
-      builder.close();
     }
     builder.close();
     if (node.bodyDeclarations() == null) {
@@ -2501,29 +2501,27 @@
         ReceiverParameter.NO);
   }
 
-  /** Helper method for {@link MethodDeclaration}s and {@link TypeDeclaration}s. */
-  private void visitTypeParameters(
-      List<TypeParameter> nodes, Indent plusIndent, BreakOrNot breakAfterOpen) {
-    if (!nodes.isEmpty()) {
-      token("<");
-      builder.open(plusIndent);
-      builder.open(plusFour);
-      if (breakAfterOpen.isYes()) {
-        builder.breakOp();
+  /**
+   * Helper method for formatting the type parameter list of a {@link MethodDeclaration} or
+   * {@link TypeDeclaration}. Does not omit the leading '<', which should be associated with
+   * the type name.
+   */
+  private void typeParametersRest(List<TypeParameter> typeParameters, Indent plusIndent) {
+    builder.open(plusIndent);
+    builder.breakOp();
+    builder.open(ZERO);
+    boolean first = true;
+    for (TypeParameter typeParameter : typeParameters) {
+      if (!first) {
+        token(",");
+        builder.breakOp(" ");
       }
-      boolean first = true;
-      for (TypeParameter node : nodes) {
-        if (!first) {
-          token(",");
-          builder.breakToFill(" ");
-        }
-        visit(node);
-        first = false;
-      }
-      builder.close();
-      builder.close();
-      token(">");
+      typeParameter.accept(this);
+      first = false;
     }
+    token(">");
+    builder.close();
+    builder.close();
   }
 
   /** Helper method for {@link UnionType}s. */
diff --git a/core/src/test/resources/com/google/googlejavaformat/java/testdata/B21305044.output b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B21305044.output
index aaf6546..32296d2 100644
--- a/core/src/test/resources/com/google/googlejavaformat/java/testdata/B21305044.output
+++ b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B21305044.output
@@ -1,9 +1,10 @@
 class B21305044 {
 
   class T<
-          @Nullable X extends @Nullable Object, @Nullable Y extends @Nullable Object,
-          @Nullable Z extends @Nullable Object> extends Function<@Nullable X, @Nullable Y>
-      implements Predicate<@Nullable Z> {
+          @Nullable X extends @Nullable Object,
+          @Nullable Y extends @Nullable Object,
+          @Nullable Z extends @Nullable Object>
+      extends Function<@Nullable X, @Nullable Y> implements Predicate<@Nullable Z> {
     public T(@Nullable T this, List<@Nullable X> xs) {}
 
     public T(@Nullable T B21305044.this, List<@Nullable X> xs) {}
diff --git a/core/src/test/resources/com/google/googlejavaformat/java/testdata/B26293162.input b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B26293162.input
new file mode 100644
index 0000000..691bebe
--- /dev/null
+++ b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B26293162.input
@@ -0,0 +1,43 @@
+class Xxxx {
+
+  public static final class XxxxXxxxxxxxXxxxxxxxxXxxxxxXxxxxxxx<
+      X, X, X extends XxxxxxxxxXxxxxxxxxXxxxxxxx<X, X>> {
+
+    int x;
+  }
+
+  public static final class XxxxXxxxxxxxXxxxxxxxxXxxxxxXxxxxxxx<
+          X, X, X extends XxxxxxxxxXxxxxxxxxXxxxxxxx<X, X>> extends Xxxxx {
+
+    int x;
+  }
+
+  class XxxxxxxxXxxxxxxxxXxxxXxxx<
+          X extends XxxxxxxxxXxxxxxx, X extends XxxxxxxxxXxxxxx, X extends Xxxxxxxxxxxxx, X>
+      extends XxxxXxxx {
+
+    int x;
+  }
+
+  @Xxx
+  class XxxxxxxxxxxXxxxxxXx<
+          X extends XxxxxxXxxxxxxxxxxXxxxxxXxxxxx, X extends Xxxxxxx, XX extends Xxxxxxxxx<X>>
+      extends XxxxxxxxXx<X, XX> {
+
+    int x;
+  }
+
+  static class XxxxxXxxxxXxxx<
+      XXXXX extends XxxxxxxxXxxxxxx<XXXXX>, XXX extends XxxxxxxxXxxxxxx<XXX>> {
+
+    int x;
+  }
+
+  @Xxx
+  class XxxxxxxxxxxXxxxxxXx<
+          X extends XxxxxxXxxxxxxxxxxXxxxxxXxxxxx, X extends Xxxxxxx, X extends Xxxxxxx,
+          XX extends Xxxxxxxxx<X>> extends XxxxxxxxXx<X, XX> {
+
+    int x;
+  }
+}
diff --git a/core/src/test/resources/com/google/googlejavaformat/java/testdata/B26293162.output b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B26293162.output
new file mode 100644
index 0000000..96361ef
--- /dev/null
+++ b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B26293162.output
@@ -0,0 +1,47 @@
+class Xxxx {
+
+  public static final class XxxxXxxxxxxxXxxxxxxxxXxxxxxXxxxxxxx<
+      X, X, X extends XxxxxxxxxXxxxxxxxxXxxxxxxx<X, X>> {
+
+    int x;
+  }
+
+  public static final class XxxxXxxxxxxxXxxxxxxxxXxxxxxXxxxxxxx<
+          X, X, X extends XxxxxxxxxXxxxxxxxxXxxxxxxx<X, X>>
+      extends Xxxxx {
+
+    int x;
+  }
+
+  class XxxxxxxxXxxxxxxxxXxxxXxxx<
+          X extends XxxxxxxxxXxxxxxx, X extends XxxxxxxxxXxxxxx, X extends Xxxxxxxxxxxxx, X>
+      extends XxxxXxxx {
+
+    int x;
+  }
+
+  @Xxx
+  class XxxxxxxxxxxXxxxxxXx<
+          X extends XxxxxxXxxxxxxxxxxXxxxxxXxxxxx, X extends Xxxxxxx, XX extends Xxxxxxxxx<X>>
+      extends XxxxxxxxXx<X, XX> {
+
+    int x;
+  }
+
+  static class XxxxxXxxxxXxxx<
+      XXXXX extends XxxxxxxxXxxxxxx<XXXXX>, XXX extends XxxxxxxxXxxxxxx<XXX>> {
+
+    int x;
+  }
+
+  @Xxx
+  class XxxxxxxxxxxXxxxxxXx<
+          X extends XxxxxxXxxxxxxxxxxXxxxxxXxxxxx,
+          X extends Xxxxxxx,
+          X extends Xxxxxxx,
+          XX extends Xxxxxxxxx<X>>
+      extends XxxxxxxxXx<X, XX> {
+
+    int x;
+  }
+}
diff --git a/core/src/test/resources/com/google/googlejavaformat/java/testdata/M.output b/core/src/test/resources/com/google/googlejavaformat/java/testdata/M.output
index 6cc984f..6a73e32 100644
--- a/core/src/test/resources/com/google/googlejavaformat/java/testdata/M.output
+++ b/core/src/test/resources/com/google/googlejavaformat/java/testdata/M.output
@@ -238,28 +238,152 @@
     return null;
   }
 
-  <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
-          T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31>
+  <
+          T0,
+          T1,
+          T2,
+          T3,
+          T4,
+          T5,
+          T6,
+          T7,
+          T8,
+          T9,
+          T10,
+          T11,
+          T12,
+          T13,
+          T14,
+          T15,
+          T16,
+          T17,
+          T18,
+          T19,
+          T20,
+          T21,
+          T22,
+          T23,
+          T24,
+          T25,
+          T26,
+          T27,
+          T28,
+          T29,
+          T30,
+          T31>
       T methodName20(int x) {
     return null;
   }
 
-  <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
-          T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31>
+  <
+          T0,
+          T1,
+          T2,
+          T3,
+          T4,
+          T5,
+          T6,
+          T7,
+          T8,
+          T9,
+          T10,
+          T11,
+          T12,
+          T13,
+          T14,
+          T15,
+          T16,
+          T17,
+          T18,
+          T19,
+          T20,
+          T21,
+          T22,
+          T23,
+          T24,
+          T25,
+          T26,
+          T27,
+          T28,
+          T29,
+          T30,
+          T31>
       T methodName21(int x) throws Exception {
     return null;
   }
 
-  <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
-          T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31>
+  <
+          T0,
+          T1,
+          T2,
+          T3,
+          T4,
+          T5,
+          T6,
+          T7,
+          T8,
+          T9,
+          T10,
+          T11,
+          T12,
+          T13,
+          T14,
+          T15,
+          T16,
+          T17,
+          T18,
+          T19,
+          T20,
+          T21,
+          T22,
+          T23,
+          T24,
+          T25,
+          T26,
+          T27,
+          T28,
+          T29,
+          T30,
+          T31>
       T methodName22(int x)
           throws Exception0, Exception1, Exception2, Exception3, Exception4, Exception5, Exception6,
               Exception7, Exception8, Exception9 {
     return null;
   }
 
-  <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
-          T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31>
+  <
+          T0,
+          T1,
+          T2,
+          T3,
+          T4,
+          T5,
+          T6,
+          T7,
+          T8,
+          T9,
+          T10,
+          T11,
+          T12,
+          T13,
+          T14,
+          T15,
+          T16,
+          T17,
+          T18,
+          T19,
+          T20,
+          T21,
+          T22,
+          T23,
+          T24,
+          T25,
+          T26,
+          T27,
+          T28,
+          T29,
+          T30,
+          T31>
       T methodName22(
           int a,
           int b,
@@ -286,8 +410,39 @@
     return null;
   }
 
-  <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
-          T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31>
+  <
+          T0,
+          T1,
+          T2,
+          T3,
+          T4,
+          T5,
+          T6,
+          T7,
+          T8,
+          T9,
+          T10,
+          T11,
+          T12,
+          T13,
+          T14,
+          T15,
+          T16,
+          T17,
+          T18,
+          T19,
+          T20,
+          T21,
+          T22,
+          T23,
+          T24,
+          T25,
+          T26,
+          T27,
+          T28,
+          T29,
+          T30,
+          T31>
       T methodName23(
           int a,
           int b,
@@ -315,8 +470,39 @@
     return null;
   }
 
-  <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
-          T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31>
+  <
+          T0,
+          T1,
+          T2,
+          T3,
+          T4,
+          T5,
+          T6,
+          T7,
+          T8,
+          T9,
+          T10,
+          T11,
+          T12,
+          T13,
+          T14,
+          T15,
+          T16,
+          T17,
+          T18,
+          T19,
+          T20,
+          T21,
+          T22,
+          T23,
+          T24,
+          T25,
+          T26,
+          T27,
+          T28,
+          T29,
+          T30,
+          T31>
       T methodName30(
           int a,
           int b,
@@ -345,8 +531,39 @@
     return null;
   }
 
-  <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
-          T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31>
+  <
+          T0,
+          T1,
+          T2,
+          T3,
+          T4,
+          T5,
+          T6,
+          T7,
+          T8,
+          T9,
+          T10,
+          T11,
+          T12,
+          T13,
+          T14,
+          T15,
+          T16,
+          T17,
+          T18,
+          T19,
+          T20,
+          T21,
+          T22,
+          T23,
+          T24,
+          T25,
+          T26,
+          T27,
+          T28,
+          T29,
+          T30,
+          T31>
       Pair<
               Pair<Pair<Pair<T, T>, Pair<T, T>>, Pair<Pair<T, T>, Pair<T, T>>>,
               Pair<Pair<Pair<T, T>, Pair<T, T>>, Pair<Pair<T, T>, Pair<T, T>>>>
@@ -354,8 +571,39 @@
     return null;
   }
 
-  <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
-          T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31>
+  <
+          T0,
+          T1,
+          T2,
+          T3,
+          T4,
+          T5,
+          T6,
+          T7,
+          T8,
+          T9,
+          T10,
+          T11,
+          T12,
+          T13,
+          T14,
+          T15,
+          T16,
+          T17,
+          T18,
+          T19,
+          T20,
+          T21,
+          T22,
+          T23,
+          T24,
+          T25,
+          T26,
+          T27,
+          T28,
+          T29,
+          T30,
+          T31>
       Pair<
               Pair<Pair<Pair<T, T>, Pair<T, T>>, Pair<Pair<T, T>, Pair<T, T>>>,
               Pair<Pair<Pair<T, T>, Pair<T, T>>, Pair<Pair<T, T>, Pair<T, T>>>>
@@ -363,8 +611,39 @@
     return null;
   }
 
-  <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
-          T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31>
+  <
+          T0,
+          T1,
+          T2,
+          T3,
+          T4,
+          T5,
+          T6,
+          T7,
+          T8,
+          T9,
+          T10,
+          T11,
+          T12,
+          T13,
+          T14,
+          T15,
+          T16,
+          T17,
+          T18,
+          T19,
+          T20,
+          T21,
+          T22,
+          T23,
+          T24,
+          T25,
+          T26,
+          T27,
+          T28,
+          T29,
+          T30,
+          T31>
       Pair<
               Pair<Pair<Pair<T, T>, Pair<T, T>>, Pair<Pair<T, T>, Pair<T, T>>>,
               Pair<Pair<Pair<T, T>, Pair<T, T>>, Pair<Pair<T, T>, Pair<T, T>>>>
@@ -374,8 +653,39 @@
     return null;
   }
 
-  <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
-          T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31>
+  <
+          T0,
+          T1,
+          T2,
+          T3,
+          T4,
+          T5,
+          T6,
+          T7,
+          T8,
+          T9,
+          T10,
+          T11,
+          T12,
+          T13,
+          T14,
+          T15,
+          T16,
+          T17,
+          T18,
+          T19,
+          T20,
+          T21,
+          T22,
+          T23,
+          T24,
+          T25,
+          T26,
+          T27,
+          T28,
+          T29,
+          T30,
+          T31>
       Pair<
               Pair<Pair<Pair<T, T>, Pair<T, T>>, Pair<Pair<T, T>, Pair<T, T>>>,
               Pair<Pair<Pair<T, T>, Pair<T, T>>, Pair<Pair<T, T>, Pair<T, T>>>>
@@ -405,8 +715,39 @@
     return null;
   }
 
-  <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
-          T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31>
+  <
+          T0,
+          T1,
+          T2,
+          T3,
+          T4,
+          T5,
+          T6,
+          T7,
+          T8,
+          T9,
+          T10,
+          T11,
+          T12,
+          T13,
+          T14,
+          T15,
+          T16,
+          T17,
+          T18,
+          T19,
+          T20,
+          T21,
+          T22,
+          T23,
+          T24,
+          T25,
+          T26,
+          T27,
+          T28,
+          T29,
+          T30,
+          T31>
       Pair<
               Pair<Pair<Pair<T, T>, Pair<T, T>>, Pair<Pair<T, T>, Pair<T, T>>>,
               Pair<Pair<Pair<T, T>, Pair<T, T>>, Pair<Pair<T, T>, Pair<T, T>>>>
@@ -437,8 +778,39 @@
     return null;
   }
 
-  <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
-          T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31>
+  <
+          T0,
+          T1,
+          T2,
+          T3,
+          T4,
+          T5,
+          T6,
+          T7,
+          T8,
+          T9,
+          T10,
+          T11,
+          T12,
+          T13,
+          T14,
+          T15,
+          T16,
+          T17,
+          T18,
+          T19,
+          T20,
+          T21,
+          T22,
+          T23,
+          T24,
+          T25,
+          T26,
+          T27,
+          T28,
+          T29,
+          T30,
+          T31>
       Pair<
               Pair<Pair<Pair<T, T>, Pair<T, T>>, Pair<Pair<T, T>, Pair<T, T>>>,
               Pair<Pair<Pair<T, T>, Pair<T, T>>, Pair<Pair<T, T>, Pair<T, T>>>>
@@ -623,8 +995,19 @@
     return this;
   }
 
-  <XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX,
-          XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX>
+  <
+          XXXXXXXXXX,
+          XXXXXXXXXX,
+          XXXXXXXXXX,
+          XXXXXXXXXX,
+          XXXXXXXXXX,
+          XXXXXXXXXX,
+          XXXXXXXXXX,
+          XXXXXXXXXX,
+          XXXXXXXXXX,
+          XXXXXXXXXX,
+          XXXXXXXXXX,
+          XXXXXXXXXX>
       M(
           ZZZZZZZZZZ z,
           ZZZZZZZZZZ z,
diff --git a/core/src/test/resources/com/google/googlejavaformat/java/testdata/P.output b/core/src/test/resources/com/google/googlejavaformat/java/testdata/P.output
index 8cc377c..9c63831 100644
--- a/core/src/test/resources/com/google/googlejavaformat/java/testdata/P.output
+++ b/core/src/test/resources/com/google/googlejavaformat/java/testdata/P.output
@@ -5,8 +5,30 @@
  * PrefixExpressions, and PrimitiveTypes.
  */
 class P<
-    T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21,
-    T22, T23, T24> {
+    T1,
+    T2,
+    T3,
+    T4,
+    T5,
+    T6,
+    T7,
+    T8,
+    T9,
+    T10,
+    T11,
+    T12,
+    T13,
+    T14,
+    T15,
+    T16,
+    T17,
+    T18,
+    T19,
+    T20,
+    T21,
+    T22,
+    T23,
+    T24> {
   void f() {
     int x = (1 + 2) * 3;
     ++x;