static Optional<BuilderMethodClassifier<VariableElement>> classify(
      Iterable<ExecutableElement> methods,
      ErrorReporter errorReporter,
      ProcessingEnvironment processingEnv,
      Executable executable,
      TypeMirror builtType,
      TypeElement builderType,
      ImmutableSet<String> propertiesWithDefaults,
      Nullables nullables) {
    ImmutableBiMap<VariableElement, String> paramToPropertyName =
        executable.parameters().stream()
            .collect(toImmutableBiMap(v -> v, v -> v.getSimpleName().toString()));
    ImmutableMap<String, AnnotatedTypeMirror> rewrittenPropertyTypes =
        rewriteParameterTypes(executable, builderType, errorReporter, processingEnv.getTypeUtils());
    BuilderMethodClassifier<VariableElement> classifier =
        new BuilderMethodClassifierForAutoBuilder(
            errorReporter,
            processingEnv,
            executable,
            builtType,
            builderType,
            paramToPropertyName,
            rewrittenPropertyTypes,
            propertiesWithDefaults,
            nullables);
    if (classifier.classifyMethods(methods, false)) {
      return Optional.of(classifier);
    } else {
      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