Merge "Add missing XAnnotationValue#asChar method" into androidx-main am: b6be5c2722

Original change: https://android-review.googlesource.com/c/platform/frameworks/support/+/2141501

Change-Id: I76f7cc53d5e27981e3660f9b04dec9dda05188a6
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/InternalXAnnotationValue.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/InternalXAnnotationValue.kt
index 92e456b8..4315bee 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/InternalXAnnotationValue.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/InternalXAnnotationValue.kt
@@ -26,7 +26,7 @@
      * distinguish between `String` and `String[]` you can check `valueType.isArray()`.
      */
     private enum class Kind {
-        BOOLEAN, INT, SHORT, LONG, FLOAT, DOUBLE, BYTE, STRING, ENUM, ANNOTATION, TYPE;
+        BOOLEAN, INT, SHORT, LONG, FLOAT, DOUBLE, BYTE, CHAR, STRING, ENUM, ANNOTATION, TYPE;
         companion object {
             fun of(type: XType): Kind {
                 if (type.isArray()) {
@@ -40,6 +40,7 @@
                     type.typeName == TypeName.FLOAT -> FLOAT
                     type.typeName == TypeName.DOUBLE -> DOUBLE
                     type.typeName == TypeName.BYTE -> BYTE
+                    type.typeName == TypeName.CHAR -> CHAR
                     type.typeName == InternalXAnnotationValue.STRING -> STRING
                     type.typeName.rawTypeName() == CLASS -> TYPE
                     type.typeName.rawTypeName() == KCLASS -> TYPE
@@ -120,6 +121,12 @@
     /** Returns true if the value is a list of [Double] */
     final override fun hasDoubleListValue() = kind == Kind.DOUBLE && hasListValue()
 
+    /** Returns true if the value is an [Char] */
+    final override fun hasCharValue() = kind == Kind.CHAR && !hasListValue()
+
+    /** Returns true if the value is a list of [Char] */
+    final override fun hasCharListValue() = kind == Kind.CHAR && hasListValue()
+
     /** Returns true if the value is an [Byte] */
     final override fun hasByteValue() = kind == Kind.BYTE && !hasListValue()
 
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotationValue.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotationValue.kt
index db883c9..b85213b 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotationValue.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotationValue.kt
@@ -170,6 +170,18 @@
     /** Returns the value as a list of [Byte]. */
     fun asByteList(): List<Byte> = asAnnotationValueList().map { it.asByte() }
 
+    /** Returns true if the value is an [Char] */
+    fun hasCharValue(): Boolean
+
+    /** Returns the value as a [Char]. */
+    fun asChar(): Char = value as Char
+
+    /** Returns true if the value is a list of [Char] */
+    fun hasCharListValue(): Boolean
+
+    /** Returns the value as a list of [Char]. */
+    fun asCharList(): List<Char> = asAnnotationValueList().map { it.asChar() }
+
     /** Returns true if the value is a list. */
     fun hasListValue(): Boolean
 
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationValueTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationValueTest.kt
index ad0c9ee..78f29d7 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationValueTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationValueTest.kt
@@ -476,6 +476,64 @@
     }
 
     @Test
+    fun testCharValue() {
+        runTest(
+            javaSource = Source.java(
+                "MyClass",
+                """
+                @interface MyAnnotation {
+                    char charParam();
+                    char[] charArrayParam();
+                    char[] charVarArgsParam(); // There's no varargs in java so use array
+                }
+                @MyAnnotation(
+                    charParam = '1',
+                    charArrayParam = {'2', '3', '4'},
+                    charVarArgsParam = {'5', '6', '7'}
+                )
+                class MyClass {}
+                """.trimIndent()
+            ) as Source.JavaSource,
+            kotlinSource = Source.kotlin(
+                "MyClass.kt",
+                """
+                annotation class MyAnnotation(
+                    val charParam: Char,
+                    val charArrayParam: CharArray,
+                    vararg val charVarArgsParam: Char,
+                )
+                @MyAnnotation(
+                    charParam = '1',
+                    charArrayParam = ['2', '3', '4'],
+                    charVarArgsParam = ['5', '6', '7'],
+                )
+                class MyClass
+                """.trimIndent()
+            ) as Source.KotlinSource
+        ) { invocation ->
+            val annotation = invocation.processingEnv.requireTypeElement("MyClass")
+                .getAllAnnotations()
+                .single { it.name == "MyAnnotation" }
+
+            val charParam = annotation.getAnnotationValue("charParam")
+            assertThat(charParam.hasCharValue()).isTrue()
+            assertThat(charParam.asChar()).isEqualTo('1')
+
+            val charArrayParam = annotation.getAnnotationValue("charArrayParam")
+            assertThat(charArrayParam.hasCharListValue()).isTrue()
+            assertThat(charArrayParam.asCharList())
+                .containsExactly('2', '3', '4')
+                .inOrder()
+
+            val charVarArgsParam = annotation.getAnnotationValue("charVarArgsParam")
+            assertThat(charVarArgsParam.hasCharListValue()).isTrue()
+            assertThat(charVarArgsParam.asCharList())
+                .containsExactly('5', '6', '7')
+                .inOrder()
+        }
+    }
+
+    @Test
     fun testStringValue() {
         runTest(
             javaSource = Source.java(