diff --git a/libraries/kotlinx-metadata/jvm/ChangeLog.md b/libraries/kotlinx-metadata/jvm/ChangeLog.md index ca13e1205c7..20bea14f5b9 100644 --- a/libraries/kotlinx-metadata/jvm/ChangeLog.md +++ b/libraries/kotlinx-metadata/jvm/ChangeLog.md @@ -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 diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/annotations.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/annotations.kt index cdc2f1bdc6a..132adaf815c 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/annotations.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/annotations.kt @@ -43,7 +43,11 @@ sealed class KmAnnotationArgument { data class ULongValue(override val value: Long) : KmAnnotationArgument() data class StringValue(override val value: String) : KmAnnotationArgument() - data class KClassValue(override val value: ClassName) : KmAnnotationArgument() + + data class KClassValue(val className: ClassName, val arrayDimensionCount: Int) : KmAnnotationArgument() { + override val value: String = className + "[]".repeat(arrayDimensionCount) + } + data class EnumValue(val enumClassName: ClassName, val enumEntryName: String) : KmAnnotationArgument() { override val value: String = "$enumClassName.$enumEntryName" } diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readUtils.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readUtils.kt index e807fbbc122..7fb1dfc6f15 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readUtils.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/readUtils.kt @@ -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) }) diff --git a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writeUtils.kt b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writeUtils.kt index b76c0453c44..5023b0103b0 100644 --- a/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writeUtils.kt +++ b/libraries/kotlinx-metadata/src/kotlinx/metadata/impl/writeUtils.kt @@ -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 diff --git a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt index 82d157328c1..3607d314a19 100644 --- a/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt +++ b/libraries/tools/kotlinp/src/org/jetbrains/kotlin/kotlinp/printers.kt @@ -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) -> diff --git a/libraries/tools/kotlinp/testData/Annotations.kt b/libraries/tools/kotlinp/testData/Annotations.kt index 799cf094fca..8e2e35df12e 100644 --- a/libraries/tools/kotlinp/testData/Annotations.kt +++ b/libraries/tools/kotlinp/testData/Annotations.kt @@ -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, + val ka: Array>, + val ea: Array, + val aa: Array ) 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::class], + [AnnotationTarget.TYPEALIAS, AnnotationTarget.FIELD], + [B("2"), B(value = "3")] ) Unit {} fun parameterTypeAnnotation(p: @JvmNamed("Q_Q") Any): Any = p diff --git a/libraries/tools/kotlinp/testData/Annotations.txt b/libraries/tools/kotlinp/testData/Annotations.txt index 94c37648cea..433b46073ac 100644 --- a/libraries/tools/kotlinp/testData/Annotations.txt +++ b/libraries/tools/kotlinp/testData/Annotations.txt @@ -3,8 +3,12 @@ public final annotation class A : kotlin/Annotation { // requires language version 1.3.0 (level=ERROR) - // signature: (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: (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, ka: kotlin/Array>, ea: kotlin/Array, aa: kotlin/Array) + + // getter: aa()[LB; + public final val aa: kotlin/Array + 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 + 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> + 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 + 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], ea = [kotlin/annotation/AnnotationTarget.TYPEALIAS, kotlin/annotation/AnnotationTarget.FIELD], aa = [B(value = "2"), B(value = "3")]) kotlin/Unit // module name: test-module }