Fix array of KClass annotation arguments in kotlinx-metadata-jvm

#KT-45594 Fixed
This commit is contained in:
Alexander Udalov
2021-03-14 15:38:32 +01:00
parent e2084a180b
commit 1a82158472
7 changed files with 53 additions and 11 deletions
+5 -2
View File
@@ -1,11 +1,14 @@
# kotlinx-metadata-jvm
## 0.2.1
## 0.3.0
- [KT-44783](https://youtrack.jetbrains.com/issue/KT-44783) Add Flag.IS_VALUE for value classes
- Update to Kotlin 1.5 with metadata version 1.5.
Note: metadata of version 1.5 is readable by Kotlin compiler/reflection of versions 1.4 and later.
- [`KT-44783`](https://youtrack.jetbrains.com/issue/KT-44783) Add Flag.IS_VALUE for value classes
- Breaking change: `Flag.IS_INLINE` is deprecated, use `Flag.IS_VALUE` instead
- Breaking change: deprecate `KotlinClassHeader.bytecodeVersion` and `KotlinClassHeader`'s constructor that takes a bytecode version array.
Related to ['KT-41758`](https://youtrack.jetbrains.com/issue/KT-41758).
- [`KT-45594`](https://youtrack.jetbrains.com/issue/KT-45594) KClass annotation argument containing array of classes is not read/written correctly
## 0.2.0
@@ -43,7 +43,11 @@ sealed class KmAnnotationArgument<out T : Any> {
data class ULongValue(override val value: Long) : KmAnnotationArgument<Long>()
data class StringValue(override val value: String) : KmAnnotationArgument<String>()
data class KClassValue(override val value: ClassName) : KmAnnotationArgument<ClassName>()
data class KClassValue(val className: ClassName, val arrayDimensionCount: Int) : KmAnnotationArgument<String>() {
override val value: String = className + "[]".repeat(arrayDimensionCount)
}
data class EnumValue(val enumClassName: ClassName, val enumEntryName: String) : KmAnnotationArgument<String>() {
override val value: String = "$enumClassName.$enumEntryName"
}
@@ -44,7 +44,7 @@ fun ProtoBuf.Annotation.Argument.Value.readAnnotationArgument(strings: NameResol
DOUBLE -> KmAnnotationArgument.DoubleValue(doubleValue)
BOOLEAN -> KmAnnotationArgument.BooleanValue(intValue != 0L)
STRING -> KmAnnotationArgument.StringValue(strings.getString(stringValue))
CLASS -> KmAnnotationArgument.KClassValue(strings.getClassName(classId))
CLASS -> KmAnnotationArgument.KClassValue(strings.getClassName(classId), arrayDimensionCount)
ENUM -> KmAnnotationArgument.EnumValue(strings.getClassName(classId), strings.getString(enumValueId))
ANNOTATION -> KmAnnotationArgument.AnnotationValue(annotation.readAnnotation(strings))
ARRAY -> KmAnnotationArgument.ArrayValue(arrayElementList.mapNotNull { it.readAnnotationArgument(strings) })
@@ -85,7 +85,8 @@ fun KmAnnotationArgument<*>.writeAnnotationArgument(strings: StringTable): Proto
}
is KmAnnotationArgument.KClassValue -> {
this.type = ProtoBuf.Annotation.Argument.Value.Type.CLASS
this.classId = strings.getClassNameIndex(value)
this.classId = strings.getClassNameIndex(className)
this.arrayDimensionCount = this@writeAnnotationArgument.arrayDimensionCount
}
is KmAnnotationArgument.EnumValue -> {
this.type = ProtoBuf.Annotation.Argument.Value.Type.ENUM
@@ -461,7 +461,11 @@ private fun renderAnnotationArgument(arg: KmAnnotationArgument<*>): String =
is KmAnnotationArgument.ULongValue -> arg.value.toULong().toString() + "uL"
is KmAnnotationArgument.BooleanValue -> arg.value.toString()
is KmAnnotationArgument.StringValue -> "\"${arg.value.sanitize(quote = '"')}\""
is KmAnnotationArgument.KClassValue -> "${arg.value}::class"
is KmAnnotationArgument.KClassValue -> buildString {
repeat(arg.arrayDimensionCount) { append("kotlin/Array<") }
append(arg.className).append("::class")
repeat(arg.arrayDimensionCount) { append(">") }
}
is KmAnnotationArgument.EnumValue -> arg.value
is KmAnnotationArgument.AnnotationValue -> arg.value.let { annotation ->
val args = annotation.arguments.entries.joinToString { (name, argument) ->
+12 -2
View File
@@ -29,7 +29,12 @@ annotation class A(
val str: String,
val enum: AnnotationTarget,
val klass: KClass<*>,
val anno: B
val klass2: KClass<*>,
val anno: B,
val stra: Array<String>,
val ka: Array<KClass<*>>,
val ea: Array<AnnotationTarget>,
val aa: Array<B>
)
annotation class B(val value: String)
@@ -66,7 +71,12 @@ class C {
"aba\ncaba'\"\t\u0001\u0002\uA66E",
AnnotationTarget.CLASS,
C::class,
B(value = "aba\ncaba'\"\t\u0001\u0002\uA66E")
IntArray::class,
B(value = "aba\ncaba'\"\t\u0001\u0002\uA66E"),
["lmao"],
[Double::class, Unit::class, LongArray::class, Array<String>::class],
[AnnotationTarget.TYPEALIAS, AnnotationTarget.FIELD],
[B("2"), B(value = "3")]
) Unit {}
fun parameterTypeAnnotation(p: @JvmNamed("Q_Q") Any): Any = p
+23 -3
View File
@@ -3,8 +3,12 @@
public final annotation class A : kotlin/Annotation {
// requires language version 1.3.0 (level=ERROR)
// signature: <init>(ZCBSIFJDLkotlin/UInt;Lkotlin/UByte;Lkotlin/UShort;Lkotlin/ULong;Lkotlin/UInt;Lkotlin/UByte;Lkotlin/UShort;Lkotlin/ULong;[Z[C[B[S[I[F[J[DLjava/lang/String;Lkotlin/annotation/AnnotationTarget;Lkotlin/reflect/KClass;LB;)V
public constructor(z: kotlin/Boolean, c: kotlin/Char, b: kotlin/Byte, s: kotlin/Short, i: kotlin/Int, f: kotlin/Float, j: kotlin/Long, d: kotlin/Double, ui: kotlin/UInt, ub: kotlin/UByte, us: kotlin/UShort, ul: kotlin/ULong, ui_max: kotlin/UInt, ub_max: kotlin/UByte, us_max: kotlin/UShort, ul_max: kotlin/ULong, za: kotlin/BooleanArray, ca: kotlin/CharArray, ba: kotlin/ByteArray, sa: kotlin/ShortArray, ia: kotlin/IntArray, fa: kotlin/FloatArray, ja: kotlin/LongArray, da: kotlin/DoubleArray, str: kotlin/String, enum: kotlin/annotation/AnnotationTarget, klass: kotlin/reflect/KClass<*>, anno: B)
// signature: <init>(ZCBSIFJDLkotlin/UInt;Lkotlin/UByte;Lkotlin/UShort;Lkotlin/ULong;Lkotlin/UInt;Lkotlin/UByte;Lkotlin/UShort;Lkotlin/ULong;[Z[C[B[S[I[F[J[DLjava/lang/String;Lkotlin/annotation/AnnotationTarget;Lkotlin/reflect/KClass;Lkotlin/reflect/KClass;LB;Lkotlin/Array;Lkotlin/Array;Lkotlin/Array;Lkotlin/Array;)V
public constructor(z: kotlin/Boolean, c: kotlin/Char, b: kotlin/Byte, s: kotlin/Short, i: kotlin/Int, f: kotlin/Float, j: kotlin/Long, d: kotlin/Double, ui: kotlin/UInt, ub: kotlin/UByte, us: kotlin/UShort, ul: kotlin/ULong, ui_max: kotlin/UInt, ub_max: kotlin/UByte, us_max: kotlin/UShort, ul_max: kotlin/ULong, za: kotlin/BooleanArray, ca: kotlin/CharArray, ba: kotlin/ByteArray, sa: kotlin/ShortArray, ia: kotlin/IntArray, fa: kotlin/FloatArray, ja: kotlin/LongArray, da: kotlin/DoubleArray, str: kotlin/String, enum: kotlin/annotation/AnnotationTarget, klass: kotlin/reflect/KClass<*>, klass2: kotlin/reflect/KClass<*>, anno: B, stra: kotlin/Array<kotlin/String>, ka: kotlin/Array<kotlin/reflect/KClass<*>>, ea: kotlin/Array<kotlin/annotation/AnnotationTarget>, aa: kotlin/Array<B>)
// getter: aa()[LB;
public final val aa: kotlin/Array<B>
public final get
// getter: anno()LB;
public final val anno: B
@@ -34,6 +38,10 @@ public final annotation class A : kotlin/Annotation {
public final val da: kotlin/DoubleArray
public final get
// getter: ea()[Lkotlin/annotation/AnnotationTarget;
public final val ea: kotlin/Array<kotlin/annotation/AnnotationTarget>
public final get
// getter: enum()Lkotlin/annotation/AnnotationTarget;
public final val enum: kotlin/annotation/AnnotationTarget
public final get
@@ -62,10 +70,18 @@ public final annotation class A : kotlin/Annotation {
public final val ja: kotlin/LongArray
public final get
// getter: ka()[Ljava/lang/Class;
public final val ka: kotlin/Array<kotlin/reflect/KClass<*>>
public final get
// getter: klass()Ljava/lang/Class;
public final val klass: kotlin/reflect/KClass<*>
public final get
// getter: klass2()Ljava/lang/Class;
public final val klass2: kotlin/reflect/KClass<*>
public final get
// getter: s()S
public final val s: kotlin/Short
public final get
@@ -78,6 +94,10 @@ public final annotation class A : kotlin/Annotation {
public final val str: kotlin/String
public final get
// getter: stra()[Ljava/lang/String;
public final val stra: kotlin/Array<kotlin/String>
public final get
// requires language version 1.3.0 (level=ERROR)
// requires compiler version 1.4.30 (level=ERROR)
// requires language version 1.4.0 (level=ERROR)
@@ -168,7 +188,7 @@ public final class C : kotlin/Any {
public final fun parameterTypeAnnotation(p: @JvmNamed(value = "Q_Q") kotlin/Any): kotlin/Any
// signature: returnTypeAnnotation()V
public final fun returnTypeAnnotation(): @A(z = true, c = 'x', b = 1.toByte(), s = 42.toShort(), i = 42424242, f = -2.72f, j = 239239239239239L, d = 3.14, ui = 1u, ub = 255.toUByte(), us = 3.toUShort(), ul = 4uL, ui_max = 4294967295u, ub_max = 255.toUByte(), us_max = 65535.toUShort(), ul_max = 18446744073709551615uL, za = [true], ca = ['\''], ba = [1.toByte()], sa = [42.toShort()], ia = [42424242], fa = [-2.72f], ja = [239239239239239L], da = [3.14], str = "aba\ncaba'\"\t\u0001\u0002ꙮ", enum = kotlin/annotation/AnnotationTarget.CLASS, klass = C::class, anno = B(value = "aba\ncaba'\"\t\u0001\u0002ꙮ")) kotlin/Unit
public final fun returnTypeAnnotation(): @A(z = true, c = 'x', b = 1.toByte(), s = 42.toShort(), i = 42424242, f = -2.72f, j = 239239239239239L, d = 3.14, ui = 1u, ub = 255.toUByte(), us = 3.toUShort(), ul = 4uL, ui_max = 4294967295u, ub_max = 255.toUByte(), us_max = 65535.toUShort(), ul_max = 18446744073709551615uL, za = [true], ca = ['\''], ba = [1.toByte()], sa = [42.toShort()], ia = [42424242], fa = [-2.72f], ja = [239239239239239L], da = [3.14], str = "aba\ncaba'\"\t\u0001\u0002ꙮ", enum = kotlin/annotation/AnnotationTarget.CLASS, klass = C::class, klass2 = kotlin/IntArray::class, anno = B(value = "aba\ncaba'\"\t\u0001\u0002ꙮ"), stra = ["lmao"], ka = [kotlin/Double::class, kotlin/Unit::class, kotlin/LongArray::class, kotlin/Array<kotlin/String::class>], ea = [kotlin/annotation/AnnotationTarget.TYPEALIAS, kotlin/annotation/AnnotationTarget.FIELD], aa = [B(value = "2"), B(value = "3")]) kotlin/Unit
// module name: test-module
}