Fix array of KClass annotation arguments in kotlinx-metadata-jvm
#KT-45594 Fixed
This commit is contained in:
@@ -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
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user