Reapply "Add support for tests using androidx keep annotations"
This reverts commit 809cceb4534e1a1f1ca446a32bfa9fef13656cd2.
Reapply "Change the keep annotations in the androidx namespace to Kotlin source"
This reverts commit 8c2c3b1010ec081f0af519b8f8903d90229acde0.
With additional fix for SanityCheck.
Bug: b/392865072
Change-Id: I0d5dc671c4a7ea08960d92c28b5edf30e0e89627
diff --git a/src/keepanno/java/androidx/annotation/keep/AnnotationPattern.java b/src/keepanno/java/androidx/annotation/keep/AnnotationPattern.java
deleted file mode 100644
index aac8b68..0000000
--- a/src/keepanno/java/androidx/annotation/keep/AnnotationPattern.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// ***********************************************************************************
-// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
-// ***********************************************************************************
-
-// ***********************************************************************************
-// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
-// ***********************************************************************************
-
-package androidx.annotation.keep;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * A pattern structure for matching annotations.
- *
- * <p>If no properties are set, the default pattern matches any annotation with a runtime retention
- * policy.
- */
-@Target(ElementType.ANNOTATION_TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface AnnotationPattern {
-
- /**
- * Define the annotation-name pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining annotation-name:
- *
- * <ul>
- * <li>constant
- * <li>namePattern
- * </ul>
- *
- * <p>If none are specified the default is to match any annotation name.
- *
- * @return The qualified class name that defines the annotation.
- */
- String name() default "";
-
- /**
- * Define the annotation-name pattern by reference to a {@code Class} constant.
- *
- * <p>Mutually exclusive with the following other properties defining annotation-name:
- *
- * <ul>
- * <li>name
- * <li>namePattern
- * </ul>
- *
- * <p>If none are specified the default is to match any annotation name.
- *
- * @return The Class constant that defines the annotation.
- */
- Class<?> constant() default Object.class;
-
- /**
- * Define the annotation-name pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining annotation-name:
- *
- * <ul>
- * <li>name
- * <li>constant
- * </ul>
- *
- * <p>If none are specified the default is to match any annotation name.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern namePattern() default @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Specify which retention policies must be set for the annotations.
- *
- * <p>Matches annotations with matching retention policies
- *
- * @return Retention policies. By default {@code RetentionPolicy.RUNTIME}.
- */
- RetentionPolicy[] retention() default {RetentionPolicy.RUNTIME};
-}
diff --git a/src/keepanno/java/androidx/annotation/keep/AnnotationPattern.kt b/src/keepanno/java/androidx/annotation/keep/AnnotationPattern.kt
new file mode 100644
index 0000000..f8f1e97
--- /dev/null
+++ b/src/keepanno/java/androidx/annotation/keep/AnnotationPattern.kt
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// ***********************************************************************************
+// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
+// ***********************************************************************************
+
+// ***********************************************************************************
+// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
+// ***********************************************************************************
+
+package androidx.annotation.keep
+
+import java.lang.annotation.RetentionPolicy
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
+import kotlin.reflect.KClass
+
+/**
+ * A pattern structure for matching annotations.
+ *
+ * <p>
+ * If no properties are set, the default pattern matches any annotation with a runtime retention
+ * policy.
+ */
+@Retention(AnnotationRetention.BINARY)
+@Target(AnnotationTarget.ANNOTATION_CLASS)
+annotation class AnnotationPattern(
+
+ /**
+ * Define the annotation-name pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining annotation-name:
+ * <ul>
+ * <li>constant
+ * <li>namePattern
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any annotation name.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val name: String = "",
+
+ /**
+ * Define the annotation-name pattern by reference to a {@code Class} constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining annotation-name:
+ * <ul>
+ * <li>name
+ * <li>namePattern
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any annotation name.
+ *
+ * @return The Class constant that defines the annotation.
+ */
+ val constant: KClass<*> = Object::class,
+
+ /**
+ * Define the annotation-name pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining annotation-name:
+ * <ul>
+ * <li>name
+ * <li>constant
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any annotation name.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val namePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Specify which retention policies must be set for the annotations.
+ *
+ * <p>
+ * Matches annotations with matching retention policies
+ *
+ * @return Retention policies. By default {@code RetentionPolicy.RUNTIME}.
+ */
+ val retention: Array<RetentionPolicy> = [RetentionPolicy.RUNTIME],
+)
diff --git a/src/keepanno/java/androidx/annotation/keep/CheckOptimizedOut.java b/src/keepanno/java/androidx/annotation/keep/CheckOptimizedOut.kt
similarity index 80%
rename from src/keepanno/java/androidx/annotation/keep/CheckOptimizedOut.java
rename to src/keepanno/java/androidx/annotation/keep/CheckOptimizedOut.kt
index 122ed7e..c85f0ea 100644
--- a/src/keepanno/java/androidx/annotation/keep/CheckOptimizedOut.java
+++ b/src/keepanno/java/androidx/annotation/keep/CheckOptimizedOut.kt
@@ -18,12 +18,10 @@
// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
// ***********************************************************************************
-package androidx.annotation.keep;
+package androidx.annotation.keep
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
/**
* Mark that an item must be optimized out of the residual program.
@@ -38,9 +36,11 @@
* inlining vs merging, the use of this annotation is somewhat unreliable and should be used with
* caution. In most cases it is more appropriate to use {@link CheckRemoved}.
*/
-@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})
-@Retention(RetentionPolicy.CLASS)
-public @interface CheckOptimizedOut {
-
- String description() default "";
-}
+@Retention(AnnotationRetention.BINARY)
+@Target(
+ AnnotationTarget.TYPE,
+ AnnotationTarget.FIELD,
+ AnnotationTarget.FUNCTION,
+ AnnotationTarget.CONSTRUCTOR,
+)
+annotation class CheckOptimizedOut(val description: String = "")
diff --git a/src/keepanno/java/androidx/annotation/keep/CheckRemoved.java b/src/keepanno/java/androidx/annotation/keep/CheckRemoved.kt
similarity index 76%
rename from src/keepanno/java/androidx/annotation/keep/CheckRemoved.java
rename to src/keepanno/java/androidx/annotation/keep/CheckRemoved.kt
index 20d2d5d..0be0daa 100644
--- a/src/keepanno/java/androidx/annotation/keep/CheckRemoved.java
+++ b/src/keepanno/java/androidx/annotation/keep/CheckRemoved.kt
@@ -18,12 +18,10 @@
// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
// ***********************************************************************************
-package androidx.annotation.keep;
+package androidx.annotation.keep
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
/**
* Mark that an item must be fully removed from the residual program.
@@ -34,9 +32,11 @@
*
* <p>A class is removed if all of its members are removed and no references to the class remain.
*/
-@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})
-@Retention(RetentionPolicy.CLASS)
-public @interface CheckRemoved {
-
- String description() default "";
-}
+@Retention(AnnotationRetention.BINARY)
+@Target(
+ AnnotationTarget.TYPE,
+ AnnotationTarget.FIELD,
+ AnnotationTarget.FUNCTION,
+ AnnotationTarget.CONSTRUCTOR,
+)
+annotation class CheckRemoved(val description: String = "")
diff --git a/src/keepanno/java/androidx/annotation/keep/ClassAccessFlags.java b/src/keepanno/java/androidx/annotation/keep/ClassAccessFlags.kt
similarity index 93%
rename from src/keepanno/java/androidx/annotation/keep/ClassAccessFlags.java
rename to src/keepanno/java/androidx/annotation/keep/ClassAccessFlags.kt
index 0d4e765..80cdeed 100644
--- a/src/keepanno/java/androidx/annotation/keep/ClassAccessFlags.java
+++ b/src/keepanno/java/androidx/annotation/keep/ClassAccessFlags.kt
@@ -18,7 +18,7 @@
// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
// ***********************************************************************************
-package androidx.annotation.keep;
+package androidx.annotation.keep
/**
* Valid matches on class access flags and their negations.
@@ -26,7 +26,7 @@
* <p>The negated elements make it easier to express the inverse as we cannot use a "not/negation"
* operation syntactically.
*/
-public enum ClassAccessFlags {
+enum class ClassAccessFlags {
PUBLIC,
NON_PUBLIC,
PACKAGE_PRIVATE,
@@ -42,5 +42,5 @@
ANNOTATION,
NON_ANNOTATION,
ENUM,
- NON_ENUM
+ NON_ENUM,
}
diff --git a/src/keepanno/java/androidx/annotation/keep/ClassNamePattern.java b/src/keepanno/java/androidx/annotation/keep/ClassNamePattern.java
deleted file mode 100644
index 299bf04..0000000
--- a/src/keepanno/java/androidx/annotation/keep/ClassNamePattern.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// ***********************************************************************************
-// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
-// ***********************************************************************************
-
-// ***********************************************************************************
-// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
-// ***********************************************************************************
-
-package androidx.annotation.keep;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * A pattern structure for matching names of classes and interfaces.
- *
- * <p>If no properties are set, the default pattern matches any name of a class or interface.
- */
-@Target(ElementType.ANNOTATION_TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface ClassNamePattern {
-
- /**
- * Define the class-name pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining class-name:
- *
- * <ul>
- * <li>constant
- * <li>unqualifiedName
- * <li>unqualifiedNamePattern
- * <li>packageName
- * </ul>
- *
- * @return The qualified class name that defines the class.
- */
- String name() default "";
-
- /**
- * Define the class-name pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining class-name:
- *
- * <ul>
- * <li>name
- * <li>unqualifiedName
- * <li>unqualifiedNamePattern
- * <li>packageName
- * </ul>
- *
- * @return The class-constant that defines the class.
- */
- Class<?> constant() default Object.class;
-
- /**
- * Exact and unqualified name of the class or interface.
- *
- * <p>For example, the unqualified name of {@code com.example.MyClass} is {@code MyClass}. Note
- * that for inner classes a `$` will appear in the unqualified name,such as, {@code
- * MyClass$MyInnerClass}.
- *
- * <p>The default matches any unqualified name.
- *
- * <p>Mutually exclusive with the following other properties defining class-unqualified-name:
- *
- * <ul>
- * <li>unqualifiedNamePattern
- * <li>name
- * <li>constant
- * </ul>
- */
- String unqualifiedName() default "";
-
- /**
- * Define the unqualified class-name pattern by a string pattern.
- *
- * <p>The default matches any unqualified name.
- *
- * <p>Mutually exclusive with the following other properties defining class-unqualified-name:
- *
- * <ul>
- * <li>unqualifiedName
- * <li>name
- * <li>constant
- * </ul>
- *
- * @return The string pattern of the unqualified class name.
- */
- StringPattern unqualifiedNamePattern() default @StringPattern(exact = "");
-
- /**
- * Exact package name of the class or interface.
- *
- * <p>For example, the package of {@code com.example.MyClass} is {@code com.example}.
- *
- * <p>The default matches any package.
- *
- * <p>Mutually exclusive with the following other properties defining class-package-name:
- *
- * <ul>
- * <li>name
- * <li>constant
- * </ul>
- */
- String packageName() default "";
-}
diff --git a/src/keepanno/java/androidx/annotation/keep/ClassNamePattern.kt b/src/keepanno/java/androidx/annotation/keep/ClassNamePattern.kt
new file mode 100644
index 0000000..e01a876
--- /dev/null
+++ b/src/keepanno/java/androidx/annotation/keep/ClassNamePattern.kt
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// ***********************************************************************************
+// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
+// ***********************************************************************************
+
+// ***********************************************************************************
+// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
+// ***********************************************************************************
+
+package androidx.annotation.keep
+
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
+import kotlin.reflect.KClass
+
+/**
+ * A pattern structure for matching names of classes and interfaces.
+ *
+ * <p>
+ * If no properties are set, the default pattern matches any name of a class or interface.
+ */
+@Retention(AnnotationRetention.BINARY)
+@Target(AnnotationTarget.ANNOTATION_CLASS)
+annotation class ClassNamePattern(
+
+ /**
+ * Define the class-name pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-name:
+ * <ul>
+ * <li>constant
+ * <li>unqualifiedName
+ * <li>unqualifiedNamePattern
+ * <li>packageName
+ * </ul>
+ *
+ * @return The qualified class name that defines the class.
+ */
+ val name: String = "",
+
+ /**
+ * Define the class-name pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-name:
+ * <ul>
+ * <li>name
+ * <li>unqualifiedName
+ * <li>unqualifiedNamePattern
+ * <li>packageName
+ * </ul>
+ *
+ * @return The class-constant that defines the class.
+ */
+ val constant: KClass<*> = Object::class,
+
+ /**
+ * Exact and unqualified name of the class or interface.
+ *
+ * <p>
+ * For example, the unqualified name of {@code com.example.MyClass} is {@code MyClass}. Note that
+ * for inner classes a `$` will appear in the unqualified name,such as, {@code
+ * MyClass$MyInnerClass}.
+ *
+ * <p>
+ * The default matches any unqualified name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-unqualified-name:
+ * <ul>
+ * <li>unqualifiedNamePattern
+ * <li>name
+ * <li>constant
+ * </ul>
+ */
+ val unqualifiedName: String = "",
+
+ /**
+ * Define the unqualified class-name pattern by a string pattern.
+ *
+ * <p>
+ * The default matches any unqualified name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-unqualified-name:
+ * <ul>
+ * <li>unqualifiedName
+ * <li>name
+ * <li>constant
+ * </ul>
+ *
+ * @return The string pattern of the unqualified class name.
+ */
+ val unqualifiedNamePattern: StringPattern = StringPattern(exact = ""),
+
+ /**
+ * Exact package name of the class or interface.
+ *
+ * <p>
+ * For example, the package of {@code com.example.MyClass} is {@code com.example}.
+ *
+ * <p>
+ * The default matches any package.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-package-name:
+ * <ul>
+ * <li>name
+ * <li>constant
+ * </ul>
+ */
+ val packageName: String = "",
+)
diff --git a/src/keepanno/java/androidx/annotation/keep/FieldAccessFlags.java b/src/keepanno/java/androidx/annotation/keep/FieldAccessFlags.kt
similarity index 95%
rename from src/keepanno/java/androidx/annotation/keep/FieldAccessFlags.java
rename to src/keepanno/java/androidx/annotation/keep/FieldAccessFlags.kt
index 9b28dec..11867e6 100644
--- a/src/keepanno/java/androidx/annotation/keep/FieldAccessFlags.java
+++ b/src/keepanno/java/androidx/annotation/keep/FieldAccessFlags.kt
@@ -18,7 +18,7 @@
// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
// ***********************************************************************************
-package androidx.annotation.keep;
+package androidx.annotation.keep
/**
* Valid matches on field access flags and their negations.
@@ -26,7 +26,7 @@
* <p>The negated elements make it easier to express the inverse as we cannot use a "not/negation"
* operation syntactically.
*/
-public enum FieldAccessFlags {
+enum class FieldAccessFlags {
// General member flags.
PUBLIC,
NON_PUBLIC,
diff --git a/src/keepanno/java/androidx/annotation/keep/InstanceOfPattern.java b/src/keepanno/java/androidx/annotation/keep/InstanceOfPattern.kt
similarity index 68%
rename from src/keepanno/java/androidx/annotation/keep/InstanceOfPattern.java
rename to src/keepanno/java/androidx/annotation/keep/InstanceOfPattern.kt
index 9e55d6a..9387973 100644
--- a/src/keepanno/java/androidx/annotation/keep/InstanceOfPattern.java
+++ b/src/keepanno/java/androidx/annotation/keep/InstanceOfPattern.kt
@@ -22,30 +22,30 @@
// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
// ***********************************************************************************
-package androidx.annotation.keep;
+package androidx.annotation.keep
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
/**
* A pattern structure for matching instances of classes and interfaces.
*
- * <p>If no properties are set, the default pattern matches any instance.
+ * <p>
+ * If no properties are set, the default pattern matches any instance.
*/
-@Target(ElementType.ANNOTATION_TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface InstanceOfPattern {
+@Retention(AnnotationRetention.BINARY)
+@Target(AnnotationTarget.ANNOTATION_CLASS)
+annotation class InstanceOfPattern(
/**
* True if the pattern should include the directly matched classes.
*
- * <p>If false, the pattern is exclusive and only matches classes that are strict subclasses of
- * the pattern.
+ * <p>
+ * If false, the pattern is exclusive and only matches classes that are strict subclasses of the
+ * pattern.
*/
- boolean inclusive() default true;
+ val inclusive: Boolean = true,
/** Instances of classes matching the class-name pattern. */
- ClassNamePattern classNamePattern() default @ClassNamePattern(unqualifiedName = "");
-}
+ val classNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+)
diff --git a/src/keepanno/java/androidx/annotation/keep/KeepBinding.java b/src/keepanno/java/androidx/annotation/keep/KeepBinding.java
deleted file mode 100644
index a15e97e..0000000
--- a/src/keepanno/java/androidx/annotation/keep/KeepBinding.java
+++ /dev/null
@@ -1,722 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// ***********************************************************************************
-// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
-// ***********************************************************************************
-
-// ***********************************************************************************
-// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
-// ***********************************************************************************
-
-package androidx.annotation.keep;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * A binding of a keep item.
- *
- * <p>Bindings allow referencing the exact instance of a match from a condition in other conditions
- * and/or targets. It can also be used to reduce duplication of targets by sharing patterns.
- *
- * <p>An item can be:
- *
- * <ul>
- * <li>a pattern on classes;
- * <li>a pattern on methods; or
- * <li>a pattern on fields.
- * </ul>
- */
-@Target(ElementType.ANNOTATION_TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface KeepBinding {
-
- /**
- * Name with which other bindings, conditions or targets can reference the bound item pattern.
- *
- * @return Name of the binding.
- */
- String bindingName();
-
- /**
- * Specify the kind of this item pattern.
- *
- * <p>Possible values are:
- *
- * <ul>
- * <li>{@link KeepItemKind#ONLY_CLASS}
- * <li>{@link KeepItemKind#ONLY_MEMBERS}
- * <li>{@link KeepItemKind#ONLY_METHODS}
- * <li>{@link KeepItemKind#ONLY_FIELDS}
- * <li>{@link KeepItemKind#CLASS_AND_MEMBERS}
- * <li>{@link KeepItemKind#CLASS_AND_METHODS}
- * <li>{@link KeepItemKind#CLASS_AND_FIELDS}
- * </ul>
- *
- * <p>If unspecified the default kind for an item depends on its member patterns:
- *
- * <ul>
- * <li>{@link KeepItemKind#ONLY_CLASS} if no member patterns are defined
- * <li>{@link KeepItemKind#ONLY_METHODS} if method patterns are defined
- * <li>{@link KeepItemKind#ONLY_FIELDS} if field patterns are defined
- * <li>{@link KeepItemKind#ONLY_MEMBERS} otherwise.
- * </ul>
- *
- * @return The kind for this pattern.
- */
- KeepItemKind kind() default KeepItemKind.DEFAULT;
-
- /**
- * Define the class pattern by reference to a binding.
- *
- * <p>Mutually exclusive with the following other properties defining class:
- *
- * <ul>
- * <li>className
- * <li>classConstant
- * <li>classNamePattern
- * <li>instanceOfClassName
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstant
- * <li>instanceOfClassConstantExclusive
- * <li>instanceOfPattern
- * <li>classAnnotatedByClassName
- * <li>classAnnotatedByClassConstant
- * <li>classAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>If none are specified the default is to match any class.
- *
- * @return The name of the binding that defines the class.
- */
- String classFromBinding() default "";
-
- /**
- * Define the class-name pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining class-name:
- *
- * <ul>
- * <li>classConstant
- * <li>classNamePattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class name.
- *
- * @return The qualified class name that defines the class.
- */
- String className() default "";
-
- /**
- * Define the class-name pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining class-name:
- *
- * <ul>
- * <li>className
- * <li>classNamePattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class name.
- *
- * @return The class-constant that defines the class.
- */
- Class<?> classConstant() default Object.class;
-
- /**
- * Define the class-name pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining class-name:
- *
- * <ul>
- * <li>className
- * <li>classConstant
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class name.
- *
- * @return The class-name pattern that defines the class.
- */
- ClassNamePattern classNamePattern() default @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the instance-of pattern as classes that are instances of the fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstant
- * <li>instanceOfClassConstantExclusive
- * <li>instanceOfPattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The qualified class name that defines what instance-of the class must be.
- */
- String instanceOfClassName() default "";
-
- /**
- * Define the instance-of pattern as classes that are instances of the fully qualified class name.
- *
- * <p>The pattern is exclusive in that it does not match classes that are instances of the
- * pattern, but only those that are instances of classes that are subclasses of the pattern.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassName
- * <li>instanceOfClassConstant
- * <li>instanceOfClassConstantExclusive
- * <li>instanceOfPattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The qualified class name that defines what instance-of the class must be.
- */
- String instanceOfClassNameExclusive() default "";
-
- /**
- * Define the instance-of pattern as classes that are instances the referenced Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassName
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstantExclusive
- * <li>instanceOfPattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The class constant that defines what instance-of the class must be.
- */
- Class<?> instanceOfClassConstant() default Object.class;
-
- /**
- * Define the instance-of pattern as classes that are instances the referenced Class constant.
- *
- * <p>The pattern is exclusive in that it does not match classes that are instances of the
- * pattern, but only those that are instances of classes that are subclasses of the pattern.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassName
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstant
- * <li>instanceOfPattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The class constant that defines what instance-of the class must be.
- */
- Class<?> instanceOfClassConstantExclusive() default Object.class;
-
- /**
- * Define the instance-of with a pattern.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassName
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstant
- * <li>instanceOfClassConstantExclusive
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The pattern that defines what instance-of the class must be.
- */
- InstanceOfPattern instanceOfPattern() default @InstanceOfPattern();
-
- /**
- * Define the class-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining class-annotated-by:
- *
- * <ul>
- * <li>classAnnotatedByClassConstant
- * <li>classAnnotatedByClassNamePattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class regardless of what the class is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String classAnnotatedByClassName() default "";
-
- /**
- * Define the class-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining class-annotated-by:
- *
- * <ul>
- * <li>classAnnotatedByClassName
- * <li>classAnnotatedByClassNamePattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class regardless of what the class is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> classAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the class-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining class-annotated-by:
- *
- * <ul>
- * <li>classAnnotatedByClassName
- * <li>classAnnotatedByClassConstant
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class regardless of what the class is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern classAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the member-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassConstant
- * <li>memberAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String memberAnnotatedByClassName() default "";
-
- /**
- * Define the member-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassName
- * <li>memberAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> memberAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the member-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassName
- * <li>memberAnnotatedByClassConstant
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern memberAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the member-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * @return The member access-flag constraints that must be met.
- */
- MemberAccessFlags[] memberAccess() default {};
-
- /**
- * Define the method-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassConstant
- * <li>methodAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String methodAnnotatedByClassName() default "";
-
- /**
- * Define the method-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassName
- * <li>methodAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> methodAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the method-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassName
- * <li>methodAnnotatedByClassConstant
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern methodAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the method-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * method-access flags.
- *
- * @return The method access-flag constraints that must be met.
- */
- MethodAccessFlags[] methodAccess() default {};
-
- /**
- * Define the method-name pattern by an exact method name.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any method
- * name.
- *
- * <p>Mutually exclusive with the property `methodNamePattern` also defining method-name.
- *
- * @return The exact method name of the method.
- */
- String methodName() default "";
-
- /**
- * Define the method-name pattern by a string pattern.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any method
- * name.
- *
- * <p>Mutually exclusive with the property `methodName` also defining method-name.
- *
- * @return The string pattern of the method name.
- */
- StringPattern methodNamePattern() default @StringPattern(exact = "");
-
- /**
- * Define the method return-type pattern by a fully qualified type or 'void'.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnTypeConstant
- * <li>methodReturnTypePattern
- * </ul>
- *
- * @return The qualified type name of the method return type.
- */
- String methodReturnType() default "";
-
- /**
- * Define the method return-type pattern by a class constant.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnType
- * <li>methodReturnTypePattern
- * </ul>
- *
- * @return A class constant denoting the type of the method return type.
- */
- Class<?> methodReturnTypeConstant() default Object.class;
-
- /**
- * Define the method return-type pattern by a type pattern.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnType
- * <li>methodReturnTypeConstant
- * </ul>
- *
- * @return The pattern of the method return type.
- */
- TypePattern methodReturnTypePattern() default @TypePattern(name = "");
-
- /**
- * Define the method parameters pattern by a list of fully qualified types.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * parameters.
- *
- * <p>Mutually exclusive with the property `methodParameterTypePatterns` also defining parameters.
- *
- * @return The list of qualified type names of the method parameters.
- */
- String[] methodParameters() default {""};
-
- /**
- * Define the method parameters pattern by a list of patterns on types.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * parameters.
- *
- * <p>Mutually exclusive with the property `methodParameters` also defining parameters.
- *
- * @return The list of type patterns for the method parameters.
- */
- TypePattern[] methodParameterTypePatterns() default {@TypePattern(name = "")};
-
- /**
- * Define the field-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassConstant
- * <li>fieldAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String fieldAnnotatedByClassName() default "";
-
- /**
- * Define the field-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassName
- * <li>fieldAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> fieldAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the field-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassName
- * <li>fieldAnnotatedByClassConstant
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern fieldAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the field-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any
- * field-access flags.
- *
- * @return The field access-flag constraints that must be met.
- */
- FieldAccessFlags[] fieldAccess() default {};
-
- /**
- * Define the field-name pattern by an exact field name.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any field
- * name.
- *
- * <p>Mutually exclusive with the property `fieldNamePattern` also defining field-name.
- *
- * @return The exact field name of the field.
- */
- String fieldName() default "";
-
- /**
- * Define the field-name pattern by a string pattern.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any field
- * name.
- *
- * <p>Mutually exclusive with the property `fieldName` also defining field-name.
- *
- * @return The string pattern of the field name.
- */
- StringPattern fieldNamePattern() default @StringPattern(exact = "");
-
- /**
- * Define the field-type pattern by a fully qualified type.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldTypeConstant
- * <li>fieldTypePattern
- * </ul>
- *
- * @return The qualified type name for the field type.
- */
- String fieldType() default "";
-
- /**
- * Define the field-type pattern by a class constant.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldType
- * <li>fieldTypePattern
- * </ul>
- *
- * @return The class constant for the field type.
- */
- Class<?> fieldTypeConstant() default Object.class;
-
- /**
- * Define the field-type pattern by a pattern on types.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldType
- * <li>fieldTypeConstant
- * </ul>
- *
- * @return The type pattern for the field type.
- */
- TypePattern fieldTypePattern() default @TypePattern(name = "");
-}
diff --git a/src/keepanno/java/androidx/annotation/keep/KeepBinding.kt b/src/keepanno/java/androidx/annotation/keep/KeepBinding.kt
new file mode 100644
index 0000000..b54b909
--- /dev/null
+++ b/src/keepanno/java/androidx/annotation/keep/KeepBinding.kt
@@ -0,0 +1,781 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// ***********************************************************************************
+// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
+// ***********************************************************************************
+
+// ***********************************************************************************
+// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
+// ***********************************************************************************
+
+package androidx.annotation.keep
+
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
+import kotlin.reflect.KClass
+
+/**
+ * A binding of a keep item.
+ *
+ * <p>
+ * Bindings allow referencing the exact instance of a match from a condition in other conditions
+ * and/or targets. It can also be used to reduce duplication of targets by sharing patterns.
+ *
+ * <p>
+ * An item can be:
+ * <ul>
+ * <li>a pattern on classes;
+ * <li>a pattern on methods; or
+ * <li>a pattern on fields.
+ * </ul>
+ */
+@Retention(AnnotationRetention.BINARY)
+@Target(AnnotationTarget.ANNOTATION_CLASS)
+annotation class KeepBinding(
+
+ /**
+ * Name with which other bindings, conditions or targets can reference the bound item pattern.
+ *
+ * @return Name of the binding.
+ */
+ val bindingName: String,
+
+ /**
+ * Specify the kind of this item pattern.
+ *
+ * <p>
+ * Possible values are:
+ * <ul>
+ * <li>{@link KeepItemKind#ONLY_CLASS}
+ * <li>{@link KeepItemKind#ONLY_MEMBERS}
+ * <li>{@link KeepItemKind#ONLY_METHODS}
+ * <li>{@link KeepItemKind#ONLY_FIELDS}
+ * <li>{@link KeepItemKind#CLASS_AND_MEMBERS}
+ * <li>{@link KeepItemKind#CLASS_AND_METHODS}
+ * <li>{@link KeepItemKind#CLASS_AND_FIELDS}
+ * </ul>
+ *
+ * <p>
+ * If unspecified the default kind for an item depends on its member patterns:
+ * <ul>
+ * <li>{@link KeepItemKind#ONLY_CLASS} if no member patterns are defined
+ * <li>{@link KeepItemKind#ONLY_METHODS} if method patterns are defined
+ * <li>{@link KeepItemKind#ONLY_FIELDS} if field patterns are defined
+ * <li>{@link KeepItemKind#ONLY_MEMBERS} otherwise.
+ * </ul>
+ *
+ * @return The kind for this pattern.
+ */
+ val kind: KeepItemKind = KeepItemKind.DEFAULT,
+
+ /**
+ * Define the class pattern by reference to a binding.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class:
+ * <ul>
+ * <li>className
+ * <li>classConstant
+ * <li>classNamePattern
+ * <li>instanceOfClassName
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstant
+ * <li>instanceOfClassConstantExclusive
+ * <li>instanceOfPattern
+ * <li>classAnnotatedByClassName
+ * <li>classAnnotatedByClassConstant
+ * <li>classAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class.
+ *
+ * @return The name of the binding that defines the class.
+ */
+ val classFromBinding: String = "",
+
+ /**
+ * Define the class-name pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-name:
+ * <ul>
+ * <li>classConstant
+ * <li>classNamePattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class name.
+ *
+ * @return The qualified class name that defines the class.
+ */
+ val className: String = "",
+
+ /**
+ * Define the class-name pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-name:
+ * <ul>
+ * <li>className
+ * <li>classNamePattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class name.
+ *
+ * @return The class-constant that defines the class.
+ */
+ val classConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the class-name pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-name:
+ * <ul>
+ * <li>className
+ * <li>classConstant
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class name.
+ *
+ * @return The class-name pattern that defines the class.
+ */
+ val classNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the instance-of pattern as classes that are instances of the fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstant
+ * <li>instanceOfClassConstantExclusive
+ * <li>instanceOfPattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The qualified class name that defines what instance-of the class must be.
+ */
+ val instanceOfClassName: String = "",
+
+ /**
+ * Define the instance-of pattern as classes that are instances of the fully qualified class name.
+ *
+ * <p>
+ * The pattern is exclusive in that it does not match classes that are instances of the pattern,
+ * but only those that are instances of classes that are subclasses of the pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassName
+ * <li>instanceOfClassConstant
+ * <li>instanceOfClassConstantExclusive
+ * <li>instanceOfPattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The qualified class name that defines what instance-of the class must be.
+ */
+ val instanceOfClassNameExclusive: String = "",
+
+ /**
+ * Define the instance-of pattern as classes that are instances the referenced Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassName
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstantExclusive
+ * <li>instanceOfPattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The class constant that defines what instance-of the class must be.
+ */
+ val instanceOfClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the instance-of pattern as classes that are instances the referenced Class constant.
+ *
+ * <p>
+ * The pattern is exclusive in that it does not match classes that are instances of the pattern,
+ * but only those that are instances of classes that are subclasses of the pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassName
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstant
+ * <li>instanceOfPattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The class constant that defines what instance-of the class must be.
+ */
+ val instanceOfClassConstantExclusive: KClass<*> = Object::class,
+
+ /**
+ * Define the instance-of with a pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassName
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstant
+ * <li>instanceOfClassConstantExclusive
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The pattern that defines what instance-of the class must be.
+ */
+ val instanceOfPattern: InstanceOfPattern = InstanceOfPattern(),
+
+ /**
+ * Define the class-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-annotated-by:
+ * <ul>
+ * <li>classAnnotatedByClassConstant
+ * <li>classAnnotatedByClassNamePattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class regardless of what the class is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val classAnnotatedByClassName: String = "",
+
+ /**
+ * Define the class-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-annotated-by:
+ * <ul>
+ * <li>classAnnotatedByClassName
+ * <li>classAnnotatedByClassNamePattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class regardless of what the class is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val classAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the class-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-annotated-by:
+ * <ul>
+ * <li>classAnnotatedByClassName
+ * <li>classAnnotatedByClassConstant
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class regardless of what the class is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val classAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the member-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassConstant
+ * <li>memberAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val memberAnnotatedByClassName: String = "",
+
+ /**
+ * Define the member-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassName
+ * <li>memberAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val memberAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the member-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassName
+ * <li>memberAnnotatedByClassConstant
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val memberAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the member-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * @return The member access-flag constraints that must be met.
+ */
+ val memberAccess: Array<MemberAccessFlags> = [],
+
+ /**
+ * Define the method-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassConstant
+ * <li>methodAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val methodAnnotatedByClassName: String = "",
+
+ /**
+ * Define the method-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassName
+ * <li>methodAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val methodAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the method-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassName
+ * <li>methodAnnotatedByClassConstant
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val methodAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the method-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any
+ * method-access flags.
+ *
+ * @return The method access-flag constraints that must be met.
+ */
+ val methodAccess: Array<MethodAccessFlags> = [],
+
+ /**
+ * Define the method-name pattern by an exact method name.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any method
+ * name.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodNamePattern` also defining method-name.
+ *
+ * @return The exact method name of the method.
+ */
+ val methodName: String = "",
+
+ /**
+ * Define the method-name pattern by a string pattern.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any method
+ * name.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodName` also defining method-name.
+ *
+ * @return The string pattern of the method name.
+ */
+ val methodNamePattern: StringPattern = StringPattern(exact = ""),
+
+ /**
+ * Define the method return-type pattern by a fully qualified type or 'void'.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnTypeConstant
+ * <li>methodReturnTypePattern
+ * </ul>
+ *
+ * @return The qualified type name of the method return type.
+ */
+ val methodReturnType: String = "",
+
+ /**
+ * Define the method return-type pattern by a class constant.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnType
+ * <li>methodReturnTypePattern
+ * </ul>
+ *
+ * @return A class constant denoting the type of the method return type.
+ */
+ val methodReturnTypeConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the method return-type pattern by a type pattern.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnType
+ * <li>methodReturnTypeConstant
+ * </ul>
+ *
+ * @return The pattern of the method return type.
+ */
+ val methodReturnTypePattern: TypePattern = TypePattern(name = ""),
+
+ /**
+ * Define the method parameters pattern by a list of fully qualified types.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any parameters.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodParameterTypePatterns` also defining parameters.
+ *
+ * @return The list of qualified type names of the method parameters.
+ */
+ val methodParameters: Array<String> = [""],
+
+ /**
+ * Define the method parameters pattern by a list of patterns on types.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any parameters.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodParameters` also defining parameters.
+ *
+ * @return The list of type patterns for the method parameters.
+ */
+ val methodParameterTypePatterns: Array<TypePattern> = [TypePattern(name = "")],
+
+ /**
+ * Define the field-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassConstant
+ * <li>fieldAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val fieldAnnotatedByClassName: String = "",
+
+ /**
+ * Define the field-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassName
+ * <li>fieldAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val fieldAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the field-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassName
+ * <li>fieldAnnotatedByClassConstant
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val fieldAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the field-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field-access
+ * flags.
+ *
+ * @return The field access-flag constraints that must be met.
+ */
+ val fieldAccess: Array<FieldAccessFlags> = [],
+
+ /**
+ * Define the field-name pattern by an exact field name.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field name.
+ *
+ * <p>
+ * Mutually exclusive with the property `fieldNamePattern` also defining field-name.
+ *
+ * @return The exact field name of the field.
+ */
+ val fieldName: String = "",
+
+ /**
+ * Define the field-name pattern by a string pattern.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field name.
+ *
+ * <p>
+ * Mutually exclusive with the property `fieldName` also defining field-name.
+ *
+ * @return The string pattern of the field name.
+ */
+ val fieldNamePattern: StringPattern = StringPattern(exact = ""),
+
+ /**
+ * Define the field-type pattern by a fully qualified type.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldTypeConstant
+ * <li>fieldTypePattern
+ * </ul>
+ *
+ * @return The qualified type name for the field type.
+ */
+ val fieldType: String = "",
+
+ /**
+ * Define the field-type pattern by a class constant.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldType
+ * <li>fieldTypePattern
+ * </ul>
+ *
+ * @return The class constant for the field type.
+ */
+ val fieldTypeConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the field-type pattern by a pattern on types.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldType
+ * <li>fieldTypeConstant
+ * </ul>
+ *
+ * @return The type pattern for the field type.
+ */
+ val fieldTypePattern: TypePattern = TypePattern(name = ""),
+)
diff --git a/src/keepanno/java/androidx/annotation/keep/KeepCondition.java b/src/keepanno/java/androidx/annotation/keep/KeepCondition.java
deleted file mode 100644
index 1a0cd79..0000000
--- a/src/keepanno/java/androidx/annotation/keep/KeepCondition.java
+++ /dev/null
@@ -1,745 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// ***********************************************************************************
-// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
-// ***********************************************************************************
-
-// ***********************************************************************************
-// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
-// ***********************************************************************************
-
-package androidx.annotation.keep;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * A condition for a keep edge.
- *
- * <p>The condition denotes an item used as a precondition of a rule. An item can be:
- *
- * <ul>
- * <li>a pattern on classes;
- * <li>a pattern on methods; or
- * <li>a pattern on fields.
- * </ul>
- */
-@Target(ElementType.ANNOTATION_TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface KeepCondition {
-
- /**
- * Define the class pattern by reference to a binding.
- *
- * <p>Mutually exclusive with the following other properties defining class:
- *
- * <ul>
- * <li>className
- * <li>classConstant
- * <li>classNamePattern
- * <li>instanceOfClassName
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstant
- * <li>instanceOfClassConstantExclusive
- * <li>instanceOfPattern
- * <li>classAnnotatedByClassName
- * <li>classAnnotatedByClassConstant
- * <li>classAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>If none are specified the default is to match any class.
- *
- * @return The name of the binding that defines the class.
- */
- String classFromBinding() default "";
-
- /**
- * Define the class-name pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining class-name:
- *
- * <ul>
- * <li>classConstant
- * <li>classNamePattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class name.
- *
- * @return The qualified class name that defines the class.
- */
- String className() default "";
-
- /**
- * Define the class-name pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining class-name:
- *
- * <ul>
- * <li>className
- * <li>classNamePattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class name.
- *
- * @return The class-constant that defines the class.
- */
- Class<?> classConstant() default Object.class;
-
- /**
- * Define the class-name pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining class-name:
- *
- * <ul>
- * <li>className
- * <li>classConstant
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class name.
- *
- * @return The class-name pattern that defines the class.
- */
- ClassNamePattern classNamePattern() default @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the instance-of pattern as classes that are instances of the fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstant
- * <li>instanceOfClassConstantExclusive
- * <li>instanceOfPattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The qualified class name that defines what instance-of the class must be.
- */
- String instanceOfClassName() default "";
-
- /**
- * Define the instance-of pattern as classes that are instances of the fully qualified class name.
- *
- * <p>The pattern is exclusive in that it does not match classes that are instances of the
- * pattern, but only those that are instances of classes that are subclasses of the pattern.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassName
- * <li>instanceOfClassConstant
- * <li>instanceOfClassConstantExclusive
- * <li>instanceOfPattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The qualified class name that defines what instance-of the class must be.
- */
- String instanceOfClassNameExclusive() default "";
-
- /**
- * Define the instance-of pattern as classes that are instances the referenced Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassName
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstantExclusive
- * <li>instanceOfPattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The class constant that defines what instance-of the class must be.
- */
- Class<?> instanceOfClassConstant() default Object.class;
-
- /**
- * Define the instance-of pattern as classes that are instances the referenced Class constant.
- *
- * <p>The pattern is exclusive in that it does not match classes that are instances of the
- * pattern, but only those that are instances of classes that are subclasses of the pattern.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassName
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstant
- * <li>instanceOfPattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The class constant that defines what instance-of the class must be.
- */
- Class<?> instanceOfClassConstantExclusive() default Object.class;
-
- /**
- * Define the instance-of with a pattern.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassName
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstant
- * <li>instanceOfClassConstantExclusive
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The pattern that defines what instance-of the class must be.
- */
- InstanceOfPattern instanceOfPattern() default @InstanceOfPattern();
-
- /**
- * Define the class-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining class-annotated-by:
- *
- * <ul>
- * <li>classAnnotatedByClassConstant
- * <li>classAnnotatedByClassNamePattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class regardless of what the class is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String classAnnotatedByClassName() default "";
-
- /**
- * Define the class-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining class-annotated-by:
- *
- * <ul>
- * <li>classAnnotatedByClassName
- * <li>classAnnotatedByClassNamePattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class regardless of what the class is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> classAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the class-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining class-annotated-by:
- *
- * <ul>
- * <li>classAnnotatedByClassName
- * <li>classAnnotatedByClassConstant
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class regardless of what the class is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern classAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the member pattern in full by a reference to a binding.
- *
- * <p>Mutually exclusive with all other class and member pattern properties. When a member binding
- * is referenced this item is defined to be that item, including its class and member patterns.
- *
- * @return The binding name that defines the member.
- */
- String memberFromBinding() default "";
-
- /**
- * Define the member-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassConstant
- * <li>memberAnnotatedByClassNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String memberAnnotatedByClassName() default "";
-
- /**
- * Define the member-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassName
- * <li>memberAnnotatedByClassNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> memberAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the member-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassName
- * <li>memberAnnotatedByClassConstant
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern memberAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the member-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>Mutually exclusive with the property `memberFromBinding` also defining member-access.
- *
- * @return The member access-flag constraints that must be met.
- */
- MemberAccessFlags[] memberAccess() default {};
-
- /**
- * Define the method-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassConstant
- * <li>methodAnnotatedByClassNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String methodAnnotatedByClassName() default "";
-
- /**
- * Define the method-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassName
- * <li>methodAnnotatedByClassNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> methodAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the method-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassName
- * <li>methodAnnotatedByClassConstant
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern methodAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the method-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * method-access flags.
- *
- * <p>Mutually exclusive with the property `memberFromBinding` also defining method-access.
- *
- * @return The method access-flag constraints that must be met.
- */
- MethodAccessFlags[] methodAccess() default {};
-
- /**
- * Define the method-name pattern by an exact method name.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any method
- * name.
- *
- * <p>Mutually exclusive with the following other properties defining method-name:
- *
- * <ul>
- * <li>methodNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * @return The exact method name of the method.
- */
- String methodName() default "";
-
- /**
- * Define the method-name pattern by a string pattern.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any method
- * name.
- *
- * <p>Mutually exclusive with the following other properties defining method-name:
- *
- * <ul>
- * <li>methodName
- * <li>memberFromBinding
- * </ul>
- *
- * @return The string pattern of the method name.
- */
- StringPattern methodNamePattern() default @StringPattern(exact = "");
-
- /**
- * Define the method return-type pattern by a fully qualified type or 'void'.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnTypeConstant
- * <li>methodReturnTypePattern
- * <li>memberFromBinding
- * </ul>
- *
- * @return The qualified type name of the method return type.
- */
- String methodReturnType() default "";
-
- /**
- * Define the method return-type pattern by a class constant.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnType
- * <li>methodReturnTypePattern
- * <li>memberFromBinding
- * </ul>
- *
- * @return A class constant denoting the type of the method return type.
- */
- Class<?> methodReturnTypeConstant() default Object.class;
-
- /**
- * Define the method return-type pattern by a type pattern.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnType
- * <li>methodReturnTypeConstant
- * <li>memberFromBinding
- * </ul>
- *
- * @return The pattern of the method return type.
- */
- TypePattern methodReturnTypePattern() default @TypePattern(name = "");
-
- /**
- * Define the method parameters pattern by a list of fully qualified types.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * parameters.
- *
- * <p>Mutually exclusive with the following other properties defining parameters:
- *
- * <ul>
- * <li>methodParameterTypePatterns
- * <li>memberFromBinding
- * </ul>
- *
- * @return The list of qualified type names of the method parameters.
- */
- String[] methodParameters() default {""};
-
- /**
- * Define the method parameters pattern by a list of patterns on types.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * parameters.
- *
- * <p>Mutually exclusive with the following other properties defining parameters:
- *
- * <ul>
- * <li>methodParameters
- * <li>memberFromBinding
- * </ul>
- *
- * @return The list of type patterns for the method parameters.
- */
- TypePattern[] methodParameterTypePatterns() default {@TypePattern(name = "")};
-
- /**
- * Define the field-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassConstant
- * <li>fieldAnnotatedByClassNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String fieldAnnotatedByClassName() default "";
-
- /**
- * Define the field-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassName
- * <li>fieldAnnotatedByClassNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> fieldAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the field-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassName
- * <li>fieldAnnotatedByClassConstant
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern fieldAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the field-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any
- * field-access flags.
- *
- * <p>Mutually exclusive with the property `memberFromBinding` also defining field-access.
- *
- * @return The field access-flag constraints that must be met.
- */
- FieldAccessFlags[] fieldAccess() default {};
-
- /**
- * Define the field-name pattern by an exact field name.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any field
- * name.
- *
- * <p>Mutually exclusive with the following other properties defining field-name:
- *
- * <ul>
- * <li>fieldNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * @return The exact field name of the field.
- */
- String fieldName() default "";
-
- /**
- * Define the field-name pattern by a string pattern.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any field
- * name.
- *
- * <p>Mutually exclusive with the following other properties defining field-name:
- *
- * <ul>
- * <li>fieldName
- * <li>memberFromBinding
- * </ul>
- *
- * @return The string pattern of the field name.
- */
- StringPattern fieldNamePattern() default @StringPattern(exact = "");
-
- /**
- * Define the field-type pattern by a fully qualified type.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldTypeConstant
- * <li>fieldTypePattern
- * <li>memberFromBinding
- * </ul>
- *
- * @return The qualified type name for the field type.
- */
- String fieldType() default "";
-
- /**
- * Define the field-type pattern by a class constant.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldType
- * <li>fieldTypePattern
- * <li>memberFromBinding
- * </ul>
- *
- * @return The class constant for the field type.
- */
- Class<?> fieldTypeConstant() default Object.class;
-
- /**
- * Define the field-type pattern by a pattern on types.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldType
- * <li>fieldTypeConstant
- * <li>memberFromBinding
- * </ul>
- *
- * @return The type pattern for the field type.
- */
- TypePattern fieldTypePattern() default @TypePattern(name = "");
-}
diff --git a/src/keepanno/java/androidx/annotation/keep/KeepCondition.kt b/src/keepanno/java/androidx/annotation/keep/KeepCondition.kt
new file mode 100644
index 0000000..a4fcddc
--- /dev/null
+++ b/src/keepanno/java/androidx/annotation/keep/KeepCondition.kt
@@ -0,0 +1,801 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// ***********************************************************************************
+// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
+// ***********************************************************************************
+
+// ***********************************************************************************
+// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
+// ***********************************************************************************
+
+package androidx.annotation.keep
+
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
+import kotlin.reflect.KClass
+
+/**
+ * A condition for a keep edge.
+ *
+ * <p>
+ * The condition denotes an item used as a precondition of a rule. An item can be:
+ * <ul>
+ * <li>a pattern on classes;
+ * <li>a pattern on methods; or
+ * <li>a pattern on fields.
+ * </ul>
+ */
+@Retention(AnnotationRetention.BINARY)
+@Target(AnnotationTarget.ANNOTATION_CLASS)
+annotation class KeepCondition(
+
+ /**
+ * Define the class pattern by reference to a binding.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class:
+ * <ul>
+ * <li>className
+ * <li>classConstant
+ * <li>classNamePattern
+ * <li>instanceOfClassName
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstant
+ * <li>instanceOfClassConstantExclusive
+ * <li>instanceOfPattern
+ * <li>classAnnotatedByClassName
+ * <li>classAnnotatedByClassConstant
+ * <li>classAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class.
+ *
+ * @return The name of the binding that defines the class.
+ */
+ val classFromBinding: String = "",
+
+ /**
+ * Define the class-name pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-name:
+ * <ul>
+ * <li>classConstant
+ * <li>classNamePattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class name.
+ *
+ * @return The qualified class name that defines the class.
+ */
+ val className: String = "",
+
+ /**
+ * Define the class-name pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-name:
+ * <ul>
+ * <li>className
+ * <li>classNamePattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class name.
+ *
+ * @return The class-constant that defines the class.
+ */
+ val classConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the class-name pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-name:
+ * <ul>
+ * <li>className
+ * <li>classConstant
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class name.
+ *
+ * @return The class-name pattern that defines the class.
+ */
+ val classNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the instance-of pattern as classes that are instances of the fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstant
+ * <li>instanceOfClassConstantExclusive
+ * <li>instanceOfPattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The qualified class name that defines what instance-of the class must be.
+ */
+ val instanceOfClassName: String = "",
+
+ /**
+ * Define the instance-of pattern as classes that are instances of the fully qualified class name.
+ *
+ * <p>
+ * The pattern is exclusive in that it does not match classes that are instances of the pattern,
+ * but only those that are instances of classes that are subclasses of the pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassName
+ * <li>instanceOfClassConstant
+ * <li>instanceOfClassConstantExclusive
+ * <li>instanceOfPattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The qualified class name that defines what instance-of the class must be.
+ */
+ val instanceOfClassNameExclusive: String = "",
+
+ /**
+ * Define the instance-of pattern as classes that are instances the referenced Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassName
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstantExclusive
+ * <li>instanceOfPattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The class constant that defines what instance-of the class must be.
+ */
+ val instanceOfClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the instance-of pattern as classes that are instances the referenced Class constant.
+ *
+ * <p>
+ * The pattern is exclusive in that it does not match classes that are instances of the pattern,
+ * but only those that are instances of classes that are subclasses of the pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassName
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstant
+ * <li>instanceOfPattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The class constant that defines what instance-of the class must be.
+ */
+ val instanceOfClassConstantExclusive: KClass<*> = Object::class,
+
+ /**
+ * Define the instance-of with a pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassName
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstant
+ * <li>instanceOfClassConstantExclusive
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The pattern that defines what instance-of the class must be.
+ */
+ val instanceOfPattern: InstanceOfPattern = InstanceOfPattern(),
+
+ /**
+ * Define the class-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-annotated-by:
+ * <ul>
+ * <li>classAnnotatedByClassConstant
+ * <li>classAnnotatedByClassNamePattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class regardless of what the class is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val classAnnotatedByClassName: String = "",
+
+ /**
+ * Define the class-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-annotated-by:
+ * <ul>
+ * <li>classAnnotatedByClassName
+ * <li>classAnnotatedByClassNamePattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class regardless of what the class is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val classAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the class-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-annotated-by:
+ * <ul>
+ * <li>classAnnotatedByClassName
+ * <li>classAnnotatedByClassConstant
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class regardless of what the class is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val classAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the member pattern in full by a reference to a binding.
+ *
+ * <p>
+ * Mutually exclusive with all other class and member pattern properties. When a member binding is
+ * referenced this item is defined to be that item, including its class and member patterns.
+ *
+ * @return The binding name that defines the member.
+ */
+ val memberFromBinding: String = "",
+
+ /**
+ * Define the member-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassConstant
+ * <li>memberAnnotatedByClassNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val memberAnnotatedByClassName: String = "",
+
+ /**
+ * Define the member-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassName
+ * <li>memberAnnotatedByClassNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val memberAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the member-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassName
+ * <li>memberAnnotatedByClassConstant
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val memberAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the member-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * Mutually exclusive with the property `memberFromBinding` also defining member-access.
+ *
+ * @return The member access-flag constraints that must be met.
+ */
+ val memberAccess: Array<MemberAccessFlags> = [],
+
+ /**
+ * Define the method-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassConstant
+ * <li>methodAnnotatedByClassNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val methodAnnotatedByClassName: String = "",
+
+ /**
+ * Define the method-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassName
+ * <li>methodAnnotatedByClassNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val methodAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the method-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassName
+ * <li>methodAnnotatedByClassConstant
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val methodAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the method-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any
+ * method-access flags.
+ *
+ * <p>
+ * Mutually exclusive with the property `memberFromBinding` also defining method-access.
+ *
+ * @return The method access-flag constraints that must be met.
+ */
+ val methodAccess: Array<MethodAccessFlags> = [],
+
+ /**
+ * Define the method-name pattern by an exact method name.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any method
+ * name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-name:
+ * <ul>
+ * <li>methodNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The exact method name of the method.
+ */
+ val methodName: String = "",
+
+ /**
+ * Define the method-name pattern by a string pattern.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any method
+ * name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-name:
+ * <ul>
+ * <li>methodName
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The string pattern of the method name.
+ */
+ val methodNamePattern: StringPattern = StringPattern(exact = ""),
+
+ /**
+ * Define the method return-type pattern by a fully qualified type or 'void'.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnTypeConstant
+ * <li>methodReturnTypePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The qualified type name of the method return type.
+ */
+ val methodReturnType: String = "",
+
+ /**
+ * Define the method return-type pattern by a class constant.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnType
+ * <li>methodReturnTypePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return A class constant denoting the type of the method return type.
+ */
+ val methodReturnTypeConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the method return-type pattern by a type pattern.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnType
+ * <li>methodReturnTypeConstant
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The pattern of the method return type.
+ */
+ val methodReturnTypePattern: TypePattern = TypePattern(name = ""),
+
+ /**
+ * Define the method parameters pattern by a list of fully qualified types.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any parameters.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining parameters:
+ * <ul>
+ * <li>methodParameterTypePatterns
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The list of qualified type names of the method parameters.
+ */
+ val methodParameters: Array<String> = [""],
+
+ /**
+ * Define the method parameters pattern by a list of patterns on types.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any parameters.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining parameters:
+ * <ul>
+ * <li>methodParameters
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The list of type patterns for the method parameters.
+ */
+ val methodParameterTypePatterns: Array<TypePattern> = [TypePattern(name = "")],
+
+ /**
+ * Define the field-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassConstant
+ * <li>fieldAnnotatedByClassNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val fieldAnnotatedByClassName: String = "",
+
+ /**
+ * Define the field-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassName
+ * <li>fieldAnnotatedByClassNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val fieldAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the field-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassName
+ * <li>fieldAnnotatedByClassConstant
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val fieldAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the field-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field-access
+ * flags.
+ *
+ * <p>
+ * Mutually exclusive with the property `memberFromBinding` also defining field-access.
+ *
+ * @return The field access-flag constraints that must be met.
+ */
+ val fieldAccess: Array<FieldAccessFlags> = [],
+
+ /**
+ * Define the field-name pattern by an exact field name.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-name:
+ * <ul>
+ * <li>fieldNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The exact field name of the field.
+ */
+ val fieldName: String = "",
+
+ /**
+ * Define the field-name pattern by a string pattern.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-name:
+ * <ul>
+ * <li>fieldName
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The string pattern of the field name.
+ */
+ val fieldNamePattern: StringPattern = StringPattern(exact = ""),
+
+ /**
+ * Define the field-type pattern by a fully qualified type.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldTypeConstant
+ * <li>fieldTypePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The qualified type name for the field type.
+ */
+ val fieldType: String = "",
+
+ /**
+ * Define the field-type pattern by a class constant.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldType
+ * <li>fieldTypePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The class constant for the field type.
+ */
+ val fieldTypeConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the field-type pattern by a pattern on types.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldType
+ * <li>fieldTypeConstant
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The type pattern for the field type.
+ */
+ val fieldTypePattern: TypePattern = TypePattern(name = ""),
+)
diff --git a/src/keepanno/java/androidx/annotation/keep/KeepConstraint.java b/src/keepanno/java/androidx/annotation/keep/KeepConstraint.kt
similarity index 98%
rename from src/keepanno/java/androidx/annotation/keep/KeepConstraint.java
rename to src/keepanno/java/androidx/annotation/keep/KeepConstraint.kt
index 19f48dc..6eaebcc 100644
--- a/src/keepanno/java/androidx/annotation/keep/KeepConstraint.java
+++ b/src/keepanno/java/androidx/annotation/keep/KeepConstraint.kt
@@ -18,8 +18,7 @@
// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
// ***********************************************************************************
-
-package androidx.annotation.keep;
+package androidx.annotation.keep
/**
* Usage constraints for how a target is used and what must be kept.
@@ -31,7 +30,7 @@
* it is safe to remove the annotations. However, it would not be safe to remove parameters from the
* method.
*/
-public enum KeepConstraint {
+enum class KeepConstraint {
/**
* Indicates that the target item is being looked up reflectively.
*
diff --git a/src/keepanno/java/androidx/annotation/keep/KeepEdge.java b/src/keepanno/java/androidx/annotation/keep/KeepEdge.kt
similarity index 62%
rename from src/keepanno/java/androidx/annotation/keep/KeepEdge.java
rename to src/keepanno/java/androidx/annotation/keep/KeepEdge.kt
index b4e3830..6e683e5 100644
--- a/src/keepanno/java/androidx/annotation/keep/KeepEdge.java
+++ b/src/keepanno/java/androidx/annotation/keep/KeepEdge.kt
@@ -18,21 +18,23 @@
// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
// ***********************************************************************************
-package androidx.annotation.keep;
+package androidx.annotation.keep
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
-@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})
-@Retention(RetentionPolicy.CLASS)
-public @interface KeepEdge {
- String description() default "";
+@Retention(AnnotationRetention.BINARY)
+@Target(
+ AnnotationTarget.TYPE,
+ AnnotationTarget.FIELD,
+ AnnotationTarget.FUNCTION,
+ AnnotationTarget.CONSTRUCTOR,
+)
+annotation class KeepEdge(
+ val description: String = "",
- KeepBinding[] bindings() default {};
-
- KeepCondition[] preconditions() default {};
-
- KeepTarget[] consequences();
-}
+ // val retention : Array<RetentionPolicy> = [RetentionPolicy.RUNTIME]
+ val bindings: Array<KeepBinding> = [],
+ val preconditions: Array<KeepCondition> = [],
+ val consequences: Array<KeepTarget> = [],
+)
diff --git a/src/keepanno/java/androidx/annotation/keep/KeepForApi.java b/src/keepanno/java/androidx/annotation/keep/KeepForApi.java
deleted file mode 100644
index 7ad9e61..0000000
--- a/src/keepanno/java/androidx/annotation/keep/KeepForApi.java
+++ /dev/null
@@ -1,481 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// ***********************************************************************************
-// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
-// ***********************************************************************************
-
-// ***********************************************************************************
-// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
-// ***********************************************************************************
-
-package androidx.annotation.keep;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation to mark a class, field or method as part of a library API surface.
- *
- * <p>When a class is annotated, member patterns can be used to define which members are to be kept.
- * When no member patterns are specified the default pattern matches all public and protected
- * members.
- *
- * <p>When a member is annotated, the member patterns cannot be used as the annotated member itself
- * fully defines the item to be kept (i.e., itself).
- */
-@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})
-@Retention(RetentionPolicy.CLASS)
-public @interface KeepForApi {
-
- /**
- * Optional description to document the reason for this annotation.
- *
- * @return The descriptive message. Defaults to no description.
- */
- String description() default "";
-
- /**
- * Additional targets to be kept as part of the API surface.
- *
- * @return List of additional target consequences. Defaults to no additional target consequences.
- */
- KeepTarget[] additionalTargets() default {};
-
- /**
- * Specify the kind of this item pattern.
- *
- * <p>Default kind is {@link KeepItemKind#CLASS_AND_MEMBERS}, meaning the annotated class and/or
- * member is to be kept. When annotating a class this can be set to {@link
- * KeepItemKind#ONLY_CLASS} to avoid patterns on any members. That can be useful when the API
- * members are themselves explicitly annotated.
- *
- * <p>It is not possible to use {@link KeepItemKind#ONLY_CLASS} if annotating a member. Also, it
- * is never valid to use kind {@link KeepItemKind#ONLY_MEMBERS} as the API surface must keep the
- * class if any member is to be accessible.
- *
- * @return The kind for this pattern.
- */
- KeepItemKind kind() default KeepItemKind.DEFAULT;
-
- /**
- * Define the member-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassConstant
- * <li>memberAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String memberAnnotatedByClassName() default "";
-
- /**
- * Define the member-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassName
- * <li>memberAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> memberAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the member-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassName
- * <li>memberAnnotatedByClassConstant
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern memberAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the member-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * @return The member access-flag constraints that must be met.
- */
- MemberAccessFlags[] memberAccess() default {};
-
- /**
- * Define the method-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassConstant
- * <li>methodAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String methodAnnotatedByClassName() default "";
-
- /**
- * Define the method-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassName
- * <li>methodAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> methodAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the method-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassName
- * <li>methodAnnotatedByClassConstant
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern methodAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the method-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * method-access flags.
- *
- * @return The method access-flag constraints that must be met.
- */
- MethodAccessFlags[] methodAccess() default {};
-
- /**
- * Define the method-name pattern by an exact method name.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any method
- * name.
- *
- * <p>Mutually exclusive with the property `methodNamePattern` also defining method-name.
- *
- * @return The exact method name of the method.
- */
- String methodName() default "";
-
- /**
- * Define the method-name pattern by a string pattern.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any method
- * name.
- *
- * <p>Mutually exclusive with the property `methodName` also defining method-name.
- *
- * @return The string pattern of the method name.
- */
- StringPattern methodNamePattern() default @StringPattern(exact = "");
-
- /**
- * Define the method return-type pattern by a fully qualified type or 'void'.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnTypeConstant
- * <li>methodReturnTypePattern
- * </ul>
- *
- * @return The qualified type name of the method return type.
- */
- String methodReturnType() default "";
-
- /**
- * Define the method return-type pattern by a class constant.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnType
- * <li>methodReturnTypePattern
- * </ul>
- *
- * @return A class constant denoting the type of the method return type.
- */
- Class<?> methodReturnTypeConstant() default Object.class;
-
- /**
- * Define the method return-type pattern by a type pattern.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnType
- * <li>methodReturnTypeConstant
- * </ul>
- *
- * @return The pattern of the method return type.
- */
- TypePattern methodReturnTypePattern() default @TypePattern(name = "");
-
- /**
- * Define the method parameters pattern by a list of fully qualified types.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * parameters.
- *
- * <p>Mutually exclusive with the property `methodParameterTypePatterns` also defining parameters.
- *
- * @return The list of qualified type names of the method parameters.
- */
- String[] methodParameters() default {""};
-
- /**
- * Define the method parameters pattern by a list of patterns on types.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * parameters.
- *
- * <p>Mutually exclusive with the property `methodParameters` also defining parameters.
- *
- * @return The list of type patterns for the method parameters.
- */
- TypePattern[] methodParameterTypePatterns() default {@TypePattern(name = "")};
-
- /**
- * Define the field-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassConstant
- * <li>fieldAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String fieldAnnotatedByClassName() default "";
-
- /**
- * Define the field-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassName
- * <li>fieldAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> fieldAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the field-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassName
- * <li>fieldAnnotatedByClassConstant
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern fieldAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the field-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any
- * field-access flags.
- *
- * @return The field access-flag constraints that must be met.
- */
- FieldAccessFlags[] fieldAccess() default {};
-
- /**
- * Define the field-name pattern by an exact field name.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any field
- * name.
- *
- * <p>Mutually exclusive with the property `fieldNamePattern` also defining field-name.
- *
- * @return The exact field name of the field.
- */
- String fieldName() default "";
-
- /**
- * Define the field-name pattern by a string pattern.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any field
- * name.
- *
- * <p>Mutually exclusive with the property `fieldName` also defining field-name.
- *
- * @return The string pattern of the field name.
- */
- StringPattern fieldNamePattern() default @StringPattern(exact = "");
-
- /**
- * Define the field-type pattern by a fully qualified type.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldTypeConstant
- * <li>fieldTypePattern
- * </ul>
- *
- * @return The qualified type name for the field type.
- */
- String fieldType() default "";
-
- /**
- * Define the field-type pattern by a class constant.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldType
- * <li>fieldTypePattern
- * </ul>
- *
- * @return The class constant for the field type.
- */
- Class<?> fieldTypeConstant() default Object.class;
-
- /**
- * Define the field-type pattern by a pattern on types.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldType
- * <li>fieldTypeConstant
- * </ul>
- *
- * @return The type pattern for the field type.
- */
- TypePattern fieldTypePattern() default @TypePattern(name = "");
-}
diff --git a/src/keepanno/java/androidx/annotation/keep/KeepForApi.kt b/src/keepanno/java/androidx/annotation/keep/KeepForApi.kt
new file mode 100644
index 0000000..5fa5bf6
--- /dev/null
+++ b/src/keepanno/java/androidx/annotation/keep/KeepForApi.kt
@@ -0,0 +1,535 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// ***********************************************************************************
+// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
+// ***********************************************************************************
+
+// ***********************************************************************************
+// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
+// ***********************************************************************************
+
+package androidx.annotation.keep
+
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
+import kotlin.reflect.KClass
+
+/**
+ * Annotation to mark a class, field or method as part of a library API surface.
+ *
+ * <p>
+ * When a class is annotated, member patterns can be used to define which members are to be kept.
+ * When no member patterns are specified the default pattern matches all public and protected
+ * members.
+ *
+ * <p>
+ * When a member is annotated, the member patterns cannot be used as the annotated member itself
+ * fully defines the item to be kept (i.e., itself).
+ */
+@Retention(AnnotationRetention.BINARY)
+@Target(
+ AnnotationTarget.CLASS,
+ AnnotationTarget.FIELD,
+ AnnotationTarget.FUNCTION,
+ AnnotationTarget.CONSTRUCTOR,
+)
+annotation class KeepForApi(
+
+ /**
+ * Optional description to document the reason for this annotation.
+ *
+ * @return The descriptive message. Defaults to no description.
+ */
+ val description: String = "",
+
+ /**
+ * Additional targets to be kept as part of the API surface.
+ *
+ * @return List of additional target consequences. Defaults to no additional target consequences.
+ */
+ val additionalTargets: Array<KeepTarget> = [],
+
+ /**
+ * Specify the kind of this item pattern.
+ *
+ * <p>
+ * Default kind is {@link KeepItemKind#CLASS_AND_MEMBERS}, meaning the annotated class and/or
+ * member is to be kept. When annotating a class this can be set to {@link
+ * KeepItemKind#ONLY_CLASS} to avoid patterns on any members. That can be useful when the API
+ * members are themselves explicitly annotated.
+ *
+ * <p>
+ * It is not possible to use {@link KeepItemKind#ONLY_CLASS} if annotating a member. Also, it is
+ * never valid to use kind {@link KeepItemKind#ONLY_MEMBERS} as the API surface must keep the
+ * class if any member is to be accessible.
+ *
+ * @return The kind for this pattern.
+ */
+ val kind: KeepItemKind = KeepItemKind.DEFAULT,
+
+ /**
+ * Define the member-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassConstant
+ * <li>memberAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val memberAnnotatedByClassName: String = "",
+
+ /**
+ * Define the member-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassName
+ * <li>memberAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val memberAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the member-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassName
+ * <li>memberAnnotatedByClassConstant
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val memberAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the member-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * @return The member access-flag constraints that must be met.
+ */
+ val memberAccess: Array<MemberAccessFlags> = [],
+
+ /**
+ * Define the method-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassConstant
+ * <li>methodAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val methodAnnotatedByClassName: String = "",
+
+ /**
+ * Define the method-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassName
+ * <li>methodAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val methodAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the method-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassName
+ * <li>methodAnnotatedByClassConstant
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val methodAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the method-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any
+ * method-access flags.
+ *
+ * @return The method access-flag constraints that must be met.
+ */
+ val methodAccess: Array<MethodAccessFlags> = [],
+
+ /**
+ * Define the method-name pattern by an exact method name.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any method
+ * name.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodNamePattern` also defining method-name.
+ *
+ * @return The exact method name of the method.
+ */
+ val methodName: String = "",
+
+ /**
+ * Define the method-name pattern by a string pattern.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any method
+ * name.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodName` also defining method-name.
+ *
+ * @return The string pattern of the method name.
+ */
+ val methodNamePattern: StringPattern = StringPattern(exact = ""),
+
+ /**
+ * Define the method return-type pattern by a fully qualified type or 'void'.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnTypeConstant
+ * <li>methodReturnTypePattern
+ * </ul>
+ *
+ * @return The qualified type name of the method return type.
+ */
+ val methodReturnType: String = "",
+
+ /**
+ * Define the method return-type pattern by a class constant.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnType
+ * <li>methodReturnTypePattern
+ * </ul>
+ *
+ * @return A class constant denoting the type of the method return type.
+ */
+ val methodReturnTypeConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the method return-type pattern by a type pattern.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnType
+ * <li>methodReturnTypeConstant
+ * </ul>
+ *
+ * @return The pattern of the method return type.
+ */
+ val methodReturnTypePattern: TypePattern = TypePattern(name = ""),
+
+ /**
+ * Define the method parameters pattern by a list of fully qualified types.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any parameters.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodParameterTypePatterns` also defining parameters.
+ *
+ * @return The list of qualified type names of the method parameters.
+ */
+ val methodParameters: Array<String> = [""],
+
+ /**
+ * Define the method parameters pattern by a list of patterns on types.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any parameters.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodParameters` also defining parameters.
+ *
+ * @return The list of type patterns for the method parameters.
+ */
+ val methodParameterTypePatterns: Array<TypePattern> = [TypePattern(name = "")],
+
+ /**
+ * Define the field-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassConstant
+ * <li>fieldAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val fieldAnnotatedByClassName: String = "",
+
+ /**
+ * Define the field-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassName
+ * <li>fieldAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val fieldAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the field-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassName
+ * <li>fieldAnnotatedByClassConstant
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val fieldAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the field-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field-access
+ * flags.
+ *
+ * @return The field access-flag constraints that must be met.
+ */
+ val fieldAccess: Array<FieldAccessFlags> = [],
+
+ /**
+ * Define the field-name pattern by an exact field name.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field name.
+ *
+ * <p>
+ * Mutually exclusive with the property `fieldNamePattern` also defining field-name.
+ *
+ * @return The exact field name of the field.
+ */
+ val fieldName: String = "",
+
+ /**
+ * Define the field-name pattern by a string pattern.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field name.
+ *
+ * <p>
+ * Mutually exclusive with the property `fieldName` also defining field-name.
+ *
+ * @return The string pattern of the field name.
+ */
+ val fieldNamePattern: StringPattern = StringPattern(exact = ""),
+
+ /**
+ * Define the field-type pattern by a fully qualified type.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldTypeConstant
+ * <li>fieldTypePattern
+ * </ul>
+ *
+ * @return The qualified type name for the field type.
+ */
+ val fieldType: String = "",
+
+ /**
+ * Define the field-type pattern by a class constant.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldType
+ * <li>fieldTypePattern
+ * </ul>
+ *
+ * @return The class constant for the field type.
+ */
+ val fieldTypeConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the field-type pattern by a pattern on types.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldType
+ * <li>fieldTypeConstant
+ * </ul>
+ *
+ * @return The type pattern for the field type.
+ */
+ val fieldTypePattern: TypePattern = TypePattern(name = ""),
+)
diff --git a/src/keepanno/java/androidx/annotation/keep/KeepItemKind.java b/src/keepanno/java/androidx/annotation/keep/KeepItemKind.kt
similarity index 92%
rename from src/keepanno/java/androidx/annotation/keep/KeepItemKind.java
rename to src/keepanno/java/androidx/annotation/keep/KeepItemKind.kt
index 5ffc9d7..90afbff 100644
--- a/src/keepanno/java/androidx/annotation/keep/KeepItemKind.java
+++ b/src/keepanno/java/androidx/annotation/keep/KeepItemKind.kt
@@ -18,9 +18,9 @@
// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
// ***********************************************************************************
-package androidx.annotation.keep;
+package androidx.annotation.keep
-public enum KeepItemKind {
+enum class KeepItemKind {
ONLY_CLASS,
ONLY_MEMBERS,
ONLY_METHODS,
@@ -28,5 +28,5 @@
CLASS_AND_MEMBERS,
CLASS_AND_METHODS,
CLASS_AND_FIELDS,
- DEFAULT
+ DEFAULT,
}
diff --git a/src/keepanno/java/androidx/annotation/keep/KeepOption.java b/src/keepanno/java/androidx/annotation/keep/KeepOption.kt
similarity index 93%
rename from src/keepanno/java/androidx/annotation/keep/KeepOption.java
rename to src/keepanno/java/androidx/annotation/keep/KeepOption.kt
index b635d1c..13ef7f6 100644
--- a/src/keepanno/java/androidx/annotation/keep/KeepOption.java
+++ b/src/keepanno/java/androidx/annotation/keep/KeepOption.kt
@@ -18,9 +18,9 @@
// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
// ***********************************************************************************
-package androidx.annotation.keep;
+package androidx.annotation.keep
-public enum KeepOption {
+enum class KeepOption {
SHRINKING,
OPTIMIZATION,
OBFUSCATION,
diff --git a/src/keepanno/java/androidx/annotation/keep/KeepTarget.java b/src/keepanno/java/androidx/annotation/keep/KeepTarget.java
deleted file mode 100644
index 96196a9..0000000
--- a/src/keepanno/java/androidx/annotation/keep/KeepTarget.java
+++ /dev/null
@@ -1,842 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// ***********************************************************************************
-// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
-// ***********************************************************************************
-
-// ***********************************************************************************
-// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
-// ***********************************************************************************
-
-package androidx.annotation.keep;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * A target for a keep edge.
- *
- * <p>The target denotes an item along with options for what to keep. An item can be:
- *
- * <ul>
- * <li>a pattern on classes;
- * <li>a pattern on methods; or
- * <li>a pattern on fields.
- * </ul>
- */
-@Target(ElementType.ANNOTATION_TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface KeepTarget {
-
- /**
- * Specify the kind of this item pattern.
- *
- * <p>Possible values are:
- *
- * <ul>
- * <li>{@link KeepItemKind#ONLY_CLASS}
- * <li>{@link KeepItemKind#ONLY_MEMBERS}
- * <li>{@link KeepItemKind#ONLY_METHODS}
- * <li>{@link KeepItemKind#ONLY_FIELDS}
- * <li>{@link KeepItemKind#CLASS_AND_MEMBERS}
- * <li>{@link KeepItemKind#CLASS_AND_METHODS}
- * <li>{@link KeepItemKind#CLASS_AND_FIELDS}
- * </ul>
- *
- * <p>If unspecified the default kind for an item depends on its member patterns:
- *
- * <ul>
- * <li>{@link KeepItemKind#ONLY_CLASS} if no member patterns are defined
- * <li>{@link KeepItemKind#ONLY_METHODS} if method patterns are defined
- * <li>{@link KeepItemKind#ONLY_FIELDS} if field patterns are defined
- * <li>{@link KeepItemKind#ONLY_MEMBERS} otherwise.
- * </ul>
- *
- * @return The kind for this pattern.
- */
- KeepItemKind kind() default KeepItemKind.DEFAULT;
-
- /**
- * Define the usage constraints of the target.
- *
- * <p>The specified constraints must remain valid for the target.
- *
- * <p>The default constraints depend on the kind of the target. For all targets the default
- * constraints include:
- *
- * <ul>
- * <li>{@link KeepConstraint#LOOKUP}
- * <li>{@link KeepConstraint#NAME}
- * <li>{@link KeepConstraint#VISIBILITY_RELAX}
- * </ul>
- *
- * <p>For classes the default constraints also include:
- *
- * <ul>
- * <li>{@link KeepConstraint#CLASS_INSTANTIATE}
- * </ul>
- *
- * <p>For methods the default constraints also include:
- *
- * <ul>
- * <li>{@link KeepConstraint#METHOD_INVOKE}
- * </ul>
- *
- * <p>For fields the default constraints also include:
- *
- * <ul>
- * <li>{@link KeepConstraint#FIELD_GET}
- * <li>{@link KeepConstraint#FIELD_SET}
- * </ul>
- *
- * <p>Mutually exclusive with the property `constraintAdditions` also defining constraints.
- *
- * @return Usage constraints for the target.
- */
- KeepConstraint[] constraints() default {};
-
- /**
- * Add additional usage constraints of the target.
- *
- * <p>The specified constraints must remain valid for the target in addition to the default
- * constraints.
- *
- * <p>The default constraints are documented in {@link #constraints}
- *
- * <p>Mutually exclusive with the property `constraints` also defining constraints.
- *
- * @return Additional usage constraints for the target.
- */
- KeepConstraint[] constraintAdditions() default {};
-
- /**
- * Patterns for annotations that must remain on the item.
- *
- * <p>The annotations matching any of the patterns must remain on the item if the annotation types
- * remain in the program.
- *
- * <p>Note that if the annotation types themselves are unused/removed, then their references on
- * the item will be removed too. If the annotation types themselves are used reflectively then
- * they too need a keep annotation or rule to ensure they remain in the program.
- *
- * <p>By default no annotation patterns are defined and no annotations are required to remain.
- *
- * @return Annotation patterns
- */
- AnnotationPattern[] constrainAnnotations() default {};
-
- /**
- * Define the class pattern by reference to a binding.
- *
- * <p>Mutually exclusive with the following other properties defining class:
- *
- * <ul>
- * <li>className
- * <li>classConstant
- * <li>classNamePattern
- * <li>instanceOfClassName
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstant
- * <li>instanceOfClassConstantExclusive
- * <li>instanceOfPattern
- * <li>classAnnotatedByClassName
- * <li>classAnnotatedByClassConstant
- * <li>classAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>If none are specified the default is to match any class.
- *
- * @return The name of the binding that defines the class.
- */
- String classFromBinding() default "";
-
- /**
- * Define the class-name pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining class-name:
- *
- * <ul>
- * <li>classConstant
- * <li>classNamePattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class name.
- *
- * @return The qualified class name that defines the class.
- */
- String className() default "";
-
- /**
- * Define the class-name pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining class-name:
- *
- * <ul>
- * <li>className
- * <li>classNamePattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class name.
- *
- * @return The class-constant that defines the class.
- */
- Class<?> classConstant() default Object.class;
-
- /**
- * Define the class-name pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining class-name:
- *
- * <ul>
- * <li>className
- * <li>classConstant
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class name.
- *
- * @return The class-name pattern that defines the class.
- */
- ClassNamePattern classNamePattern() default @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the instance-of pattern as classes that are instances of the fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstant
- * <li>instanceOfClassConstantExclusive
- * <li>instanceOfPattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The qualified class name that defines what instance-of the class must be.
- */
- String instanceOfClassName() default "";
-
- /**
- * Define the instance-of pattern as classes that are instances of the fully qualified class name.
- *
- * <p>The pattern is exclusive in that it does not match classes that are instances of the
- * pattern, but only those that are instances of classes that are subclasses of the pattern.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassName
- * <li>instanceOfClassConstant
- * <li>instanceOfClassConstantExclusive
- * <li>instanceOfPattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The qualified class name that defines what instance-of the class must be.
- */
- String instanceOfClassNameExclusive() default "";
-
- /**
- * Define the instance-of pattern as classes that are instances the referenced Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassName
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstantExclusive
- * <li>instanceOfPattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The class constant that defines what instance-of the class must be.
- */
- Class<?> instanceOfClassConstant() default Object.class;
-
- /**
- * Define the instance-of pattern as classes that are instances the referenced Class constant.
- *
- * <p>The pattern is exclusive in that it does not match classes that are instances of the
- * pattern, but only those that are instances of classes that are subclasses of the pattern.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassName
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstant
- * <li>instanceOfPattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The class constant that defines what instance-of the class must be.
- */
- Class<?> instanceOfClassConstantExclusive() default Object.class;
-
- /**
- * Define the instance-of with a pattern.
- *
- * <p>Mutually exclusive with the following other properties defining instance-of:
- *
- * <ul>
- * <li>instanceOfClassName
- * <li>instanceOfClassNameExclusive
- * <li>instanceOfClassConstant
- * <li>instanceOfClassConstantExclusive
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class instance.
- *
- * @return The pattern that defines what instance-of the class must be.
- */
- InstanceOfPattern instanceOfPattern() default @InstanceOfPattern();
-
- /**
- * Define the class-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining class-annotated-by:
- *
- * <ul>
- * <li>classAnnotatedByClassConstant
- * <li>classAnnotatedByClassNamePattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class regardless of what the class is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String classAnnotatedByClassName() default "";
-
- /**
- * Define the class-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining class-annotated-by:
- *
- * <ul>
- * <li>classAnnotatedByClassName
- * <li>classAnnotatedByClassNamePattern
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class regardless of what the class is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> classAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the class-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining class-annotated-by:
- *
- * <ul>
- * <li>classAnnotatedByClassName
- * <li>classAnnotatedByClassConstant
- * <li>classFromBinding
- * </ul>
- *
- * <p>If none are specified the default is to match any class regardless of what the class is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern classAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the member pattern in full by a reference to a binding.
- *
- * <p>Mutually exclusive with all other class and member pattern properties. When a member binding
- * is referenced this item is defined to be that item, including its class and member patterns.
- *
- * @return The binding name that defines the member.
- */
- String memberFromBinding() default "";
-
- /**
- * Define the member-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassConstant
- * <li>memberAnnotatedByClassNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String memberAnnotatedByClassName() default "";
-
- /**
- * Define the member-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassName
- * <li>memberAnnotatedByClassNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> memberAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the member-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassName
- * <li>memberAnnotatedByClassConstant
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern memberAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the member-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>Mutually exclusive with the property `memberFromBinding` also defining member-access.
- *
- * @return The member access-flag constraints that must be met.
- */
- MemberAccessFlags[] memberAccess() default {};
-
- /**
- * Define the method-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassConstant
- * <li>methodAnnotatedByClassNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String methodAnnotatedByClassName() default "";
-
- /**
- * Define the method-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassName
- * <li>methodAnnotatedByClassNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> methodAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the method-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassName
- * <li>methodAnnotatedByClassConstant
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern methodAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the method-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * method-access flags.
- *
- * <p>Mutually exclusive with the property `memberFromBinding` also defining method-access.
- *
- * @return The method access-flag constraints that must be met.
- */
- MethodAccessFlags[] methodAccess() default {};
-
- /**
- * Define the method-name pattern by an exact method name.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any method
- * name.
- *
- * <p>Mutually exclusive with the following other properties defining method-name:
- *
- * <ul>
- * <li>methodNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * @return The exact method name of the method.
- */
- String methodName() default "";
-
- /**
- * Define the method-name pattern by a string pattern.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any method
- * name.
- *
- * <p>Mutually exclusive with the following other properties defining method-name:
- *
- * <ul>
- * <li>methodName
- * <li>memberFromBinding
- * </ul>
- *
- * @return The string pattern of the method name.
- */
- StringPattern methodNamePattern() default @StringPattern(exact = "");
-
- /**
- * Define the method return-type pattern by a fully qualified type or 'void'.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnTypeConstant
- * <li>methodReturnTypePattern
- * <li>memberFromBinding
- * </ul>
- *
- * @return The qualified type name of the method return type.
- */
- String methodReturnType() default "";
-
- /**
- * Define the method return-type pattern by a class constant.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnType
- * <li>methodReturnTypePattern
- * <li>memberFromBinding
- * </ul>
- *
- * @return A class constant denoting the type of the method return type.
- */
- Class<?> methodReturnTypeConstant() default Object.class;
-
- /**
- * Define the method return-type pattern by a type pattern.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnType
- * <li>methodReturnTypeConstant
- * <li>memberFromBinding
- * </ul>
- *
- * @return The pattern of the method return type.
- */
- TypePattern methodReturnTypePattern() default @TypePattern(name = "");
-
- /**
- * Define the method parameters pattern by a list of fully qualified types.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * parameters.
- *
- * <p>Mutually exclusive with the following other properties defining parameters:
- *
- * <ul>
- * <li>methodParameterTypePatterns
- * <li>memberFromBinding
- * </ul>
- *
- * @return The list of qualified type names of the method parameters.
- */
- String[] methodParameters() default {""};
-
- /**
- * Define the method parameters pattern by a list of patterns on types.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * parameters.
- *
- * <p>Mutually exclusive with the following other properties defining parameters:
- *
- * <ul>
- * <li>methodParameters
- * <li>memberFromBinding
- * </ul>
- *
- * @return The list of type patterns for the method parameters.
- */
- TypePattern[] methodParameterTypePatterns() default {@TypePattern(name = "")};
-
- /**
- * Define the field-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassConstant
- * <li>fieldAnnotatedByClassNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String fieldAnnotatedByClassName() default "";
-
- /**
- * Define the field-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassName
- * <li>fieldAnnotatedByClassNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> fieldAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the field-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassName
- * <li>fieldAnnotatedByClassConstant
- * <li>memberFromBinding
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern fieldAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the field-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any
- * field-access flags.
- *
- * <p>Mutually exclusive with the property `memberFromBinding` also defining field-access.
- *
- * @return The field access-flag constraints that must be met.
- */
- FieldAccessFlags[] fieldAccess() default {};
-
- /**
- * Define the field-name pattern by an exact field name.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any field
- * name.
- *
- * <p>Mutually exclusive with the following other properties defining field-name:
- *
- * <ul>
- * <li>fieldNamePattern
- * <li>memberFromBinding
- * </ul>
- *
- * @return The exact field name of the field.
- */
- String fieldName() default "";
-
- /**
- * Define the field-name pattern by a string pattern.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any field
- * name.
- *
- * <p>Mutually exclusive with the following other properties defining field-name:
- *
- * <ul>
- * <li>fieldName
- * <li>memberFromBinding
- * </ul>
- *
- * @return The string pattern of the field name.
- */
- StringPattern fieldNamePattern() default @StringPattern(exact = "");
-
- /**
- * Define the field-type pattern by a fully qualified type.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldTypeConstant
- * <li>fieldTypePattern
- * <li>memberFromBinding
- * </ul>
- *
- * @return The qualified type name for the field type.
- */
- String fieldType() default "";
-
- /**
- * Define the field-type pattern by a class constant.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldType
- * <li>fieldTypePattern
- * <li>memberFromBinding
- * </ul>
- *
- * @return The class constant for the field type.
- */
- Class<?> fieldTypeConstant() default Object.class;
-
- /**
- * Define the field-type pattern by a pattern on types.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldType
- * <li>fieldTypeConstant
- * <li>memberFromBinding
- * </ul>
- *
- * @return The type pattern for the field type.
- */
- TypePattern fieldTypePattern() default @TypePattern(name = "");
-}
diff --git a/src/keepanno/java/androidx/annotation/keep/KeepTarget.kt b/src/keepanno/java/androidx/annotation/keep/KeepTarget.kt
new file mode 100644
index 0000000..7dbb4a2
--- /dev/null
+++ b/src/keepanno/java/androidx/annotation/keep/KeepTarget.kt
@@ -0,0 +1,906 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// ***********************************************************************************
+// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
+// ***********************************************************************************
+
+// ***********************************************************************************
+// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
+// ***********************************************************************************
+
+package androidx.annotation.keep
+
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
+import kotlin.reflect.KClass
+
+/**
+ * A target for a keep edge.
+ *
+ * <p>
+ * The target denotes an item along with options for what to keep. An item can be:
+ * <ul>
+ * <li>a pattern on classes;
+ * <li>a pattern on methods; or
+ * <li>a pattern on fields.
+ * </ul>
+ */
+@Retention(AnnotationRetention.BINARY)
+@Target(AnnotationTarget.ANNOTATION_CLASS)
+annotation class KeepTarget(
+
+ /**
+ * Specify the kind of this item pattern.
+ *
+ * <p>
+ * Possible values are:
+ * <ul>
+ * <li>{@link KeepItemKind#ONLY_CLASS}
+ * <li>{@link KeepItemKind#ONLY_MEMBERS}
+ * <li>{@link KeepItemKind#ONLY_METHODS}
+ * <li>{@link KeepItemKind#ONLY_FIELDS}
+ * <li>{@link KeepItemKind#CLASS_AND_MEMBERS}
+ * <li>{@link KeepItemKind#CLASS_AND_METHODS}
+ * <li>{@link KeepItemKind#CLASS_AND_FIELDS}
+ * </ul>
+ *
+ * <p>
+ * If unspecified the default kind for an item depends on its member patterns:
+ * <ul>
+ * <li>{@link KeepItemKind#ONLY_CLASS} if no member patterns are defined
+ * <li>{@link KeepItemKind#ONLY_METHODS} if method patterns are defined
+ * <li>{@link KeepItemKind#ONLY_FIELDS} if field patterns are defined
+ * <li>{@link KeepItemKind#ONLY_MEMBERS} otherwise.
+ * </ul>
+ *
+ * @return The kind for this pattern.
+ */
+ val kind: KeepItemKind = KeepItemKind.DEFAULT,
+
+ /**
+ * Define the usage constraints of the target.
+ *
+ * <p>
+ * The specified constraints must remain valid for the target.
+ *
+ * <p>
+ * The default constraints depend on the kind of the target. For all targets the default
+ * constraints include:
+ * <ul>
+ * <li>{@link KeepConstraint#LOOKUP}
+ * <li>{@link KeepConstraint#NAME}
+ * <li>{@link KeepConstraint#VISIBILITY_RELAX}
+ * </ul>
+ *
+ * <p>
+ * For classes the default constraints also include:
+ * <ul>
+ * <li>{@link KeepConstraint#CLASS_INSTANTIATE}
+ * </ul>
+ *
+ * <p>
+ * For methods the default constraints also include:
+ * <ul>
+ * <li>{@link KeepConstraint#METHOD_INVOKE}
+ * </ul>
+ *
+ * <p>
+ * For fields the default constraints also include:
+ * <ul>
+ * <li>{@link KeepConstraint#FIELD_GET}
+ * <li>{@link KeepConstraint#FIELD_SET}
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with the property `constraintAdditions` also defining constraints.
+ *
+ * @return Usage constraints for the target.
+ */
+ val constraints: Array<KeepConstraint> = [],
+
+ /**
+ * Add additional usage constraints of the target.
+ *
+ * <p>
+ * The specified constraints must remain valid for the target in addition to the default
+ * constraints.
+ *
+ * <p>
+ * The default constraints are documented in {@link #constraints}
+ *
+ * <p>
+ * Mutually exclusive with the property `constraints` also defining constraints.
+ *
+ * @return Additional usage constraints for the target.
+ */
+ val constraintAdditions: Array<KeepConstraint> = [],
+
+ /**
+ * Patterns for annotations that must remain on the item.
+ *
+ * <p>
+ * The annotations matching any of the patterns must remain on the item if the annotation types
+ * remain in the program.
+ *
+ * <p>
+ * Note that if the annotation types themselves are unused/removed, then their references on the
+ * item will be removed too. If the annotation types themselves are used reflectively then they
+ * too need a keep annotation or rule to ensure they remain in the program.
+ *
+ * <p>
+ * By default no annotation patterns are defined and no annotations are required to remain.
+ *
+ * @return Annotation patterns
+ */
+ val constrainAnnotations: Array<AnnotationPattern> = [],
+
+ /**
+ * Define the class pattern by reference to a binding.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class:
+ * <ul>
+ * <li>className
+ * <li>classConstant
+ * <li>classNamePattern
+ * <li>instanceOfClassName
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstant
+ * <li>instanceOfClassConstantExclusive
+ * <li>instanceOfPattern
+ * <li>classAnnotatedByClassName
+ * <li>classAnnotatedByClassConstant
+ * <li>classAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class.
+ *
+ * @return The name of the binding that defines the class.
+ */
+ val classFromBinding: String = "",
+
+ /**
+ * Define the class-name pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-name:
+ * <ul>
+ * <li>classConstant
+ * <li>classNamePattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class name.
+ *
+ * @return The qualified class name that defines the class.
+ */
+ val className: String = "",
+
+ /**
+ * Define the class-name pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-name:
+ * <ul>
+ * <li>className
+ * <li>classNamePattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class name.
+ *
+ * @return The class-constant that defines the class.
+ */
+ val classConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the class-name pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-name:
+ * <ul>
+ * <li>className
+ * <li>classConstant
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class name.
+ *
+ * @return The class-name pattern that defines the class.
+ */
+ val classNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the instance-of pattern as classes that are instances of the fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstant
+ * <li>instanceOfClassConstantExclusive
+ * <li>instanceOfPattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The qualified class name that defines what instance-of the class must be.
+ */
+ val instanceOfClassName: String = "",
+
+ /**
+ * Define the instance-of pattern as classes that are instances of the fully qualified class name.
+ *
+ * <p>
+ * The pattern is exclusive in that it does not match classes that are instances of the pattern,
+ * but only those that are instances of classes that are subclasses of the pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassName
+ * <li>instanceOfClassConstant
+ * <li>instanceOfClassConstantExclusive
+ * <li>instanceOfPattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The qualified class name that defines what instance-of the class must be.
+ */
+ val instanceOfClassNameExclusive: String = "",
+
+ /**
+ * Define the instance-of pattern as classes that are instances the referenced Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassName
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstantExclusive
+ * <li>instanceOfPattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The class constant that defines what instance-of the class must be.
+ */
+ val instanceOfClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the instance-of pattern as classes that are instances the referenced Class constant.
+ *
+ * <p>
+ * The pattern is exclusive in that it does not match classes that are instances of the pattern,
+ * but only those that are instances of classes that are subclasses of the pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassName
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstant
+ * <li>instanceOfPattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The class constant that defines what instance-of the class must be.
+ */
+ val instanceOfClassConstantExclusive: KClass<*> = Object::class,
+
+ /**
+ * Define the instance-of with a pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining instance-of:
+ * <ul>
+ * <li>instanceOfClassName
+ * <li>instanceOfClassNameExclusive
+ * <li>instanceOfClassConstant
+ * <li>instanceOfClassConstantExclusive
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class instance.
+ *
+ * @return The pattern that defines what instance-of the class must be.
+ */
+ val instanceOfPattern: InstanceOfPattern = InstanceOfPattern(),
+
+ /**
+ * Define the class-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-annotated-by:
+ * <ul>
+ * <li>classAnnotatedByClassConstant
+ * <li>classAnnotatedByClassNamePattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class regardless of what the class is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val classAnnotatedByClassName: String = "",
+
+ /**
+ * Define the class-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-annotated-by:
+ * <ul>
+ * <li>classAnnotatedByClassName
+ * <li>classAnnotatedByClassNamePattern
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class regardless of what the class is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val classAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the class-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining class-annotated-by:
+ * <ul>
+ * <li>classAnnotatedByClassName
+ * <li>classAnnotatedByClassConstant
+ * <li>classFromBinding
+ * </ul>
+ *
+ * <p>
+ * If none are specified the default is to match any class regardless of what the class is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val classAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the member pattern in full by a reference to a binding.
+ *
+ * <p>
+ * Mutually exclusive with all other class and member pattern properties. When a member binding is
+ * referenced this item is defined to be that item, including its class and member patterns.
+ *
+ * @return The binding name that defines the member.
+ */
+ val memberFromBinding: String = "",
+
+ /**
+ * Define the member-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassConstant
+ * <li>memberAnnotatedByClassNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val memberAnnotatedByClassName: String = "",
+
+ /**
+ * Define the member-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassName
+ * <li>memberAnnotatedByClassNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val memberAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the member-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassName
+ * <li>memberAnnotatedByClassConstant
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val memberAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the member-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * Mutually exclusive with the property `memberFromBinding` also defining member-access.
+ *
+ * @return The member access-flag constraints that must be met.
+ */
+ val memberAccess: Array<MemberAccessFlags> = [],
+
+ /**
+ * Define the method-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassConstant
+ * <li>methodAnnotatedByClassNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val methodAnnotatedByClassName: String = "",
+
+ /**
+ * Define the method-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassName
+ * <li>methodAnnotatedByClassNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val methodAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the method-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassName
+ * <li>methodAnnotatedByClassConstant
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val methodAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the method-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any
+ * method-access flags.
+ *
+ * <p>
+ * Mutually exclusive with the property `memberFromBinding` also defining method-access.
+ *
+ * @return The method access-flag constraints that must be met.
+ */
+ val methodAccess: Array<MethodAccessFlags> = [],
+
+ /**
+ * Define the method-name pattern by an exact method name.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any method
+ * name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-name:
+ * <ul>
+ * <li>methodNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The exact method name of the method.
+ */
+ val methodName: String = "",
+
+ /**
+ * Define the method-name pattern by a string pattern.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any method
+ * name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-name:
+ * <ul>
+ * <li>methodName
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The string pattern of the method name.
+ */
+ val methodNamePattern: StringPattern = StringPattern(exact = ""),
+
+ /**
+ * Define the method return-type pattern by a fully qualified type or 'void'.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnTypeConstant
+ * <li>methodReturnTypePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The qualified type name of the method return type.
+ */
+ val methodReturnType: String = "",
+
+ /**
+ * Define the method return-type pattern by a class constant.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnType
+ * <li>methodReturnTypePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return A class constant denoting the type of the method return type.
+ */
+ val methodReturnTypeConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the method return-type pattern by a type pattern.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnType
+ * <li>methodReturnTypeConstant
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The pattern of the method return type.
+ */
+ val methodReturnTypePattern: TypePattern = TypePattern(name = ""),
+
+ /**
+ * Define the method parameters pattern by a list of fully qualified types.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any parameters.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining parameters:
+ * <ul>
+ * <li>methodParameterTypePatterns
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The list of qualified type names of the method parameters.
+ */
+ val methodParameters: Array<String> = [""],
+
+ /**
+ * Define the method parameters pattern by a list of patterns on types.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any parameters.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining parameters:
+ * <ul>
+ * <li>methodParameters
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The list of type patterns for the method parameters.
+ */
+ val methodParameterTypePatterns: Array<TypePattern> = [TypePattern(name = "")],
+
+ /**
+ * Define the field-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassConstant
+ * <li>fieldAnnotatedByClassNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val fieldAnnotatedByClassName: String = "",
+
+ /**
+ * Define the field-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassName
+ * <li>fieldAnnotatedByClassNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val fieldAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the field-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassName
+ * <li>fieldAnnotatedByClassConstant
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val fieldAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the field-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field-access
+ * flags.
+ *
+ * <p>
+ * Mutually exclusive with the property `memberFromBinding` also defining field-access.
+ *
+ * @return The field access-flag constraints that must be met.
+ */
+ val fieldAccess: Array<FieldAccessFlags> = [],
+
+ /**
+ * Define the field-name pattern by an exact field name.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-name:
+ * <ul>
+ * <li>fieldNamePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The exact field name of the field.
+ */
+ val fieldName: String = "",
+
+ /**
+ * Define the field-name pattern by a string pattern.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-name:
+ * <ul>
+ * <li>fieldName
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The string pattern of the field name.
+ */
+ val fieldNamePattern: StringPattern = StringPattern(exact = ""),
+
+ /**
+ * Define the field-type pattern by a fully qualified type.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldTypeConstant
+ * <li>fieldTypePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The qualified type name for the field type.
+ */
+ val fieldType: String = "",
+
+ /**
+ * Define the field-type pattern by a class constant.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldType
+ * <li>fieldTypePattern
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The class constant for the field type.
+ */
+ val fieldTypeConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the field-type pattern by a pattern on types.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldType
+ * <li>fieldTypeConstant
+ * <li>memberFromBinding
+ * </ul>
+ *
+ * @return The type pattern for the field type.
+ */
+ val fieldTypePattern: TypePattern = TypePattern(name = ""),
+)
diff --git a/src/keepanno/java/androidx/annotation/keep/MemberAccessFlags.java b/src/keepanno/java/androidx/annotation/keep/MemberAccessFlags.kt
similarity index 93%
rename from src/keepanno/java/androidx/annotation/keep/MemberAccessFlags.java
rename to src/keepanno/java/androidx/annotation/keep/MemberAccessFlags.kt
index dd6c1d6..4985630 100644
--- a/src/keepanno/java/androidx/annotation/keep/MemberAccessFlags.java
+++ b/src/keepanno/java/androidx/annotation/keep/MemberAccessFlags.kt
@@ -18,7 +18,7 @@
// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
// ***********************************************************************************
-package androidx.annotation.keep;
+package androidx.annotation.keep
/**
* Valid matches on member access flags and their negations.
@@ -26,7 +26,7 @@
* <p>The negated elements make it easier to express the inverse as we cannot use a "not/negation"
* operation syntactically.
*/
-public enum MemberAccessFlags {
+enum class MemberAccessFlags {
PUBLIC,
NON_PUBLIC,
PROTECTED,
@@ -40,5 +40,5 @@
FINAL,
NON_FINAL,
SYNTHETIC,
- NON_SYNTHETIC
+ NON_SYNTHETIC,
}
diff --git a/src/keepanno/java/androidx/annotation/keep/MethodAccessFlags.java b/src/keepanno/java/androidx/annotation/keep/MethodAccessFlags.kt
similarity index 94%
rename from src/keepanno/java/androidx/annotation/keep/MethodAccessFlags.java
rename to src/keepanno/java/androidx/annotation/keep/MethodAccessFlags.kt
index 9b9fca0..a3fa2f7 100644
--- a/src/keepanno/java/androidx/annotation/keep/MethodAccessFlags.java
+++ b/src/keepanno/java/androidx/annotation/keep/MethodAccessFlags.kt
@@ -18,7 +18,7 @@
// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
// ***********************************************************************************
-package androidx.annotation.keep;
+package androidx.annotation.keep
/**
* Valid matches on method access flags and their negations.
@@ -26,7 +26,7 @@
* <p>The negated elements make it easier to express the inverse as we cannot use a "not/negation"
* operation syntactically.
*/
-public enum MethodAccessFlags {
+enum class MethodAccessFlags {
// General member flags.
PUBLIC,
NON_PUBLIC,
@@ -53,5 +53,5 @@
ABSTRACT,
NON_ABSTRACT,
STRICT_FP,
- NON_STRICT_FP
+ NON_STRICT_FP,
}
diff --git a/src/keepanno/java/androidx/annotation/keep/StringPattern.java b/src/keepanno/java/androidx/annotation/keep/StringPattern.java
deleted file mode 100644
index 0a0d803..0000000
--- a/src/keepanno/java/androidx/annotation/keep/StringPattern.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// ***********************************************************************************
-// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
-// ***********************************************************************************
-
-// ***********************************************************************************
-// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
-// ***********************************************************************************
-
-package androidx.annotation.keep;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * A pattern structure for matching strings.
- *
- * <p>If no properties are set, the default pattern matches any string.
- */
-@Target(ElementType.ANNOTATION_TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface StringPattern {
-
- /**
- * Exact string content.
- *
- * <p>For example, {@code "foo"} or {@code "java.lang.String"}.
- *
- * <p>Mutually exclusive with the following other properties defining string-exact-pattern:
- *
- * <ul>
- * <li>startsWith
- * <li>endsWith
- * </ul>
- */
- String exact() default "";
-
- /**
- * Matches strings beginning with the given prefix.
- *
- * <p>For example, {@code "get"} to match strings such as {@code "getMyValue"}.
- *
- * <p>Mutually exclusive with the property `exact` also defining string-prefix-pattern.
- */
- String startsWith() default "";
-
- /**
- * Matches strings ending with the given suffix.
- *
- * <p>For example, {@code "Setter"} to match strings such as {@code "myValueSetter"}.
- *
- * <p>Mutually exclusive with the property `exact` also defining string-suffix-pattern.
- */
- String endsWith() default "";
-}
diff --git a/src/keepanno/java/androidx/annotation/keep/StringPattern.kt b/src/keepanno/java/androidx/annotation/keep/StringPattern.kt
new file mode 100644
index 0000000..bb872ec
--- /dev/null
+++ b/src/keepanno/java/androidx/annotation/keep/StringPattern.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// ***********************************************************************************
+// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
+// ***********************************************************************************
+
+// ***********************************************************************************
+// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
+// ***********************************************************************************
+
+package androidx.annotation.keep
+
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
+
+/**
+ * A pattern structure for matching strings.
+ *
+ * <p>
+ * If no properties are set, the default pattern matches any string.
+ */
+@Retention(AnnotationRetention.BINARY)
+@Target(AnnotationTarget.ANNOTATION_CLASS)
+annotation class StringPattern(
+
+ /**
+ * Exact string content.
+ *
+ * <p>
+ * For example, {@code "foo"} or {@code "java.lang.String"}.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining string-exact-pattern:
+ * <ul>
+ * <li>startsWith
+ * <li>endsWith
+ * </ul>
+ */
+ val exact: String = "",
+
+ /**
+ * Matches strings beginning with the given prefix.
+ *
+ * <p>
+ * For example, {@code "get"} to match strings such as {@code "getMyValue"}.
+ *
+ * <p>
+ * Mutually exclusive with the property `exact` also defining string-prefix-pattern.
+ */
+ val startsWith: String = "",
+
+ /**
+ * Matches strings ending with the given suffix.
+ *
+ * <p>
+ * For example, {@code "Setter"} to match strings such as {@code "myValueSetter"}.
+ *
+ * <p>
+ * Mutually exclusive with the property `exact` also defining string-suffix-pattern.
+ */
+ val endsWith: String = "",
+)
diff --git a/src/keepanno/java/androidx/annotation/keep/TypePattern.java b/src/keepanno/java/androidx/annotation/keep/TypePattern.java
deleted file mode 100644
index 71b41aa..0000000
--- a/src/keepanno/java/androidx/annotation/keep/TypePattern.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// ***********************************************************************************
-// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
-// ***********************************************************************************
-
-// ***********************************************************************************
-// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
-// ***********************************************************************************
-
-package androidx.annotation.keep;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * A pattern structure for matching types.
- *
- * <p>If no properties are set, the default pattern matches any type.
- *
- * <p>All properties on this annotation are mutually exclusive.
- */
-@Target(ElementType.ANNOTATION_TYPE)
-@Retention(RetentionPolicy.CLASS)
-public @interface TypePattern {
-
- /**
- * Exact type name as a string.
- *
- * <p>For example, {@code "long"} or {@code "java.lang.String"}.
- *
- * <p>Mutually exclusive with the following other properties defining type-pattern:
- *
- * <ul>
- * <li>constant
- * <li>classNamePattern
- * <li>instanceOfPattern
- * </ul>
- */
- String name() default "";
-
- /**
- * Exact type from a class constant.
- *
- * <p>For example, {@code String.class}.
- *
- * <p>Mutually exclusive with the following other properties defining type-pattern:
- *
- * <ul>
- * <li>name
- * <li>classNamePattern
- * <li>instanceOfPattern
- * </ul>
- */
- Class<?> constant() default Object.class;
-
- /**
- * Classes matching the class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining type-pattern:
- *
- * <ul>
- * <li>name
- * <li>constant
- * <li>instanceOfPattern
- * </ul>
- */
- ClassNamePattern classNamePattern() default @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the instance-of with a pattern.
- *
- * <p>Mutually exclusive with the following other properties defining type-pattern:
- *
- * <ul>
- * <li>name
- * <li>constant
- * <li>classNamePattern
- * </ul>
- *
- * @return The pattern that defines what instance-of the class must be.
- */
- InstanceOfPattern instanceOfPattern() default @InstanceOfPattern();
-}
diff --git a/src/keepanno/java/androidx/annotation/keep/TypePattern.kt b/src/keepanno/java/androidx/annotation/keep/TypePattern.kt
new file mode 100644
index 0000000..0e87702
--- /dev/null
+++ b/src/keepanno/java/androidx/annotation/keep/TypePattern.kt
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// ***********************************************************************************
+// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
+// ***********************************************************************************
+
+// ***********************************************************************************
+// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
+// ***********************************************************************************
+
+package androidx.annotation.keep
+
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
+import kotlin.reflect.KClass
+
+/**
+ * A pattern structure for matching types.
+ *
+ * <p>
+ * If no properties are set, the default pattern matches any type.
+ *
+ * <p>
+ * All properties on this annotation are mutually exclusive.
+ */
+@Retention(AnnotationRetention.BINARY)
+@Target(AnnotationTarget.ANNOTATION_CLASS)
+annotation class TypePattern(
+
+ /**
+ * Exact type name as a string.
+ *
+ * <p>
+ * For example, {@code "long"} or {@code "java.lang.String"}.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining type-pattern:
+ * <ul>
+ * <li>constant
+ * <li>classNamePattern
+ * <li>instanceOfPattern
+ * </ul>
+ */
+ val name: String = "",
+
+ /**
+ * Exact type from a class constant.
+ *
+ * <p>
+ * For example, {@code String.class}.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining type-pattern:
+ * <ul>
+ * <li>name
+ * <li>classNamePattern
+ * <li>instanceOfPattern
+ * </ul>
+ */
+ val constant: KClass<*> = Object::class,
+
+ /**
+ * Classes matching the class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining type-pattern:
+ * <ul>
+ * <li>name
+ * <li>constant
+ * <li>instanceOfPattern
+ * </ul>
+ */
+ val classNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the instance-of with a pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining type-pattern:
+ * <ul>
+ * <li>name
+ * <li>constant
+ * <li>classNamePattern
+ * </ul>
+ *
+ * @return The pattern that defines what instance-of the class must be.
+ */
+ val instanceOfPattern: InstanceOfPattern = InstanceOfPattern(),
+)
diff --git a/src/keepanno/java/androidx/annotation/keep/UsedByNative.java b/src/keepanno/java/androidx/annotation/keep/UsedByNative.java
deleted file mode 100644
index 955bc95..0000000
--- a/src/keepanno/java/androidx/annotation/keep/UsedByNative.java
+++ /dev/null
@@ -1,571 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// ***********************************************************************************
-// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
-// ***********************************************************************************
-
-// ***********************************************************************************
-// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
-// ***********************************************************************************
-
-package androidx.annotation.keep;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation to mark a class, field or method as being accessed from native code via JNI.
- *
- * <p>Note: Before using this annotation, consider if instead you can annotate the code that is
- * doing reflection with {@link UsesReflection}. Annotating the reflecting code is generally more
- * clear and maintainable, and it also naturally gives rise to edges that describe just the
- * reflected aspects of the program. The {@link UsedByReflection} annotation is suitable for cases
- * where the reflecting code is not under user control, or in migrating away from rules.
- *
- * <p>When a class is annotated, member patterns can be used to define which members are to be kept.
- * When no member patterns are specified the default pattern is to match just the class.
- *
- * <p>When a member is annotated, the member patterns cannot be used as the annotated member itself
- * fully defines the item to be kept (i.e., itself).
- */
-@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})
-@Retention(RetentionPolicy.CLASS)
-public @interface UsedByNative {
-
- /**
- * Optional description to document the reason for this annotation.
- *
- * @return The descriptive message. Defaults to no description.
- */
- String description() default "";
-
- /**
- * Conditions that should be satisfied for the annotation to be in effect.
- *
- * @return The list of preconditions. Defaults to no conditions, thus trivially/unconditionally
- * satisfied.
- */
- KeepCondition[] preconditions() default {};
-
- /**
- * Additional targets to be kept in addition to the annotated class/members.
- *
- * @return List of additional target consequences. Defaults to no additional target consequences.
- */
- KeepTarget[] additionalTargets() default {};
-
- /**
- * Specify the kind of this item pattern.
- *
- * <p>If unspecified the default kind depends on the annotated item.
- *
- * <p>When annotating a class the default kind is:
- *
- * <ul>
- * <li>{@link KeepItemKind#ONLY_CLASS} if no member patterns are defined;
- * <li>{@link KeepItemKind#CLASS_AND_METHODS} if method patterns are defined;
- * <li>{@link KeepItemKind#CLASS_AND_FIELDS} if field patterns are defined;
- * <li>{@link KeepItemKind#CLASS_AND_MEMBERS} otherwise.
- * </ul>
- *
- * <p>When annotating a method the default kind is: {@link KeepItemKind#ONLY_METHODS}
- *
- * <p>When annotating a field the default kind is: {@link KeepItemKind#ONLY_FIELDS}
- *
- * <p>It is not possible to use {@link KeepItemKind#ONLY_CLASS} if annotating a member.
- *
- * @return The kind for this pattern.
- */
- KeepItemKind kind() default KeepItemKind.DEFAULT;
-
- /**
- * Define the usage constraints of the target.
- *
- * <p>The specified constraints must remain valid for the target.
- *
- * <p>The default constraints depend on the kind of the target. For all targets the default
- * constraints include:
- *
- * <ul>
- * <li>{@link KeepConstraint#LOOKUP}
- * <li>{@link KeepConstraint#NAME}
- * <li>{@link KeepConstraint#VISIBILITY_RELAX}
- * </ul>
- *
- * <p>For classes the default constraints also include:
- *
- * <ul>
- * <li>{@link KeepConstraint#CLASS_INSTANTIATE}
- * </ul>
- *
- * <p>For methods the default constraints also include:
- *
- * <ul>
- * <li>{@link KeepConstraint#METHOD_INVOKE}
- * </ul>
- *
- * <p>For fields the default constraints also include:
- *
- * <ul>
- * <li>{@link KeepConstraint#FIELD_GET}
- * <li>{@link KeepConstraint#FIELD_SET}
- * </ul>
- *
- * <p>Mutually exclusive with the property `constraintAdditions` also defining constraints.
- *
- * @return Usage constraints for the target.
- */
- KeepConstraint[] constraints() default {};
-
- /**
- * Add additional usage constraints of the target.
- *
- * <p>The specified constraints must remain valid for the target in addition to the default
- * constraints.
- *
- * <p>The default constraints are documented in {@link #constraints}
- *
- * <p>Mutually exclusive with the property `constraints` also defining constraints.
- *
- * @return Additional usage constraints for the target.
- */
- KeepConstraint[] constraintAdditions() default {};
-
- /**
- * Patterns for annotations that must remain on the item.
- *
- * <p>The annotations matching any of the patterns must remain on the item if the annotation types
- * remain in the program.
- *
- * <p>Note that if the annotation types themselves are unused/removed, then their references on
- * the item will be removed too. If the annotation types themselves are used reflectively then
- * they too need a keep annotation or rule to ensure they remain in the program.
- *
- * <p>By default no annotation patterns are defined and no annotations are required to remain.
- *
- * @return Annotation patterns
- */
- AnnotationPattern[] constrainAnnotations() default {};
-
- /**
- * Define the member-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassConstant
- * <li>memberAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String memberAnnotatedByClassName() default "";
-
- /**
- * Define the member-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassName
- * <li>memberAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> memberAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the member-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassName
- * <li>memberAnnotatedByClassConstant
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern memberAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the member-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * @return The member access-flag constraints that must be met.
- */
- MemberAccessFlags[] memberAccess() default {};
-
- /**
- * Define the method-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassConstant
- * <li>methodAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String methodAnnotatedByClassName() default "";
-
- /**
- * Define the method-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassName
- * <li>methodAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> methodAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the method-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassName
- * <li>methodAnnotatedByClassConstant
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern methodAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the method-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * method-access flags.
- *
- * @return The method access-flag constraints that must be met.
- */
- MethodAccessFlags[] methodAccess() default {};
-
- /**
- * Define the method-name pattern by an exact method name.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any method
- * name.
- *
- * <p>Mutually exclusive with the property `methodNamePattern` also defining method-name.
- *
- * @return The exact method name of the method.
- */
- String methodName() default "";
-
- /**
- * Define the method-name pattern by a string pattern.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any method
- * name.
- *
- * <p>Mutually exclusive with the property `methodName` also defining method-name.
- *
- * @return The string pattern of the method name.
- */
- StringPattern methodNamePattern() default @StringPattern(exact = "");
-
- /**
- * Define the method return-type pattern by a fully qualified type or 'void'.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnTypeConstant
- * <li>methodReturnTypePattern
- * </ul>
- *
- * @return The qualified type name of the method return type.
- */
- String methodReturnType() default "";
-
- /**
- * Define the method return-type pattern by a class constant.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnType
- * <li>methodReturnTypePattern
- * </ul>
- *
- * @return A class constant denoting the type of the method return type.
- */
- Class<?> methodReturnTypeConstant() default Object.class;
-
- /**
- * Define the method return-type pattern by a type pattern.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnType
- * <li>methodReturnTypeConstant
- * </ul>
- *
- * @return The pattern of the method return type.
- */
- TypePattern methodReturnTypePattern() default @TypePattern(name = "");
-
- /**
- * Define the method parameters pattern by a list of fully qualified types.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * parameters.
- *
- * <p>Mutually exclusive with the property `methodParameterTypePatterns` also defining parameters.
- *
- * @return The list of qualified type names of the method parameters.
- */
- String[] methodParameters() default {""};
-
- /**
- * Define the method parameters pattern by a list of patterns on types.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * parameters.
- *
- * <p>Mutually exclusive with the property `methodParameters` also defining parameters.
- *
- * @return The list of type patterns for the method parameters.
- */
- TypePattern[] methodParameterTypePatterns() default {@TypePattern(name = "")};
-
- /**
- * Define the field-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassConstant
- * <li>fieldAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String fieldAnnotatedByClassName() default "";
-
- /**
- * Define the field-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassName
- * <li>fieldAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> fieldAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the field-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassName
- * <li>fieldAnnotatedByClassConstant
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern fieldAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the field-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any
- * field-access flags.
- *
- * @return The field access-flag constraints that must be met.
- */
- FieldAccessFlags[] fieldAccess() default {};
-
- /**
- * Define the field-name pattern by an exact field name.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any field
- * name.
- *
- * <p>Mutually exclusive with the property `fieldNamePattern` also defining field-name.
- *
- * @return The exact field name of the field.
- */
- String fieldName() default "";
-
- /**
- * Define the field-name pattern by a string pattern.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any field
- * name.
- *
- * <p>Mutually exclusive with the property `fieldName` also defining field-name.
- *
- * @return The string pattern of the field name.
- */
- StringPattern fieldNamePattern() default @StringPattern(exact = "");
-
- /**
- * Define the field-type pattern by a fully qualified type.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldTypeConstant
- * <li>fieldTypePattern
- * </ul>
- *
- * @return The qualified type name for the field type.
- */
- String fieldType() default "";
-
- /**
- * Define the field-type pattern by a class constant.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldType
- * <li>fieldTypePattern
- * </ul>
- *
- * @return The class constant for the field type.
- */
- Class<?> fieldTypeConstant() default Object.class;
-
- /**
- * Define the field-type pattern by a pattern on types.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldType
- * <li>fieldTypeConstant
- * </ul>
- *
- * @return The type pattern for the field type.
- */
- TypePattern fieldTypePattern() default @TypePattern(name = "");
-}
diff --git a/src/keepanno/java/androidx/annotation/keep/UsedByNative.kt b/src/keepanno/java/androidx/annotation/keep/UsedByNative.kt
new file mode 100644
index 0000000..677a344
--- /dev/null
+++ b/src/keepanno/java/androidx/annotation/keep/UsedByNative.kt
@@ -0,0 +1,636 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// ***********************************************************************************
+// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
+// ***********************************************************************************
+
+// ***********************************************************************************
+// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
+// ***********************************************************************************
+
+package androidx.annotation.keep
+
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
+import kotlin.reflect.KClass
+
+/**
+ * Annotation to mark a class, field or method as being accessed from native code via JNI.
+ *
+ * <p>
+ * Note: Before using this annotation, consider if instead you can annotate the code that is doing
+ * reflection with {@link UsesReflection}. Annotating the reflecting code is generally more clear
+ * and maintainable, and it also naturally gives rise to edges that describe just the reflected
+ * aspects of the program. The {@link UsedByReflection} annotation is suitable for cases where the
+ * reflecting code is not under user control, or in migrating away from rules.
+ *
+ * <p>
+ * When a class is annotated, member patterns can be used to define which members are to be kept.
+ * When no member patterns are specified the default pattern is to match just the class.
+ *
+ * <p>
+ * When a member is annotated, the member patterns cannot be used as the annotated member itself
+ * fully defines the item to be kept (i.e., itself).
+ */
+@Retention(AnnotationRetention.BINARY)
+@Target(
+ AnnotationTarget.CLASS,
+ AnnotationTarget.FIELD,
+ AnnotationTarget.FUNCTION,
+ AnnotationTarget.CONSTRUCTOR,
+)
+annotation class UsedByNative(
+
+ /**
+ * Optional description to document the reason for this annotation.
+ *
+ * @return The descriptive message. Defaults to no description.
+ */
+ val description: String = "",
+
+ /**
+ * Conditions that should be satisfied for the annotation to be in effect.
+ *
+ * @return The list of preconditions. Defaults to no conditions, thus trivially/unconditionally
+ * satisfied.
+ */
+ val preconditions: Array<KeepCondition> = [],
+
+ /**
+ * Additional targets to be kept in addition to the annotated class/members.
+ *
+ * @return List of additional target consequences. Defaults to no additional target consequences.
+ */
+ val additionalTargets: Array<KeepTarget> = [],
+
+ /**
+ * Specify the kind of this item pattern.
+ *
+ * <p>
+ * If unspecified the default kind depends on the annotated item.
+ *
+ * <p>
+ * When annotating a class the default kind is:
+ * <ul>
+ * <li>{@link KeepItemKind#ONLY_CLASS} if no member patterns are defined;
+ * <li>{@link KeepItemKind#CLASS_AND_METHODS} if method patterns are defined;
+ * <li>{@link KeepItemKind#CLASS_AND_FIELDS} if field patterns are defined;
+ * <li>{@link KeepItemKind#CLASS_AND_MEMBERS} otherwise.
+ * </ul>
+ *
+ * <p>
+ * When annotating a method the default kind is: {@link KeepItemKind#ONLY_METHODS}
+ *
+ * <p>
+ * When annotating a field the default kind is: {@link KeepItemKind#ONLY_FIELDS}
+ *
+ * <p>
+ * It is not possible to use {@link KeepItemKind#ONLY_CLASS} if annotating a member.
+ *
+ * @return The kind for this pattern.
+ */
+ val kind: KeepItemKind = KeepItemKind.DEFAULT,
+
+ /**
+ * Define the usage constraints of the target.
+ *
+ * <p>
+ * The specified constraints must remain valid for the target.
+ *
+ * <p>
+ * The default constraints depend on the kind of the target. For all targets the default
+ * constraints include:
+ * <ul>
+ * <li>{@link KeepConstraint#LOOKUP}
+ * <li>{@link KeepConstraint#NAME}
+ * <li>{@link KeepConstraint#VISIBILITY_RELAX}
+ * </ul>
+ *
+ * <p>
+ * For classes the default constraints also include:
+ * <ul>
+ * <li>{@link KeepConstraint#CLASS_INSTANTIATE}
+ * </ul>
+ *
+ * <p>
+ * For methods the default constraints also include:
+ * <ul>
+ * <li>{@link KeepConstraint#METHOD_INVOKE}
+ * </ul>
+ *
+ * <p>
+ * For fields the default constraints also include:
+ * <ul>
+ * <li>{@link KeepConstraint#FIELD_GET}
+ * <li>{@link KeepConstraint#FIELD_SET}
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with the property `constraintAdditions` also defining constraints.
+ *
+ * @return Usage constraints for the target.
+ */
+ val constraints: Array<KeepConstraint> = [],
+
+ /**
+ * Add additional usage constraints of the target.
+ *
+ * <p>
+ * The specified constraints must remain valid for the target in addition to the default
+ * constraints.
+ *
+ * <p>
+ * The default constraints are documented in {@link #constraints}
+ *
+ * <p>
+ * Mutually exclusive with the property `constraints` also defining constraints.
+ *
+ * @return Additional usage constraints for the target.
+ */
+ val constraintAdditions: Array<KeepConstraint> = [],
+
+ /**
+ * Patterns for annotations that must remain on the item.
+ *
+ * <p>
+ * The annotations matching any of the patterns must remain on the item if the annotation types
+ * remain in the program.
+ *
+ * <p>
+ * Note that if the annotation types themselves are unused/removed, then their references on the
+ * item will be removed too. If the annotation types themselves are used reflectively then they
+ * too need a keep annotation or rule to ensure they remain in the program.
+ *
+ * <p>
+ * By default no annotation patterns are defined and no annotations are required to remain.
+ *
+ * @return Annotation patterns
+ */
+ val constrainAnnotations: Array<AnnotationPattern> = [],
+
+ /**
+ * Define the member-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassConstant
+ * <li>memberAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val memberAnnotatedByClassName: String = "",
+
+ /**
+ * Define the member-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassName
+ * <li>memberAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val memberAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the member-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassName
+ * <li>memberAnnotatedByClassConstant
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val memberAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the member-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * @return The member access-flag constraints that must be met.
+ */
+ val memberAccess: Array<MemberAccessFlags> = [],
+
+ /**
+ * Define the method-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassConstant
+ * <li>methodAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val methodAnnotatedByClassName: String = "",
+
+ /**
+ * Define the method-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassName
+ * <li>methodAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val methodAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the method-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassName
+ * <li>methodAnnotatedByClassConstant
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val methodAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the method-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any
+ * method-access flags.
+ *
+ * @return The method access-flag constraints that must be met.
+ */
+ val methodAccess: Array<MethodAccessFlags> = [],
+
+ /**
+ * Define the method-name pattern by an exact method name.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any method
+ * name.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodNamePattern` also defining method-name.
+ *
+ * @return The exact method name of the method.
+ */
+ val methodName: String = "",
+
+ /**
+ * Define the method-name pattern by a string pattern.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any method
+ * name.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodName` also defining method-name.
+ *
+ * @return The string pattern of the method name.
+ */
+ val methodNamePattern: StringPattern = StringPattern(exact = ""),
+
+ /**
+ * Define the method return-type pattern by a fully qualified type or 'void'.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnTypeConstant
+ * <li>methodReturnTypePattern
+ * </ul>
+ *
+ * @return The qualified type name of the method return type.
+ */
+ val methodReturnType: String = "",
+
+ /**
+ * Define the method return-type pattern by a class constant.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnType
+ * <li>methodReturnTypePattern
+ * </ul>
+ *
+ * @return A class constant denoting the type of the method return type.
+ */
+ val methodReturnTypeConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the method return-type pattern by a type pattern.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnType
+ * <li>methodReturnTypeConstant
+ * </ul>
+ *
+ * @return The pattern of the method return type.
+ */
+ val methodReturnTypePattern: TypePattern = TypePattern(name = ""),
+
+ /**
+ * Define the method parameters pattern by a list of fully qualified types.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any parameters.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodParameterTypePatterns` also defining parameters.
+ *
+ * @return The list of qualified type names of the method parameters.
+ */
+ val methodParameters: Array<String> = [""],
+
+ /**
+ * Define the method parameters pattern by a list of patterns on types.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any parameters.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodParameters` also defining parameters.
+ *
+ * @return The list of type patterns for the method parameters.
+ */
+ val methodParameterTypePatterns: Array<TypePattern> = [TypePattern(name = "")],
+
+ /**
+ * Define the field-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassConstant
+ * <li>fieldAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val fieldAnnotatedByClassName: String = "",
+
+ /**
+ * Define the field-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassName
+ * <li>fieldAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val fieldAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the field-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassName
+ * <li>fieldAnnotatedByClassConstant
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val fieldAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the field-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field-access
+ * flags.
+ *
+ * @return The field access-flag constraints that must be met.
+ */
+ val fieldAccess: Array<FieldAccessFlags> = [],
+
+ /**
+ * Define the field-name pattern by an exact field name.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field name.
+ *
+ * <p>
+ * Mutually exclusive with the property `fieldNamePattern` also defining field-name.
+ *
+ * @return The exact field name of the field.
+ */
+ val fieldName: String = "",
+
+ /**
+ * Define the field-name pattern by a string pattern.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field name.
+ *
+ * <p>
+ * Mutually exclusive with the property `fieldName` also defining field-name.
+ *
+ * @return The string pattern of the field name.
+ */
+ val fieldNamePattern: StringPattern = StringPattern(exact = ""),
+
+ /**
+ * Define the field-type pattern by a fully qualified type.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldTypeConstant
+ * <li>fieldTypePattern
+ * </ul>
+ *
+ * @return The qualified type name for the field type.
+ */
+ val fieldType: String = "",
+
+ /**
+ * Define the field-type pattern by a class constant.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldType
+ * <li>fieldTypePattern
+ * </ul>
+ *
+ * @return The class constant for the field type.
+ */
+ val fieldTypeConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the field-type pattern by a pattern on types.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldType
+ * <li>fieldTypeConstant
+ * </ul>
+ *
+ * @return The type pattern for the field type.
+ */
+ val fieldTypePattern: TypePattern = TypePattern(name = ""),
+)
diff --git a/src/keepanno/java/androidx/annotation/keep/UsedByReflection.java b/src/keepanno/java/androidx/annotation/keep/UsedByReflection.java
deleted file mode 100644
index 7cf8b09..0000000
--- a/src/keepanno/java/androidx/annotation/keep/UsedByReflection.java
+++ /dev/null
@@ -1,571 +0,0 @@
-/*
- * Copyright 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// ***********************************************************************************
-// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
-// ***********************************************************************************
-
-// ***********************************************************************************
-// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
-// ***********************************************************************************
-
-package androidx.annotation.keep;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation to mark a class, field or method as being accessed reflectively.
- *
- * <p>Note: Before using this annotation, consider if instead you can annotate the code that is
- * doing reflection with {@link UsesReflection}. Annotating the reflecting code is generally more
- * clear and maintainable, and it also naturally gives rise to edges that describe just the
- * reflected aspects of the program. The {@link UsedByReflection} annotation is suitable for cases
- * where the reflecting code is not under user control, or in migrating away from rules.
- *
- * <p>When a class is annotated, member patterns can be used to define which members are to be kept.
- * When no member patterns are specified the default pattern is to match just the class.
- *
- * <p>When a member is annotated, the member patterns cannot be used as the annotated member itself
- * fully defines the item to be kept (i.e., itself).
- */
-@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})
-@Retention(RetentionPolicy.CLASS)
-public @interface UsedByReflection {
-
- /**
- * Optional description to document the reason for this annotation.
- *
- * @return The descriptive message. Defaults to no description.
- */
- String description() default "";
-
- /**
- * Conditions that should be satisfied for the annotation to be in effect.
- *
- * @return The list of preconditions. Defaults to no conditions, thus trivially/unconditionally
- * satisfied.
- */
- KeepCondition[] preconditions() default {};
-
- /**
- * Additional targets to be kept in addition to the annotated class/members.
- *
- * @return List of additional target consequences. Defaults to no additional target consequences.
- */
- KeepTarget[] additionalTargets() default {};
-
- /**
- * Specify the kind of this item pattern.
- *
- * <p>If unspecified the default kind depends on the annotated item.
- *
- * <p>When annotating a class the default kind is:
- *
- * <ul>
- * <li>{@link KeepItemKind#ONLY_CLASS} if no member patterns are defined;
- * <li>{@link KeepItemKind#CLASS_AND_METHODS} if method patterns are defined;
- * <li>{@link KeepItemKind#CLASS_AND_FIELDS} if field patterns are defined;
- * <li>{@link KeepItemKind#CLASS_AND_MEMBERS} otherwise.
- * </ul>
- *
- * <p>When annotating a method the default kind is: {@link KeepItemKind#ONLY_METHODS}
- *
- * <p>When annotating a field the default kind is: {@link KeepItemKind#ONLY_FIELDS}
- *
- * <p>It is not possible to use {@link KeepItemKind#ONLY_CLASS} if annotating a member.
- *
- * @return The kind for this pattern.
- */
- KeepItemKind kind() default KeepItemKind.DEFAULT;
-
- /**
- * Define the usage constraints of the target.
- *
- * <p>The specified constraints must remain valid for the target.
- *
- * <p>The default constraints depend on the kind of the target. For all targets the default
- * constraints include:
- *
- * <ul>
- * <li>{@link KeepConstraint#LOOKUP}
- * <li>{@link KeepConstraint#NAME}
- * <li>{@link KeepConstraint#VISIBILITY_RELAX}
- * </ul>
- *
- * <p>For classes the default constraints also include:
- *
- * <ul>
- * <li>{@link KeepConstraint#CLASS_INSTANTIATE}
- * </ul>
- *
- * <p>For methods the default constraints also include:
- *
- * <ul>
- * <li>{@link KeepConstraint#METHOD_INVOKE}
- * </ul>
- *
- * <p>For fields the default constraints also include:
- *
- * <ul>
- * <li>{@link KeepConstraint#FIELD_GET}
- * <li>{@link KeepConstraint#FIELD_SET}
- * </ul>
- *
- * <p>Mutually exclusive with the property `constraintAdditions` also defining constraints.
- *
- * @return Usage constraints for the target.
- */
- KeepConstraint[] constraints() default {};
-
- /**
- * Add additional usage constraints of the target.
- *
- * <p>The specified constraints must remain valid for the target in addition to the default
- * constraints.
- *
- * <p>The default constraints are documented in {@link #constraints}
- *
- * <p>Mutually exclusive with the property `constraints` also defining constraints.
- *
- * @return Additional usage constraints for the target.
- */
- KeepConstraint[] constraintAdditions() default {};
-
- /**
- * Patterns for annotations that must remain on the item.
- *
- * <p>The annotations matching any of the patterns must remain on the item if the annotation types
- * remain in the program.
- *
- * <p>Note that if the annotation types themselves are unused/removed, then their references on
- * the item will be removed too. If the annotation types themselves are used reflectively then
- * they too need a keep annotation or rule to ensure they remain in the program.
- *
- * <p>By default no annotation patterns are defined and no annotations are required to remain.
- *
- * @return Annotation patterns
- */
- AnnotationPattern[] constrainAnnotations() default {};
-
- /**
- * Define the member-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassConstant
- * <li>memberAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String memberAnnotatedByClassName() default "";
-
- /**
- * Define the member-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassName
- * <li>memberAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> memberAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the member-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining member-annotated-by:
- *
- * <ul>
- * <li>memberAnnotatedByClassName
- * <li>memberAnnotatedByClassConstant
- * </ul>
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * <p>If none are specified the default is to match any member regardless of what the member is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern memberAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the member-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all field and method properties as use restricts the match to both
- * types of members.
- *
- * @return The member access-flag constraints that must be met.
- */
- MemberAccessFlags[] memberAccess() default {};
-
- /**
- * Define the method-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassConstant
- * <li>methodAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String methodAnnotatedByClassName() default "";
-
- /**
- * Define the method-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassName
- * <li>methodAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> methodAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the method-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining method-annotated-by:
- *
- * <ul>
- * <li>methodAnnotatedByClassName
- * <li>methodAnnotatedByClassConstant
- * </ul>
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none are specified the default is to match any method regardless of what the method is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern methodAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the method-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * method-access flags.
- *
- * @return The method access-flag constraints that must be met.
- */
- MethodAccessFlags[] methodAccess() default {};
-
- /**
- * Define the method-name pattern by an exact method name.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any method
- * name.
- *
- * <p>Mutually exclusive with the property `methodNamePattern` also defining method-name.
- *
- * @return The exact method name of the method.
- */
- String methodName() default "";
-
- /**
- * Define the method-name pattern by a string pattern.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any method
- * name.
- *
- * <p>Mutually exclusive with the property `methodName` also defining method-name.
- *
- * @return The string pattern of the method name.
- */
- StringPattern methodNamePattern() default @StringPattern(exact = "");
-
- /**
- * Define the method return-type pattern by a fully qualified type or 'void'.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnTypeConstant
- * <li>methodReturnTypePattern
- * </ul>
- *
- * @return The qualified type name of the method return type.
- */
- String methodReturnType() default "";
-
- /**
- * Define the method return-type pattern by a class constant.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnType
- * <li>methodReturnTypePattern
- * </ul>
- *
- * @return A class constant denoting the type of the method return type.
- */
- Class<?> methodReturnTypeConstant() default Object.class;
-
- /**
- * Define the method return-type pattern by a type pattern.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any return
- * type.
- *
- * <p>Mutually exclusive with the following other properties defining return-type:
- *
- * <ul>
- * <li>methodReturnType
- * <li>methodReturnTypeConstant
- * </ul>
- *
- * @return The pattern of the method return type.
- */
- TypePattern methodReturnTypePattern() default @TypePattern(name = "");
-
- /**
- * Define the method parameters pattern by a list of fully qualified types.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * parameters.
- *
- * <p>Mutually exclusive with the property `methodParameterTypePatterns` also defining parameters.
- *
- * @return The list of qualified type names of the method parameters.
- */
- String[] methodParameters() default {""};
-
- /**
- * Define the method parameters pattern by a list of patterns on types.
- *
- * <p>Mutually exclusive with all field properties.
- *
- * <p>If none, and other properties define this item as a method, the default matches any
- * parameters.
- *
- * <p>Mutually exclusive with the property `methodParameters` also defining parameters.
- *
- * @return The list of type patterns for the method parameters.
- */
- TypePattern[] methodParameterTypePatterns() default {@TypePattern(name = "")};
-
- /**
- * Define the field-annotated-by pattern by fully qualified class name.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassConstant
- * <li>fieldAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The qualified class name that defines the annotation.
- */
- String fieldAnnotatedByClassName() default "";
-
- /**
- * Define the field-annotated-by pattern by reference to a Class constant.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassName
- * <li>fieldAnnotatedByClassNamePattern
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The class-constant that defines the annotation.
- */
- Class<?> fieldAnnotatedByClassConstant() default Object.class;
-
- /**
- * Define the field-annotated-by pattern by reference to a class-name pattern.
- *
- * <p>Mutually exclusive with the following other properties defining field-annotated-by:
- *
- * <ul>
- * <li>fieldAnnotatedByClassName
- * <li>fieldAnnotatedByClassConstant
- * </ul>
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none are specified the default is to match any field regardless of what the field is
- * annotated by.
- *
- * @return The class-name pattern that defines the annotation.
- */
- ClassNamePattern fieldAnnotatedByClassNamePattern() default
- @ClassNamePattern(unqualifiedName = "");
-
- /**
- * Define the field-access pattern by matching on access flags.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any
- * field-access flags.
- *
- * @return The field access-flag constraints that must be met.
- */
- FieldAccessFlags[] fieldAccess() default {};
-
- /**
- * Define the field-name pattern by an exact field name.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any field
- * name.
- *
- * <p>Mutually exclusive with the property `fieldNamePattern` also defining field-name.
- *
- * @return The exact field name of the field.
- */
- String fieldName() default "";
-
- /**
- * Define the field-name pattern by a string pattern.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any field
- * name.
- *
- * <p>Mutually exclusive with the property `fieldName` also defining field-name.
- *
- * @return The string pattern of the field name.
- */
- StringPattern fieldNamePattern() default @StringPattern(exact = "");
-
- /**
- * Define the field-type pattern by a fully qualified type.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldTypeConstant
- * <li>fieldTypePattern
- * </ul>
- *
- * @return The qualified type name for the field type.
- */
- String fieldType() default "";
-
- /**
- * Define the field-type pattern by a class constant.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldType
- * <li>fieldTypePattern
- * </ul>
- *
- * @return The class constant for the field type.
- */
- Class<?> fieldTypeConstant() default Object.class;
-
- /**
- * Define the field-type pattern by a pattern on types.
- *
- * <p>Mutually exclusive with all method properties.
- *
- * <p>If none, and other properties define this item as a field, the default matches any type.
- *
- * <p>Mutually exclusive with the following other properties defining field-type:
- *
- * <ul>
- * <li>fieldType
- * <li>fieldTypeConstant
- * </ul>
- *
- * @return The type pattern for the field type.
- */
- TypePattern fieldTypePattern() default @TypePattern(name = "");
-}
diff --git a/src/keepanno/java/androidx/annotation/keep/UsedByReflection.kt b/src/keepanno/java/androidx/annotation/keep/UsedByReflection.kt
new file mode 100644
index 0000000..7c9f85f
--- /dev/null
+++ b/src/keepanno/java/androidx/annotation/keep/UsedByReflection.kt
@@ -0,0 +1,636 @@
+/*
+ * Copyright 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// ***********************************************************************************
+// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
+// ***********************************************************************************
+
+// ***********************************************************************************
+// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
+// ***********************************************************************************
+
+package androidx.annotation.keep
+
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
+import kotlin.reflect.KClass
+
+/**
+ * Annotation to mark a class, field or method as being accessed reflectively.
+ *
+ * <p>
+ * Note: Before using this annotation, consider if instead you can annotate the code that is doing
+ * reflection with {@link UsesReflection}. Annotating the reflecting code is generally more clear
+ * and maintainable, and it also naturally gives rise to edges that describe just the reflected
+ * aspects of the program. The {@link UsedByReflection} annotation is suitable for cases where the
+ * reflecting code is not under user control, or in migrating away from rules.
+ *
+ * <p>
+ * When a class is annotated, member patterns can be used to define which members are to be kept.
+ * When no member patterns are specified the default pattern is to match just the class.
+ *
+ * <p>
+ * When a member is annotated, the member patterns cannot be used as the annotated member itself
+ * fully defines the item to be kept (i.e., itself).
+ */
+@Retention(AnnotationRetention.BINARY)
+@Target(
+ AnnotationTarget.CLASS,
+ AnnotationTarget.FIELD,
+ AnnotationTarget.FUNCTION,
+ AnnotationTarget.CONSTRUCTOR,
+)
+annotation class UsedByReflection(
+
+ /**
+ * Optional description to document the reason for this annotation.
+ *
+ * @return The descriptive message. Defaults to no description.
+ */
+ val description: String = "",
+
+ /**
+ * Conditions that should be satisfied for the annotation to be in effect.
+ *
+ * @return The list of preconditions. Defaults to no conditions, thus trivially/unconditionally
+ * satisfied.
+ */
+ val preconditions: Array<KeepCondition> = [],
+
+ /**
+ * Additional targets to be kept in addition to the annotated class/members.
+ *
+ * @return List of additional target consequences. Defaults to no additional target consequences.
+ */
+ val additionalTargets: Array<KeepTarget> = [],
+
+ /**
+ * Specify the kind of this item pattern.
+ *
+ * <p>
+ * If unspecified the default kind depends on the annotated item.
+ *
+ * <p>
+ * When annotating a class the default kind is:
+ * <ul>
+ * <li>{@link KeepItemKind#ONLY_CLASS} if no member patterns are defined;
+ * <li>{@link KeepItemKind#CLASS_AND_METHODS} if method patterns are defined;
+ * <li>{@link KeepItemKind#CLASS_AND_FIELDS} if field patterns are defined;
+ * <li>{@link KeepItemKind#CLASS_AND_MEMBERS} otherwise.
+ * </ul>
+ *
+ * <p>
+ * When annotating a method the default kind is: {@link KeepItemKind#ONLY_METHODS}
+ *
+ * <p>
+ * When annotating a field the default kind is: {@link KeepItemKind#ONLY_FIELDS}
+ *
+ * <p>
+ * It is not possible to use {@link KeepItemKind#ONLY_CLASS} if annotating a member.
+ *
+ * @return The kind for this pattern.
+ */
+ val kind: KeepItemKind = KeepItemKind.DEFAULT,
+
+ /**
+ * Define the usage constraints of the target.
+ *
+ * <p>
+ * The specified constraints must remain valid for the target.
+ *
+ * <p>
+ * The default constraints depend on the kind of the target. For all targets the default
+ * constraints include:
+ * <ul>
+ * <li>{@link KeepConstraint#LOOKUP}
+ * <li>{@link KeepConstraint#NAME}
+ * <li>{@link KeepConstraint#VISIBILITY_RELAX}
+ * </ul>
+ *
+ * <p>
+ * For classes the default constraints also include:
+ * <ul>
+ * <li>{@link KeepConstraint#CLASS_INSTANTIATE}
+ * </ul>
+ *
+ * <p>
+ * For methods the default constraints also include:
+ * <ul>
+ * <li>{@link KeepConstraint#METHOD_INVOKE}
+ * </ul>
+ *
+ * <p>
+ * For fields the default constraints also include:
+ * <ul>
+ * <li>{@link KeepConstraint#FIELD_GET}
+ * <li>{@link KeepConstraint#FIELD_SET}
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with the property `constraintAdditions` also defining constraints.
+ *
+ * @return Usage constraints for the target.
+ */
+ val constraints: Array<KeepConstraint> = [],
+
+ /**
+ * Add additional usage constraints of the target.
+ *
+ * <p>
+ * The specified constraints must remain valid for the target in addition to the default
+ * constraints.
+ *
+ * <p>
+ * The default constraints are documented in {@link #constraints}
+ *
+ * <p>
+ * Mutually exclusive with the property `constraints` also defining constraints.
+ *
+ * @return Additional usage constraints for the target.
+ */
+ val constraintAdditions: Array<KeepConstraint> = [],
+
+ /**
+ * Patterns for annotations that must remain on the item.
+ *
+ * <p>
+ * The annotations matching any of the patterns must remain on the item if the annotation types
+ * remain in the program.
+ *
+ * <p>
+ * Note that if the annotation types themselves are unused/removed, then their references on the
+ * item will be removed too. If the annotation types themselves are used reflectively then they
+ * too need a keep annotation or rule to ensure they remain in the program.
+ *
+ * <p>
+ * By default no annotation patterns are defined and no annotations are required to remain.
+ *
+ * @return Annotation patterns
+ */
+ val constrainAnnotations: Array<AnnotationPattern> = [],
+
+ /**
+ * Define the member-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassConstant
+ * <li>memberAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val memberAnnotatedByClassName: String = "",
+
+ /**
+ * Define the member-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassName
+ * <li>memberAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val memberAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the member-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining member-annotated-by:
+ * <ul>
+ * <li>memberAnnotatedByClassName
+ * <li>memberAnnotatedByClassConstant
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * <p>
+ * If none are specified the default is to match any member regardless of what the member is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val memberAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the member-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all field and method properties as use restricts the match to both
+ * types of members.
+ *
+ * @return The member access-flag constraints that must be met.
+ */
+ val memberAccess: Array<MemberAccessFlags> = [],
+
+ /**
+ * Define the method-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassConstant
+ * <li>methodAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val methodAnnotatedByClassName: String = "",
+
+ /**
+ * Define the method-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassName
+ * <li>methodAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val methodAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the method-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining method-annotated-by:
+ * <ul>
+ * <li>methodAnnotatedByClassName
+ * <li>methodAnnotatedByClassConstant
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none are specified the default is to match any method regardless of what the method is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val methodAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the method-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any
+ * method-access flags.
+ *
+ * @return The method access-flag constraints that must be met.
+ */
+ val methodAccess: Array<MethodAccessFlags> = [],
+
+ /**
+ * Define the method-name pattern by an exact method name.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any method
+ * name.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodNamePattern` also defining method-name.
+ *
+ * @return The exact method name of the method.
+ */
+ val methodName: String = "",
+
+ /**
+ * Define the method-name pattern by a string pattern.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any method
+ * name.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodName` also defining method-name.
+ *
+ * @return The string pattern of the method name.
+ */
+ val methodNamePattern: StringPattern = StringPattern(exact = ""),
+
+ /**
+ * Define the method return-type pattern by a fully qualified type or 'void'.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnTypeConstant
+ * <li>methodReturnTypePattern
+ * </ul>
+ *
+ * @return The qualified type name of the method return type.
+ */
+ val methodReturnType: String = "",
+
+ /**
+ * Define the method return-type pattern by a class constant.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnType
+ * <li>methodReturnTypePattern
+ * </ul>
+ *
+ * @return A class constant denoting the type of the method return type.
+ */
+ val methodReturnTypeConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the method return-type pattern by a type pattern.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any return
+ * type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining return-type:
+ * <ul>
+ * <li>methodReturnType
+ * <li>methodReturnTypeConstant
+ * </ul>
+ *
+ * @return The pattern of the method return type.
+ */
+ val methodReturnTypePattern: TypePattern = TypePattern(name = ""),
+
+ /**
+ * Define the method parameters pattern by a list of fully qualified types.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any parameters.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodParameterTypePatterns` also defining parameters.
+ *
+ * @return The list of qualified type names of the method parameters.
+ */
+ val methodParameters: Array<String> = [""],
+
+ /**
+ * Define the method parameters pattern by a list of patterns on types.
+ *
+ * <p>
+ * Mutually exclusive with all field properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a method, the default matches any parameters.
+ *
+ * <p>
+ * Mutually exclusive with the property `methodParameters` also defining parameters.
+ *
+ * @return The list of type patterns for the method parameters.
+ */
+ val methodParameterTypePatterns: Array<TypePattern> = [TypePattern(name = "")],
+
+ /**
+ * Define the field-annotated-by pattern by fully qualified class name.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassConstant
+ * <li>fieldAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The qualified class name that defines the annotation.
+ */
+ val fieldAnnotatedByClassName: String = "",
+
+ /**
+ * Define the field-annotated-by pattern by reference to a Class constant.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassName
+ * <li>fieldAnnotatedByClassNamePattern
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The class-constant that defines the annotation.
+ */
+ val fieldAnnotatedByClassConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the field-annotated-by pattern by reference to a class-name pattern.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-annotated-by:
+ * <ul>
+ * <li>fieldAnnotatedByClassName
+ * <li>fieldAnnotatedByClassConstant
+ * </ul>
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none are specified the default is to match any field regardless of what the field is
+ * annotated by.
+ *
+ * @return The class-name pattern that defines the annotation.
+ */
+ val fieldAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),
+
+ /**
+ * Define the field-access pattern by matching on access flags.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field-access
+ * flags.
+ *
+ * @return The field access-flag constraints that must be met.
+ */
+ val fieldAccess: Array<FieldAccessFlags> = [],
+
+ /**
+ * Define the field-name pattern by an exact field name.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field name.
+ *
+ * <p>
+ * Mutually exclusive with the property `fieldNamePattern` also defining field-name.
+ *
+ * @return The exact field name of the field.
+ */
+ val fieldName: String = "",
+
+ /**
+ * Define the field-name pattern by a string pattern.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any field name.
+ *
+ * <p>
+ * Mutually exclusive with the property `fieldName` also defining field-name.
+ *
+ * @return The string pattern of the field name.
+ */
+ val fieldNamePattern: StringPattern = StringPattern(exact = ""),
+
+ /**
+ * Define the field-type pattern by a fully qualified type.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldTypeConstant
+ * <li>fieldTypePattern
+ * </ul>
+ *
+ * @return The qualified type name for the field type.
+ */
+ val fieldType: String = "",
+
+ /**
+ * Define the field-type pattern by a class constant.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldType
+ * <li>fieldTypePattern
+ * </ul>
+ *
+ * @return The class constant for the field type.
+ */
+ val fieldTypeConstant: KClass<*> = Object::class,
+
+ /**
+ * Define the field-type pattern by a pattern on types.
+ *
+ * <p>
+ * Mutually exclusive with all method properties.
+ *
+ * <p>
+ * If none, and other properties define this item as a field, the default matches any type.
+ *
+ * <p>
+ * Mutually exclusive with the following other properties defining field-type:
+ * <ul>
+ * <li>fieldType
+ * <li>fieldTypeConstant
+ * </ul>
+ *
+ * @return The type pattern for the field type.
+ */
+ val fieldTypePattern: TypePattern = TypePattern(name = ""),
+)
diff --git a/src/keepanno/java/androidx/annotation/keep/UsesReflection.java b/src/keepanno/java/androidx/annotation/keep/UsesReflection.kt
similarity index 75%
rename from src/keepanno/java/androidx/annotation/keep/UsesReflection.java
rename to src/keepanno/java/androidx/annotation/keep/UsesReflection.kt
index 0d7ca88..ced4530 100644
--- a/src/keepanno/java/androidx/annotation/keep/UsesReflection.java
+++ b/src/keepanno/java/androidx/annotation/keep/UsesReflection.kt
@@ -22,29 +22,29 @@
// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
// ***********************************************************************************
-package androidx.annotation.keep;
+package androidx.annotation.keep
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+import kotlin.annotation.Retention
+import kotlin.annotation.Target
/**
* Annotation to declare the reflective usages made by a class, method or field.
*
- * <p>The annotation's 'value' is a list of targets to be kept if the annotated item is used. The
+ * <p>
+ * The annotation's 'value' is a list of targets to be kept if the annotated item is used. The
* annotated item is a precondition for keeping any of the specified targets. Thus, if an annotated
* method is determined to be unused by the program, the annotation itself will not be in effect and
* the targets will not be kept (assuming nothing else is otherwise keeping them).
*
- * <p>The annotation's 'additionalPreconditions' is optional and can specify additional conditions
- * that should be satisfied for the annotation to be in effect.
+ * <p>
+ * The annotation's 'additionalPreconditions' is optional and can specify additional conditions that
+ * should be satisfied for the annotation to be in effect.
*
- * <p>The translation of the {@link UsesReflection} annotation into a {@link KeepEdge} is as
- * follows:
+ * <p>
+ * The translation of the {@link UsesReflection} annotation into a {@link KeepEdge} is as follows:
*
- * <p>Assume the item of the annotation is denoted by 'CTX' and referred to as its context.
- *
+ * <p>
+ * Assume the item of the annotation is denoted by 'CTX' and referred to as its context.
* <pre>
* @UsesReflection(value = targets, [additionalPreconditions = preconditions])
* ==>
@@ -75,28 +75,33 @@
* }
* </pre>
*/
-@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR})
-@Retention(RetentionPolicy.CLASS)
-public @interface UsesReflection {
+@Retention(AnnotationRetention.BINARY)
+@Target(
+ AnnotationTarget.CLASS,
+ AnnotationTarget.FIELD,
+ AnnotationTarget.FUNCTION,
+ AnnotationTarget.CONSTRUCTOR,
+)
+annotation class UsesReflection(
/**
* Optional description to document the reason for this annotation.
*
* @return The descriptive message. Defaults to no description.
*/
- String description() default "";
+ val description: String = "",
/**
* Consequences that must be kept if the annotation is in effect.
*
* @return The list of target consequences.
*/
- KeepTarget[] value();
+ val value: Array<KeepTarget>,
/**
* Additional preconditions for the annotation to be in effect.
*
* @return The list of additional preconditions. Defaults to no additional preconditions.
*/
- KeepCondition[] additionalPreconditions() default {};
-}
+ val additionalPreconditions: Array<KeepCondition> = [],
+)