docs: private boolean classifyMethods(
        Iterable<ExecutableElement> methods, boolean autoValueHasToBuilder) {
      int startErrorCount = errorReporter.errorCount();
      for (ExecutableElement method : methods) {
        classifyMethod(method);
      }
      if (errorReporter.errorCount() > startErrorCount) {
        return false;
      }
      Multimap<String, ExecutableElement> propertyNameToSetter;
      if (propertyNameToPrefixedSetters.isEmpty()) {
        propertyNameToSetter = propertyNameToUnprefixedSetters;
        this.settersPrefixed = false;
      } else if (propertyNameToUnprefixedSetters.isEmpty()) {
        propertyNameToSetter = propertyNameToPrefixedSetters;
        this.settersPrefixed = true;
      } else {
        errorReporter.reportError(
            "If any setter methods use the setFoo convention then all must",
            propertyNameToUnprefixedSetters.values().iterator().next());
        return false;
      }
      getterToPropertyName.forEach(
          (getter, property) -> {
            TypeMirror propertyType = getterToPropertyType.get(getter);
            boolean hasSetter = propertyNameToSetter.containsKey(property);
            PropertyBuilder propertyBuilder = propertyNameToPropertyBuilder.get(property);
            boolean hasBuilder = propertyBuilder != null;
            if (hasBuilder) {
              // If property bar of type Bar has a barBuilder() that returns BarBuilder, then it must
              // be possible to make a BarBuilder from a Bar if either (1) the @AutoValue class has a
              // toBuilder() or (2) there is also a setBar(Bar). Making BarBuilder from Bar is
              // possible if Bar either has a toBuilder() method or is a Guava immutable collection
              // (in which case we can use addAll or putAll).
              boolean canMakeBarBuilder =
                  (propertyBuilder.getBuiltToBuilder() != null
                      || propertyBuilder.getCopyAll() != null);
              boolean needToMakeBarBuilder = (autoValueHasToBuilder || hasSetter);
              if (needToMakeBarBuilder && !canMakeBarBuilder) {
                String error =
                    String.format(
                        "Property builder method returns %1$s but there is no way to make that type"
                            + " from %2$s: %2$s does not have a non-static toBuilder() method that"
                            + " returns %1$s",
                        propertyBuilder.getBuilderTypeMirror(), propertyType);
                errorReporter.reportError(error, propertyBuilder.getPropertyBuilderMethod());
              }
            } else if (!hasSetter) {
              // We have neither barBuilder() nor setBar(Bar), so we should complain.
              String setterName = settersPrefixed ? prefixWithSet(property) : property;
              String error =
                  String.format(
                      "Expected a method with this signature: %s%s %s(%s), or a %sBuilder() method",
                      builderType, typeParamsString(), setterName, propertyType, property);
              errorReporter.reportError(error, builderType);
            }
          });
      return errorReporter.errorCount() == startErrorCount;
    }