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(