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);
}
}