code: static String formalTypeParametersString(TypeElement type) {
      List<? extends TypeParameterElement> typeParameters = type.getTypeParameters();
      if (typeParameters.isEmpty()) {
        return "";
      } else {
        StringBuilder sb = new StringBuilder("<");
        String sep = "";
        for (TypeParameterElement typeParameter : typeParameters) {
          sb.append(sep);
          sep = ", ";
          appendTypeParameterWithBounds(typeParameter, sb);
        }
        return sb.append(">").toString();
      }
    }
docs: Returns the formal type parameters of the given type. If we have {@code @AutoValue abstract
  class Foo<T extends SomeClass>} then this method will return an encoding of {@code <T extends
  SomeClass>} for {@code Foo}. Likewise it will return an encoding of the angle-bracket part of:
  <br>
  {@code Foo<SomeClass>}<br>
  {@code Foo<T extends Number>}<br>
  {@code Foo<E extends Enum<E>>}<br>
  {@code Foo<K, V extends Comparable<? extends K>>}.
  
  <p>The encoding is simply that classes in the "extends" part are marked, so the examples will
  actually look something like this:<br>
  {@code <`bar.baz.SomeClass`>}<br>
  {@code <T extends `java.lang.Number`>}<br>
  {@code <E extends `java.lang.Enum`<E>>}<br>
  {@code <K, V extends `java.lang.Comparable`<? extends K>>}.