@Override
  Optional<String> propertyForBuilderGetter(ExecutableElement method) {
    String methodName = method.getSimpleName().toString();
    if (paramToPropertyName.containsValue(methodName)) {
      return Optional.of(methodName);
    }
    if (AutoValueishProcessor.isPrefixedGetter(method)) {
      int prefixLength = methodName.startsWith("get") ? 3 : 2; // "get" or "is"
      String unprefixed = methodName.substring(prefixLength);
      String propertyName = PropertyNames.decapitalizeLikeJavaBeans(unprefixed);
      if (paramToPropertyName.containsValue(propertyName)) {
        return Optional.of(propertyName);
      }
      propertyName = PropertyNames.decapitalizeNormally(unprefixed);
      if (paramToPropertyName.containsValue(propertyName)) {
        return Optional.of(propertyName);
      }
    }
    return Optional.empty();
  }
Classifies the given methods from a builder type and its ancestors.

@param methods the abstract methods in {@code builderType} and its ancestors.
@param errorReporter where to report errors.
@param processingEnv the ProcessingEnvironment for annotation processing.
@param executable the constructor or static method that AutoBuilder will call.
@param builtType the type to be built.
@param builderType the builder class or interface within {@code ofClass}.
@param propertiesWithDefaults properties that have a default value, so it is not an error for
    them not to have a setter.
@return an {@code Optional} that contains the results of the classification if it was
    successful or nothing if it was not.
value/src/main/java/com/google/auto/value/processor/BuilderMethodClassifierForAutoBuilder.java