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() {