Make sure all processing steps defer elements if TypeNotPresentException is thrown.

Fixes https://github.com/google/dagger/issues/1311

RELNOTES=Make sure all processing steps defer elements if `TypeNotPresentException` is thrown.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=223400457
diff --git a/java/dagger/internal/codegen/InjectProcessingStep.java b/java/dagger/internal/codegen/InjectProcessingStep.java
index 5ea414e..be8c975 100644
--- a/java/dagger/internal/codegen/InjectProcessingStep.java
+++ b/java/dagger/internal/codegen/InjectProcessingStep.java
@@ -16,72 +16,61 @@
 
 package dagger.internal.codegen;
 
-import com.google.auto.common.BasicAnnotationProcessor;
 import com.google.auto.common.MoreElements;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.SetMultimap;
 import java.lang.annotation.Annotation;
 import java.util.Set;
 import javax.inject.Inject;
 import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementVisitor;
 import javax.lang.model.element.ExecutableElement;
 import javax.lang.model.element.VariableElement;
-import javax.lang.model.util.ElementKindVisitor6;
+import javax.lang.model.util.ElementKindVisitor8;
 
 /**
  * An annotation processor for generating Dagger implementation code based on the {@link Inject}
  * annotation.
  */
-final class InjectProcessingStep implements BasicAnnotationProcessor.ProcessingStep {
-  private final InjectBindingRegistry injectBindingRegistry;
+// TODO(gak): add some error handling for bad source files
+final class InjectProcessingStep extends TypeCheckingProcessingStep<Element> {
+  private final ElementVisitor<Void, Void> visitor;
 
   @Inject
   InjectProcessingStep(InjectBindingRegistry injectBindingRegistry) {
-    this.injectBindingRegistry = injectBindingRegistry;
+    super(e -> e);
+    this.visitor =
+        new ElementKindVisitor8<Void, Void>() {
+          @Override
+          public Void visitExecutableAsConstructor(
+              ExecutableElement constructorElement, Void aVoid) {
+            injectBindingRegistry.tryRegisterConstructor(constructorElement);
+            return null;
+          }
+
+          @Override
+          public Void visitVariableAsField(VariableElement fieldElement, Void aVoid) {
+            injectBindingRegistry.tryRegisterMembersInjectedType(
+                MoreElements.asType(fieldElement.getEnclosingElement()));
+            return null;
+          }
+
+          @Override
+          public Void visitExecutableAsMethod(ExecutableElement methodElement, Void aVoid) {
+            injectBindingRegistry.tryRegisterMembersInjectedType(
+                MoreElements.asType(methodElement.getEnclosingElement()));
+            return null;
+          }
+        };
   }
 
   @Override
   public Set<Class<? extends Annotation>> annotations() {
-    return ImmutableSet.<Class<? extends Annotation>>of(Inject.class);
+    return ImmutableSet.of(Inject.class);
   }
 
   @Override
-  public Set<Element> process(
-      SetMultimap<Class<? extends Annotation>, Element> elementsByAnnotation) {
-    ImmutableSet.Builder<Element> rejectedElements = ImmutableSet.builder();
-    // TODO(gak): add some error handling for bad source files
-
-    for (Element injectElement : elementsByAnnotation.get(Inject.class)) {
-      try {
-        injectElement.accept(
-            new ElementKindVisitor6<Void, Void>() {
-              @Override
-              public Void visitExecutableAsConstructor(
-                  ExecutableElement constructorElement, Void v) {
-                injectBindingRegistry.tryRegisterConstructor(constructorElement);
-                return null;
-              }
-
-              @Override
-              public Void visitVariableAsField(VariableElement fieldElement, Void p) {
-                injectBindingRegistry.tryRegisterMembersInjectedType(
-                    MoreElements.asType(fieldElement.getEnclosingElement()));
-                return null;
-              }
-
-              @Override
-              public Void visitExecutableAsMethod(ExecutableElement methodElement, Void p) {
-                injectBindingRegistry.tryRegisterMembersInjectedType(
-                    MoreElements.asType(methodElement.getEnclosingElement()));
-                return null;
-              }
-            },
-            null);
-      } catch (TypeNotPresentException e) {
-        rejectedElements.add(injectElement);
-      }
-    }
-
-    return rejectedElements.build();
+  protected void process(
+      Element injectElement, ImmutableSet<Class<? extends Annotation>> annotations) {
+    injectElement.accept(visitor, null);
   }
 }