docs: private Optional<Builder> builderFrom(TypeElement builderTypeElement) {
  
      // We require the builder to have the same type parameters as the @AutoValue class, meaning the
      // same names and bounds. In principle the type parameters could have different names, but that
      // would be confusing, and our code would reject it anyway because it wouldn't consider that
      // the return type of Foo<U> build() was really the same as the declaration of Foo<T>. This
      // check produces a better error message in that case and similar ones.
  
      if (!sameTypeParameters(autoValueClass, builderTypeElement)) {
        errorReporter.reportError(
            "Type parameters of "
                + builderTypeElement
                + " must have same names and bounds as "
                + "type parameters of "
                + autoValueClass,
            builderTypeElement);
        return Optional.empty();
      }
      return Optional.of(new Builder(builderTypeElement));
    }