docs: private Optional<DeclaredType> tryFindBuilder(
        final QualifiedName superclass, TypeElement valueType) {
      TypeElement builderType = typesIn(valueType.getEnclosedElements())
          .stream()
          .filter(element -> element.getSimpleName().contentEquals(USER_BUILDER_NAME))
          .findAny()
          .orElse(null);
      if (builderType == null) {
        if (valueType.getKind() == INTERFACE) {
          messager.printMessage(
              NOTE,
              "Add \"class Builder extends "
                  + superclass.getSimpleName()
                  + " {}\" to your interface to enable the FreeBuilder API",
              valueType);
        } else {
          messager.printMessage(
              NOTE,
              "Add \"public static class Builder extends "
                  + superclass.getSimpleName()
                  + " {}\" to your class to enable the FreeBuilder API",
              valueType);
        }
        return Optional.empty();
      }
  
      boolean extendsSuperclass =
          new IsSubclassOfGeneratedTypeVisitor(superclass, valueType.getTypeParameters())
              .visit(builderType.getSuperclass());
      if (!extendsSuperclass) {
        messager.printMessage(
            ERROR,
            "Builder extends the wrong type (should be " + superclass.getSimpleName() + ")",
            builderType);
        return Optional.empty();
      }
  
      if (builderType.getTypeParameters().size() != valueType.getTypeParameters().size()) {
        if (builderType.getTypeParameters().isEmpty()) {
          messager.printMessage(ERROR, "Builder must be generic", builderType);
        } else {
          messager.printMessage(ERROR, "Builder has the wrong type parameters", builderType);
        }
        return Optional.empty();
      }
  
      DeclaredType declaredValueType = (DeclaredType) valueType.asType();
      DeclaredType declaredBuilderType = types.getDeclaredType(
          builderType, declaredValueType.getTypeArguments().toArray(new TypeMirror[0]));
  
      return Optional.of(declaredBuilderType);
    }