Use Kotlin AnnotationRetention for androidx annotations
The annotation parser will convert to RetentionPolicy internally.
Bug: b/392865072
Change-Id: Ib4d599901d80ee6be9f7ea598f153f92b9f46e69
diff --git a/src/keepanno/java/androidx/annotation/keep/AnnotationPattern.kt b/src/keepanno/java/androidx/annotation/keep/AnnotationPattern.kt
index 389c5d6..a9eb9f8 100644
--- a/src/keepanno/java/androidx/annotation/keep/AnnotationPattern.kt
+++ b/src/keepanno/java/androidx/annotation/keep/AnnotationPattern.kt
@@ -24,7 +24,6 @@
package androidx.annotation.keep
-import java.lang.annotation.RetentionPolicy
import kotlin.annotation.Retention
import kotlin.annotation.Target
import kotlin.reflect.KClass
@@ -97,7 +96,7 @@
* <p>
* Matches annotations with matching retention policies
*
- * @return Retention policies. By default {@code RetentionPolicy.RUNTIME}.
+ * @return Retention policies. By default {@code AnnotationRetention.RUNTIME}.
*/
- val retention: Array<RetentionPolicy> = [RetentionPolicy.RUNTIME],
+ val retention: Array<AnnotationRetention> = [AnnotationRetention.RUNTIME],
)
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/AnnotationPatternParser.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/AnnotationPatternParser.java
index f10f9cd..c628528 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/AnnotationPatternParser.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/asm/AnnotationPatternParser.java
@@ -14,6 +14,7 @@
import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.function.Consumer;
+import kotlin.annotation.AnnotationRetention;
import org.objectweb.asm.AnnotationVisitor;
public class AnnotationPatternParser
@@ -58,7 +59,11 @@
private static class RetentionParser
extends PropertyParserBase<RetentionPolicy, RetentionProperty> {
+ // Standard Java RetentionPolicy.
private static final String RETENTION_POLICY_DESC = "Ljava/lang/annotation/RetentionPolicy;";
+ // Kotlin version of Java RetentionPolicy.
+ private static final String ANNOTATION_RETENTION_DESC =
+ "Lkotlin/annotation/AnnotationRetention;";
public RetentionParser(ParsingContext parsingContext) {
super(parsingContext);
@@ -76,6 +81,17 @@
setValue.accept(RetentionPolicy.valueOf(value));
return true;
}
+ if (ANNOTATION_RETENTION_DESC.equals(descriptor)) {
+ AnnotationRetention annotationRetention = AnnotationRetention.valueOf(value);
+ switch (annotationRetention) {
+ case BINARY:
+ setValue.accept(RetentionPolicy.CLASS);
+ return true;
+ case RUNTIME:
+ setValue.accept(RetentionPolicy.RUNTIME);
+ return true;
+ }
+ }
return super.tryPropertyEnum(property, name, descriptor, value, setValue);
}
}
diff --git a/src/test/java/com/android/tools/r8/keepanno/utils/DocPrinterBase.java b/src/test/java/com/android/tools/r8/keepanno/utils/DocPrinterBase.java
index e83aed8..6aacce6 100644
--- a/src/test/java/com/android/tools/r8/keepanno/utils/DocPrinterBase.java
+++ b/src/test/java/com/android/tools/r8/keepanno/utils/DocPrinterBase.java
@@ -9,6 +9,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.function.Function;
public abstract class DocPrinterBase<T> {
@@ -23,6 +24,10 @@
return returnDesc == null && deprecatedDesc == null && additionalLines.isEmpty();
}
+ public T applyIf(boolean condition, Function<T, T> onTrue, Function<T, T> onFalse) {
+ return condition ? onTrue.apply(self()) : onFalse.apply(self());
+ }
+
public T clearDocLines() {
additionalLines.clear();
return self();
diff --git a/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java b/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
index c9c382c..b0089be 100644
--- a/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
+++ b/src/test/java/com/android/tools/r8/keepanno/utils/KeepItemAnnotationGenerator.java
@@ -38,6 +38,7 @@
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
+import kotlin.annotation.AnnotationRetention;
public class KeepItemAnnotationGenerator {
@@ -104,6 +105,8 @@
private static final ClassReference JAVA_STRING = classFromClass(String.class);
private static final ClassReference JAVA_RETENTION_POLICY = classFromClass(RetentionPolicy.class);
+ private static final ClassReference KOTLIN_ANNOTATION_RETENTION =
+ classFromClass(AnnotationRetention.class);
private static final String AST_PKG = "com.android.tools.r8.keepanno.ast";
private static final String R8_ANNO_PKG = "com.android.tools.r8.keepanno.annotations";
@@ -1006,12 +1009,21 @@
.defaultValue(CLASS_NAME_PATTERN, defaultInvalidClassNamePattern());
}
- private static GroupMember annotationRetention() {
+ private static GroupMember annotationRetention(boolean generateKotlin) {
return new GroupMember("retention")
.setDocTitle("Specify which retention policies must be set for the annotations.")
.addParagraph("Matches annotations with matching retention policies")
- .setDocReturn("Retention policies. By default {@code RetentionPolicy.RUNTIME}.")
- .defaultArrayValue(JAVA_RETENTION_POLICY, "RetentionPolicy.RUNTIME");
+ .setDocReturn("Retention policies. By default {@code AnnotationRetention.RUNTIME}.")
+ .applyIf(
+ generateKotlin,
+ gm ->
+ gm.setDocReturn(
+ "Retention policies. By default {@code AnnotationRetention.RUNTIME}.")
+ .defaultArrayValue(
+ KOTLIN_ANNOTATION_RETENTION, "AnnotationRetention.RUNTIME"),
+ gm ->
+ gm.setDocReturn("Retention policies. By default {@code RetentionPolicy.RUNTIME}.")
+ .defaultArrayValue(JAVA_RETENTION_POLICY, "RetentionPolicy.RUNTIME"));
}
private GroupMember bindingName() {
@@ -1566,7 +1578,7 @@
() -> {
annotationNameGroup().generate(this);
println();
- annotationRetention().generate(this);
+ annotationRetention(generateKotlin()).generate(this);
});
printCloseAnnotationClass();
}
@@ -2280,7 +2292,8 @@
List<Group> getAnnotationPatternGroups() {
return ImmutableList.of(
- annotationNameGroup(), new Group("retention").addMember(annotationRetention()));
+ annotationNameGroup(),
+ new Group("retention").addMember(annotationRetention(generateKotlin())));
}
private void generateAnnotationPatternConstants() {