diff options
author | weijiaxu <weijiaxu@google.com> | 2018-05-29 11:41:57 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-06-01 18:08:19 -0700 |
commit | 47b5655933044cd7c48003bafea1dece1d6575d1 (patch) | |
tree | 4a07d169b1de9ab0c56a439840f2d9c42c77b7dd | |
parent | 2c3d81eeac82472d06027bc65d661e16735c8608 (diff) |
Add inject method to generated component by RCG.
Bug: 80270083
Test: tap presubmit.
PiperOrigin-RevId: 198430675
Change-Id: Iaf0e5a22a8e496339b666b5906584de3acdde6ed
-rw-r--r-- | java/com/android/dialer/rootcomponentgenerator/RootComponentGeneratingStep.java | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/java/com/android/dialer/rootcomponentgenerator/RootComponentGeneratingStep.java b/java/com/android/dialer/rootcomponentgenerator/RootComponentGeneratingStep.java index cb312083f..5321849ec 100644 --- a/java/com/android/dialer/rootcomponentgenerator/RootComponentGeneratingStep.java +++ b/java/com/android/dialer/rootcomponentgenerator/RootComponentGeneratingStep.java @@ -26,6 +26,7 @@ import com.android.dialer.inject.DialerVariant; import com.android.dialer.inject.IncludeInDialerRoot; import com.android.dialer.inject.InstallIn; import com.android.dialer.inject.RootComponentGeneratorMetadata; +import com.android.dialer.inject.testing.GenerateTestDaggerApp; import com.google.auto.common.BasicAnnotationProcessor.ProcessingStep; import com.google.auto.common.MoreElements; import com.google.common.base.Optional; @@ -35,6 +36,7 @@ import com.google.common.collect.ListMultimap; import com.google.common.collect.SetMultimap; import com.squareup.javapoet.AnnotationSpec; import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeSpec; import dagger.Component; import java.lang.annotation.Annotation; @@ -51,23 +53,55 @@ import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import javax.lang.model.type.TypeMirror; -/** Generates root component for a java type annotated with {@link DialerRootComponent}. */ +/** + * Generates root component for a java type annotated with {@link DialerRootComponent}. + * + * <p>If users use {@link GenerateTestDaggerApp} along with RootComponentGenerator, there's an + * optional method that they can use to inject instance in the test. + * + * <p>Example: + * + * <p> + * + * <pre> + * <code> + * @Inject SomeThing someThing; + * @Before + * public void setUp() { + * ... + * TestApplication application = (TestApplication) RuntimeEnvironment.application; + * TestComponent component = (TestComponent) application.component(); + * component.inject(this); + * ... + * } + * </code> + * </pre> + */ final class RootComponentGeneratingStep implements ProcessingStep { private final ProcessingEnvironment processingEnv; + private TypeElement annotatedTest; + public RootComponentGeneratingStep(ProcessingEnvironment processingEnv) { this.processingEnv = processingEnv; } @Override public Set<? extends Class<? extends Annotation>> annotations() { - return ImmutableSet.of(DialerRootComponent.class, InstallIn.class, IncludeInDialerRoot.class); + return ImmutableSet.of( + DialerRootComponent.class, + InstallIn.class, + IncludeInDialerRoot.class, + GenerateTestDaggerApp.class); } @Override public Set<? extends Element> process( SetMultimap<Class<? extends Annotation>, Element> elementsByAnnotation) { + for (Element element : elementsByAnnotation.get(GenerateTestDaggerApp.class)) { + annotatedTest = MoreElements.asType(element); + } for (Element element : elementsByAnnotation.get(DialerRootComponent.class)) { // defer root components to the next round in case where the current build target contains // elements annotated with @InstallIn. Annotation processor cannot detect metadata files @@ -110,6 +144,9 @@ final class RootComponentGeneratingStep implements ProcessingStep { componentAnnotation.addMember("modules", "$T.class", annotatedElement.asType()); } rootComponentClassBuilder.addAnnotation(componentAnnotation.build()); + if (annotatedTest != null) { + rootComponentClassBuilder.addMethod(generateInjectMethod()); + } TypeSpec rootComponentClass = rootComponentClassBuilder.build(); RootComponentUtils.writeJavaFile( processingEnv, ClassName.get(rootElement).packageName(), rootComponentClass); @@ -163,6 +200,14 @@ final class RootComponentGeneratingStep implements ProcessingStep { } } + private MethodSpec generateInjectMethod() { + return MethodSpec.methodBuilder("inject") + .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT) + .returns(void.class) + .addParameter(ClassName.get(annotatedTest), "test") + .build(); + } + private interface MetadataProcessor { void process(TypeElement typeElement); } |