Prioritize @Serializable annotation on type usage over class usage

In `val p: @Serializable(X) Foo` and `@Serializable(Y) class Foo` situation,
now X would be chosen as serializer.

Fixes https://github.com/Kotlin/kotlinx.serialization/issues/1895
This commit is contained in:
Leonid Startsev
2022-09-27 19:46:08 +02:00
committed by Space Team
parent d2d13c8765
commit 242b83edbd
7 changed files with 82 additions and 13 deletions
@@ -0,0 +1,56 @@
// TARGET_BACKEND: JVM_IR
// WITH_STDLIB
import kotlinx.serialization.*
import kotlinx.serialization.json.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.*
import kotlinx.serialization.internal.*
@Serializable(BruhSerializerA::class)
class Bruh(val s: String)
object BruhSerializerA : KSerializer<Bruh> {
override val descriptor: SerialDescriptor
get() = PrimitiveSerialDescriptor("Bruh", PrimitiveKind.STRING)
override fun serialize(encoder: Encoder, value: Bruh) {
encoder.encodeString(value.s)
}
override fun deserialize(decoder: Decoder): Bruh {
return Bruh(decoder.decodeString())
}
}
object BruhSerializerB : KSerializer<Bruh> {
override val descriptor: SerialDescriptor
get() = PrimitiveSerialDescriptor("Bruh", PrimitiveKind.STRING)
override fun serialize(encoder: Encoder, value: Bruh) {
encoder.encodeString(value.s + "#")
}
override fun deserialize(decoder: Decoder): Bruh {
return Bruh(decoder.decodeString().removeSuffix("#"))
}
}
typealias BruhAlias = @Serializable(BruhSerializerB::class) Bruh
@Serializable
class Tester(
val b1: Bruh,
@Serializable(BruhSerializerB::class) val b2: Bruh,
val b3: @Serializable(BruhSerializerB::class) Bruh,
val b4: BruhAlias
)
fun box(): String {
val t = Tester(Bruh("a"), Bruh("b"), Bruh("c"), Bruh("d"))
val s = Json.encodeToString(t)
if (s != """{"b1":"a","b2":"b#","b3":"c#","b4":"d#"}""") return s
return "OK"
}