From a4e4b55baa92777205e686b1cb48799928763e78 Mon Sep 17 00:00:00 2001 From: Jake Wharton Date: Mon, 9 Dec 2019 11:01:29 -0500 Subject: [PATCH] Add generated annotation when possible --- .../compiler/DaggerReflectCompiler.java | 27 +++++++++++++--- .../compiler/DaggerReflectCompilerTest.java | 32 +++++++++++++++++++ 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/reflect-compiler/src/main/java/dagger/reflect/compiler/DaggerReflectCompiler.java b/reflect-compiler/src/main/java/dagger/reflect/compiler/DaggerReflectCompiler.java index 98a4765d..dff83b85 100644 --- a/reflect-compiler/src/main/java/dagger/reflect/compiler/DaggerReflectCompiler.java +++ b/reflect-compiler/src/main/java/dagger/reflect/compiler/DaggerReflectCompiler.java @@ -16,6 +16,7 @@ package dagger.reflect.compiler; import static java.util.Collections.singleton; +import static javax.lang.model.SourceVersion.RELEASE_8; import static javax.lang.model.element.Modifier.FINAL; import static javax.lang.model.element.Modifier.PRIVATE; import static javax.lang.model.element.Modifier.PUBLIC; @@ -24,6 +25,7 @@ import static net.ltgt.gradle.incap.IncrementalAnnotationProcessorType.ISOLATING; import com.google.auto.service.AutoService; +import com.squareup.javapoet.AnnotationSpec; import com.squareup.javapoet.ClassName; import com.squareup.javapoet.JavaFile; import com.squareup.javapoet.MethodSpec; @@ -48,12 +50,27 @@ public final class DaggerReflectCompiler extends AbstractProcessor { private Filer filer; private Messager messager; + private @Nullable AnnotationSpec generatedAnnotation; @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); filer = processingEnv.getFiler(); messager = processingEnv.getMessager(); + + String generatedAnnotationName = + processingEnv.getSourceVersion().compareTo(RELEASE_8) <= 0 + ? "javax.annotation.Generated" + : "javax.annotation.processing.Generated"; + TypeElement generatedAnnotationType = + processingEnv.getElementUtils().getTypeElement(generatedAnnotationName); + if (generatedAnnotationType != null) { + generatedAnnotation = + AnnotationSpec.builder(ClassName.get(generatedAnnotationType)) + .addMember("value", "$S", getClass().getName()) + .addMember("comments", "$S", "https://github.com/JakeWharton/dagger-reflect") + .build(); + } } @Override @@ -77,13 +94,15 @@ public boolean process(Set annotations, RoundEnvironment TypeElement factory = findFactory(component); ClassName factoryName = factory != null ? ClassName.get(factory) : null; - TypeSpec type = + TypeSpec.Builder typeBuilder = createComponent(componentName, builderName, factoryName) .toBuilder() - .addOriginatingElement(component) - .build(); + .addOriginatingElement(component); + if (generatedAnnotation != null) { + typeBuilder.addAnnotation(generatedAnnotation); + } JavaFile file = - JavaFile.builder(componentName.packageName(), type) + JavaFile.builder(componentName.packageName(), typeBuilder.build()) .addFileComment("Generated by Dagger's reflect-compiler. Do not modify!") .build(); try { diff --git a/reflect-compiler/src/test/java/dagger/reflect/compiler/DaggerReflectCompilerTest.java b/reflect-compiler/src/test/java/dagger/reflect/compiler/DaggerReflectCompilerTest.java index dd167661..a5100d5f 100644 --- a/reflect-compiler/src/test/java/dagger/reflect/compiler/DaggerReflectCompilerTest.java +++ b/reflect-compiler/src/test/java/dagger/reflect/compiler/DaggerReflectCompilerTest.java @@ -23,6 +23,18 @@ import org.junit.Test; public final class DaggerReflectCompilerTest { + private static final String generatedAnnotationImport; + + static { + String line = "import javax.annotation.processing.Generated;\n"; + try { + Class.forName("javax.annotation.processing.Generated"); + } catch (ClassNotFoundException ignored) { + line = "import javax.annotation.Generated;\n"; + } + generatedAnnotationImport = line; + } + @Test public void simple() { JavaFileObject component = @@ -45,7 +57,12 @@ public void simple() { + "\n" + "import dagger.reflect.DaggerReflect;\n" + "import java.lang.AssertionError;\n" + + generatedAnnotationImport + "\n" + + "@Generated(\n" + + " value = \"dagger.reflect.compiler.DaggerReflectCompiler\",\n" + + " comments = \"https://github.com/JakeWharton/dagger-reflect\"\n" + + ")\n" + "public final class DaggerTestComponent {\n" + " private DaggerTestComponent() {\n" + " throw new AssertionError();\n" @@ -89,7 +106,12 @@ public void nested() { + "\n" + "import dagger.reflect.DaggerReflect;\n" + "import java.lang.AssertionError;\n" + + generatedAnnotationImport + "\n" + + "@Generated(\n" + + " value = \"dagger.reflect.compiler.DaggerReflectCompiler\",\n" + + " comments = \"https://github.com/JakeWharton/dagger-reflect\"\n" + + ")\n" + "public final class DaggerOne_Two_TestComponent {\n" + " private DaggerOne_Two_TestComponent() {\n" + " throw new AssertionError();\n" @@ -132,7 +154,12 @@ public void builder() { + "\n" + "import dagger.reflect.DaggerReflect;\n" + "import java.lang.AssertionError;\n" + + generatedAnnotationImport + "\n" + + "@Generated(\n" + + " value = \"dagger.reflect.compiler.DaggerReflectCompiler\",\n" + + " comments = \"https://github.com/JakeWharton/dagger-reflect\"\n" + + ")\n" + "public final class DaggerTestComponent {\n" + " private DaggerTestComponent() {\n" + " throw new AssertionError();\n" @@ -178,7 +205,12 @@ public void factory() { + "\n" + "import dagger.reflect.DaggerReflect;\n" + "import java.lang.AssertionError;\n" + + generatedAnnotationImport + "\n" + + "@Generated(\n" + + " value = \"dagger.reflect.compiler.DaggerReflectCompiler\",\n" + + " comments = \"https://github.com/JakeWharton/dagger-reflect\"\n" + + ")\n" + "public final class DaggerTestComponent {\n" + " private DaggerTestComponent() {\n" + " throw new AssertionError();\n"