aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Sweers <pandanomic@gmail.com>2021-05-27 13:34:02 -0700
committerGoogle Java Core Libraries <java-libraries-firehose+copybara@google.com>2021-05-27 13:34:33 -0700
commit7d3aa66ed4a4a419966e29ec9500779640e0a903 (patch)
tree0f04f8d2f8f0b95b5b3ca03aba793d87d9bad4c4
parent2b77e449d269a73f43a9cc1d410854c473b026f2 (diff)
downloadauto-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
-rw-r--r--value/src/main/java/com/google/auto/value/processor/AutoValueishProcessor.java20
-rw-r--r--value/src/main/java/com/google/auto/value/processor/ClassNames.java1
-rw-r--r--value/src/test/java/com/google/auto/value/processor/AutoValueCompilationTest.java34
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"));
}