Support unsigned integers in kotlinx-metadata-jvm

#KT-25371 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2018-09-13 20:56:55 +03:00
parent dac4cb5d06
commit ed2b9172da
8 changed files with 116 additions and 5 deletions
@@ -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)