Support unsigned integers in kotlinx-metadata-jvm
#KT-25371 Fixed
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
# kotlinx-metadata-jvm
|
||||
|
||||
## 0.0.5
|
||||
|
||||
- [`KT-25371`](https://youtrack.jetbrains.com/issue/KT-25371) Support unsigned integers in kotlinx-metadata-jvm
|
||||
|
||||
## 0.0.4
|
||||
|
||||
- [`KT-25920`](https://youtrack.jetbrains.com/issue/KT-25920) Compile kotlinx-metadata-jvm with JVM target bytecode version 1.6 instead of 1.8
|
||||
|
||||
@@ -37,6 +37,11 @@ sealed class KmAnnotationArgument<out T : Any> {
|
||||
data class DoubleValue(override val value: Double) : KmAnnotationArgument<Double>()
|
||||
data class BooleanValue(override val value: Boolean) : KmAnnotationArgument<Boolean>()
|
||||
|
||||
data class UByteValue(override val value: Byte) : KmAnnotationArgument<Byte>()
|
||||
data class UShortValue(override val value: Short) : KmAnnotationArgument<Short>()
|
||||
data class UIntValue(override val value: Int) : KmAnnotationArgument<Int>()
|
||||
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 EnumValue(val enumClassName: ClassName, val enumEntryName: String) : KmAnnotationArgument<String>() {
|
||||
|
||||
@@ -10,6 +10,7 @@ import kotlinx.metadata.KmAnnotation
|
||||
import kotlinx.metadata.KmAnnotationArgument
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf.Annotation.Argument.Value.Type.*
|
||||
import org.jetbrains.kotlin.metadata.deserialization.Flags
|
||||
import org.jetbrains.kotlin.metadata.deserialization.NameResolver
|
||||
|
||||
fun ProtoBuf.Annotation.readAnnotation(strings: NameResolver): KmAnnotation =
|
||||
@@ -22,8 +23,18 @@ fun ProtoBuf.Annotation.readAnnotation(strings: NameResolver): KmAnnotation =
|
||||
}.toMap()
|
||||
)
|
||||
|
||||
private fun ProtoBuf.Annotation.Argument.Value.readAnnotationArgument(strings: NameResolver): KmAnnotationArgument<*>? =
|
||||
when (type) {
|
||||
private fun ProtoBuf.Annotation.Argument.Value.readAnnotationArgument(strings: NameResolver): KmAnnotationArgument<*>? {
|
||||
if (Flags.IS_UNSIGNED[flags]) {
|
||||
return when (type) {
|
||||
BYTE -> KmAnnotationArgument.UByteValue(intValue.toByte())
|
||||
SHORT -> KmAnnotationArgument.UShortValue(intValue.toShort())
|
||||
INT -> KmAnnotationArgument.UIntValue(intValue.toInt())
|
||||
LONG -> KmAnnotationArgument.ULongValue(intValue)
|
||||
else -> error("Cannot read value of unsigned type: $type")
|
||||
}
|
||||
}
|
||||
|
||||
return when (type) {
|
||||
BYTE -> KmAnnotationArgument.ByteValue(intValue.toByte())
|
||||
CHAR -> KmAnnotationArgument.CharValue(intValue.toChar())
|
||||
SHORT -> KmAnnotationArgument.ShortValue(intValue.toShort())
|
||||
@@ -39,6 +50,7 @@ private fun ProtoBuf.Annotation.Argument.Value.readAnnotationArgument(strings: N
|
||||
ARRAY -> KmAnnotationArgument.ArrayValue(arrayElementList.mapNotNull { it.readAnnotationArgument(strings) })
|
||||
null -> null
|
||||
}
|
||||
}
|
||||
|
||||
internal fun NameResolver.getClassName(index: Int): ClassName {
|
||||
val name = getQualifiedClassName(index)
|
||||
|
||||
@@ -10,6 +10,7 @@ import kotlinx.metadata.KmAnnotation
|
||||
import kotlinx.metadata.KmAnnotationArgument
|
||||
import kotlinx.metadata.isLocal
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||
import org.jetbrains.kotlin.metadata.deserialization.Flags
|
||||
import org.jetbrains.kotlin.metadata.serialization.StringTable
|
||||
|
||||
fun KmAnnotation.writeAnnotation(strings: StringTable): ProtoBuf.Annotation.Builder =
|
||||
@@ -58,6 +59,26 @@ private fun KmAnnotationArgument<*>.writeAnnotationArgument(strings: StringTable
|
||||
this.type = ProtoBuf.Annotation.Argument.Value.Type.BOOLEAN
|
||||
this.intValue = if (value) 1 else 0
|
||||
}
|
||||
is KmAnnotationArgument.UByteValue -> {
|
||||
this.type = ProtoBuf.Annotation.Argument.Value.Type.BYTE
|
||||
this.intValue = value.toLong()
|
||||
this.flags = Flags.IS_UNSIGNED.toFlags(true)
|
||||
}
|
||||
is KmAnnotationArgument.UShortValue -> {
|
||||
this.type = ProtoBuf.Annotation.Argument.Value.Type.SHORT
|
||||
this.intValue = value.toLong()
|
||||
this.flags = Flags.IS_UNSIGNED.toFlags(true)
|
||||
}
|
||||
is KmAnnotationArgument.UIntValue -> {
|
||||
this.type = ProtoBuf.Annotation.Argument.Value.Type.INT
|
||||
this.intValue = value.toLong()
|
||||
this.flags = Flags.IS_UNSIGNED.toFlags(true)
|
||||
}
|
||||
is KmAnnotationArgument.ULongValue -> {
|
||||
this.type = ProtoBuf.Annotation.Argument.Value.Type.LONG
|
||||
this.intValue = value.toLong()
|
||||
this.flags = Flags.IS_UNSIGNED.toFlags(true)
|
||||
}
|
||||
is KmAnnotationArgument.StringValue -> {
|
||||
this.type = ProtoBuf.Annotation.Argument.Value.Type.STRING
|
||||
this.stringValue = strings.getStringIndex(value)
|
||||
|
||||
Reference in New Issue
Block a user