diff options
author | Zac Sweers <pandanomic@gmail.com> | 2021-05-27 13:34:02 -0700 |
---|---|---|
committer | Google Java Core Libraries <java-libraries-firehose+copybara@google.com> | 2021-05-27 13:34:33 -0700 |
commit | 7d3aa66ed4a4a419966e29ec9500779640e0a903 (patch) | |
tree | 0f04f8d2f8f0b95b5b3ca03aba793d87d9bad4c4 | |
parent | 2b77e449d269a73f43a9cc1d410854c473b026f2 (diff) | |
download | auto-7d3aa66ed4a4a419966e29ec9500779640e0a903.tar.gz |
Implicitly exclude Kotlin `@Metadata` annotations from `@CopyAnnotations`
Resolves #1087
Fixes #1099
COPYBARA_INTEGRATE_REVIEW=https://github.com/google/auto/pull/1099 from ZacSweers:z/metadata eb0328e9ac7772b5f811ea7d5094786ccc6d678e
PiperOrigin-RevId: 376238198
3 files changed, 54 insertions, 1 deletions
diff --git a/value/src/main/java/com/google/auto/value/processor/AutoValueishProcessor.java b/value/src/main/java/com/google/auto/value/processor/AutoValueishProcessor.java index 203a5ea5..8237b82e 100644 --- a/value/src/main/java/com/google/auto/value/processor/AutoValueishProcessor.java +++ b/value/src/main/java/com/google/auto/value/processor/AutoValueishProcessor.java @@ -935,7 +935,25 @@ abstract class AutoValueishProcessor extends AbstractProcessor { // Only copy annotations from a class if it has @AutoValue.CopyAnnotations. if (hasAnnotationMirror(type, COPY_ANNOTATIONS_NAME)) { Set<String> excludedAnnotations = - union(getExcludedAnnotationClassNames(type), getAnnotationsMarkedWithInherited(type)); + ImmutableSet.<String>builder() + .addAll(getExcludedAnnotationClassNames(type)) + .addAll(getAnnotationsMarkedWithInherited(type)) + // + // Kotlin classes have an intrinsic @Metadata annotation generated + // onto them by kotlinc. This annotation is specific to the annotated + // class and should not be implicitly copied. Doing so can mislead + // static analysis or metaprogramming tooling that reads the data + // contained in these annotations. + // + // It may be surprising to see AutoValue classes written in Kotlin + // when they could be written as Kotlin data classes, but this can + // come up in cases where consumers rely on AutoValue features or + // extensions that are not available in data classes. + // + // See: https://github.com/google/auto/issues/1087 + // + .add(ClassNames.KOTLIN_METADATA_NAME) + .build(); return copyAnnotations(type, type, excludedAnnotations); } else { diff --git a/value/src/main/java/com/google/auto/value/processor/ClassNames.java b/value/src/main/java/com/google/auto/value/processor/ClassNames.java index e033c77d..76c50710 100644 --- a/value/src/main/java/com/google/auto/value/processor/ClassNames.java +++ b/value/src/main/java/com/google/auto/value/processor/ClassNames.java @@ -30,4 +30,5 @@ final class ClassNames { static final String AUTO_VALUE_BUILDER_NAME = AUTO_VALUE_NAME + ".Builder"; static final String AUTO_BUILDER_NAME = AUTO_VALUE_PACKAGE_NAME + "AutoBuilder"; static final String COPY_ANNOTATIONS_NAME = AUTO_VALUE_NAME + ".CopyAnnotations"; + static final String KOTLIN_METADATA_NAME = "kotlin.Metadata"; } diff --git a/value/src/test/java/com/google/auto/value/processor/AutoValueCompilationTest.java b/value/src/test/java/com/google/auto/value/processor/AutoValueCompilationTest.java index afb86ec1..ab6690fd 100644 --- a/value/src/test/java/com/google/auto/value/processor/AutoValueCompilationTest.java +++ b/value/src/test/java/com/google/auto/value/processor/AutoValueCompilationTest.java @@ -3382,6 +3382,40 @@ public class AutoValueCompilationTest { } } + // This is a regression test for the problem described in + // https://github.com/google/auto/issues/1087. + @Test + public void kotlinMetadataAnnotationsAreImplicitlyExcludedFromCopying() { + JavaFileObject metadata = + JavaFileObjects.forSourceLines( + "kotlin.Metadata", "package kotlin;", "", "public @interface Metadata {", "}"); + JavaFileObject test = + JavaFileObjects.forSourceLines( + "foo.bar.Test", + "package foo.bar;", + "", + "import com.google.auto.value.AutoValue;", + "import kotlin.Metadata;", + "", + "@AutoValue.CopyAnnotations", + "@Metadata", + "@AutoValue", + "public abstract class Test {", + " public abstract String string();", + "}"); + AutoValueProcessor autoValueProcessor = new AutoValueProcessor(); + Compilation compilation = + javac() + .withProcessors(autoValueProcessor) + .withOptions("-Xlint:-processing", "-implicit:none") + .compile(test, metadata); + assertThat(compilation).succeededWithoutWarnings(); + assertThat(compilation) + .generatedSourceFile("foo.bar.AutoValue_Test") + .contentsAsUtf8String() + .doesNotContain("kotlin.Metadata"); + } + private String sorted(String... imports) { return Arrays.stream(imports).sorted().collect(joining("\n")); } |