@Override
  public final boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
    if (annotationType == null) {
      // This should not happen. If the annotation type is not found, how did the processor get
      // triggered?
      processingEnv
          .getMessager()
          .printMessage(
              Diagnostic.Kind.ERROR,
              "Did not process @"
                  + annotationClassName
                  + " because the annotation class was not found");
      return false;
    }
    ImmutableMap<TypeElement, String> deferredTypes =
        deferredTypeNames.entrySet().stream()
            .collect(
                toImmutableMap(
                    entry -> elementUtils().getTypeElement(entry.getKey()), Map.Entry::getValue));
    if (roundEnv.processingOver()) {
      // This means that the previous round didn't generate any new sources, so we can't have found
      // any new instances of @AutoValue; and we can't have any new types that are the reason a type
      // was in deferredTypes.
      deferredTypes.forEach(
          (type, missing) -> {
            String including = missing.isEmpty() ? "" : ("including " + missing);
            errorReporter.reportError(
                type,
                "[%sUndefined] Did not generate @%s class for %s because it references"
                    + " undefined types %s",
                simpleAnnotationName,
                simpleAnnotationName,
                type.getQualifiedName(),
                including);
          });
      return false;
    }
    Collection<? extends Element> annotatedElements =
        roundEnv.getElementsAnnotatedWith(annotationType);
    List<TypeElement> types =
        new ImmutableList.Builder<TypeElement>()
            .addAll(deferredTypes.keySet())
            .addAll(ElementFilter.typesIn(annotatedElements))
            .build();
    deferredTypeNames.clear();
    for (TypeElement type : types) {
      try {
        validateType(type);
        processType(type);
      } catch (AbortProcessingException e) {
        // We abandoned this type; continue with the next.
      } catch (MissingTypeException e) {
        // We abandoned this type, but only because we needed another type that it references and
        // that other type was missing. It is possible that the missing type will be generated by
        // further annotation processing, so we will try again on the next round (perhaps failing
        // again and adding it back to the list).
        addDeferredType(type, e.getMessage());
      } catch (RuntimeException e) {
        String trace = Throwables.getStackTraceAsString(e);
        errorReporter.reportError(
            type,
            "[%sException] @%s processor threw an exception: %s",
            simpleAnnotationName,
            simpleAnnotationName,
            trace);
        throw e;
      }
    }
    return false; // never claim annotation, because who knows what other processors want?
  }
Returns the annotations (in string form) that should be applied to the property's method
implementation.
value/src/main/java/com/google/auto/value/processor/AutoValueishProcessor.java