diff --git a/plugins/kotlinx-serialization/testData/firMembers/serializableWith.fir.txt b/plugins/kotlinx-serialization/testData/firMembers/serializableWith.fir.txt new file mode 100644 index 00000000000..92c6cd67c98 --- /dev/null +++ b/plugins/kotlinx-serialization/testData/firMembers/serializableWith.fir.txt @@ -0,0 +1,93 @@ +FILE: serializableWith.kt + public final object IntHolderAsStringSerializer : R|kotlinx/serialization/KSerializer| { + private constructor(): R|IntHolderAsStringSerializer| { + super() + } + + public final override val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor| = R|kotlinx/serialization/descriptors/PrimitiveSerialDescriptor|(String(IntHolder), Q|kotlinx/serialization/descriptors/PrimitiveKind.STRING|) + public get(): R|kotlinx/serialization/descriptors/SerialDescriptor| + + public final override fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|IntHolder|): R|kotlin/Unit| { + R|/encoder|.R|kotlinx/serialization/encoding/Encoder.encodeString|(R|/value|.R|/IntHolder.value|.R|kotlin/Int.toString|()) + } + + public final override fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|IntHolder| { + lval string: R|kotlin/String| = R|/decoder|.R|kotlinx/serialization/encoding/Decoder.decodeString|() + ^deserialize R|/IntHolder.IntHolder|(R|/string|.R|kotlin/text/toInt|()) + } + + } + public final object ObjectSerializer : R|kotlinx/serialization/KSerializer| { + private constructor(): R|ObjectSerializer| { + super() + } + + public final override val descriptor: R|kotlinx/serialization/descriptors/SerialDescriptor| = R|kotlinx/serialization/descriptors/PrimitiveSerialDescriptor|(String(SerializableObject), Q|kotlinx/serialization/descriptors/PrimitiveKind.STRING|) + public get(): R|kotlinx/serialization/descriptors/SerialDescriptor| + + public final override fun serialize(encoder: R|kotlinx/serialization/encoding/Encoder|, value: R|SerializableObject|): R|kotlin/Unit| { + R|/encoder|.R|kotlinx/serialization/encoding/Encoder.encodeString|(String(obj)) + } + + public final override fun deserialize(decoder: R|kotlinx/serialization/encoding/Decoder|): R|SerializableObject| { + R|/decoder|.R|kotlinx/serialization/encoding/Decoder.decodeString|() + ^deserialize Q|SerializableObject| + } + + } + @R|kotlinx/serialization/Serializable|(with = (Q|IntHolderAsStringSerializer|)) public final class IntHolder : R|kotlin/Any| { + public constructor(value: R|kotlin/Int|): R|IntHolder| { + super() + } + + public final val value: R|kotlin/Int| = R|/value| + public get(): R|kotlin/Int| + + public final companion object Companion : R|kotlin/Any| { + public final fun serializer(): R|kotlinx/serialization/KSerializer| + + private constructor(): R|IntHolder.Companion| + + } + + } + @R|kotlinx/serialization/Serializable|(with = (Q|ObjectSerializer|)) public final object SerializableObject : R|kotlin/Any| { + private constructor(): R|SerializableObject| { + super() + } + + public final fun serializer(): R|kotlinx/serialization/KSerializer| + + } + public final fun box(): R|kotlin/String| { + lval holder: R|IntHolder| = R|/IntHolder.IntHolder|(Int(42)) + lval encoded: R|kotlin/String| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.encodeToString|(Q|IntHolder|.R|/IntHolder.Companion.serializer|(), R|/holder|) + when () { + !=(R|/encoded|, String("42")) -> { + ^box R|/encoded| + } + } + + lval decoded: R|IntHolder| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.decodeFromString|(Q|IntHolder|.R|/IntHolder.Companion.serializer|(), R|/encoded|) + when () { + !=(R|/decoded|.R|/IntHolder.value|, R|/holder|.R|/IntHolder.value|) -> { + ^box String(Incorrect value) + } + } + + lval encodedObject: R|kotlin/String| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.encodeToString|(Q|SerializableObject|.R|/SerializableObject.serializer|(), Q|SerializableObject|) + when () { + !=(R|/encodedObject|, String("obj")) -> { + ^box R|/encodedObject| + } + } + + lval decodedObject: R|SerializableObject| = Q|kotlinx/serialization/json/Json|.R|kotlinx/serialization/json/Json.decodeFromString|(Q|SerializableObject|.R|/SerializableObject.serializer|(), R|/encodedObject|) + when () { + !=(R|/decodedObject|, Q|SerializableObject|) -> { + ^box String(Incorrect object instance) + } + } + + ^box String(OK) + } diff --git a/plugins/kotlinx-serialization/testData/firMembers/serializableWith.kt b/plugins/kotlinx-serialization/testData/firMembers/serializableWith.kt new file mode 100644 index 00000000000..07230296738 --- /dev/null +++ b/plugins/kotlinx-serialization/testData/firMembers/serializableWith.kt @@ -0,0 +1,56 @@ +// WITH_STDLIB + +import kotlinx.serialization.* +import kotlinx.serialization.json.* +import kotlinx.serialization.encoding.* +import kotlinx.serialization.descriptors.* + + +object IntHolderAsStringSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("IntHolder", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: IntHolder) { + encoder.encodeString(value.value.toString()) + } + + override fun deserialize(decoder: Decoder): IntHolder { + val string = decoder.decodeString() + return IntHolder(string.toInt()) + } +} + +object ObjectSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("SerializableObject", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: SerializableObject) { + encoder.encodeString("obj") + } + + override fun deserialize(decoder: Decoder): SerializableObject { + decoder.decodeString() + return SerializableObject + } +} + +@Serializable(with = IntHolderAsStringSerializer::class) +class IntHolder(val value: Int) + +@Serializable(with = ObjectSerializer::class) +object SerializableObject + +fun box(): String { + val holder = IntHolder(42) + + val encoded = Json.encodeToString(IntHolder.serializer(), holder) + if (encoded != "\"42\"") return encoded + val decoded = Json.decodeFromString(IntHolder.serializer(), encoded) + if (decoded.value != holder.value) return "Incorrect value" + + val encodedObject = Json.encodeToString(SerializableObject.serializer(), SerializableObject) + if (encodedObject != "\"obj\"") return encodedObject + val decodedObject = Json.decodeFromString(SerializableObject.serializer(), encodedObject) + if (decodedObject != SerializableObject) return "Incorrect object instance" + + + return "OK" +} diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java index 073e836120b..22483070c47 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java @@ -144,5 +144,11 @@ public class SerializationFirBlackBoxTestGenerated extends AbstractSerialization public void testSerializableObject() throws Exception { runTest("plugins/kotlinx-serialization/testData/firMembers/serializableObject.kt"); } + + @Test + @TestMetadata("serializableWith.kt") + public void testSerializableWith() throws Exception { + runTest("plugins/kotlinx-serialization/testData/firMembers/serializableWith.kt"); + } } } diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirDiagnosticTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirDiagnosticTestGenerated.java index a5b89402cb2..736babbe2fe 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirDiagnosticTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirDiagnosticTestGenerated.java @@ -191,5 +191,11 @@ public class SerializationFirDiagnosticTestGenerated extends AbstractSerializati public void testSerializableObject() throws Exception { runTest("plugins/kotlinx-serialization/testData/firMembers/serializableObject.kt"); } + + @Test + @TestMetadata("serializableWith.kt") + public void testSerializableWith() throws Exception { + runTest("plugins/kotlinx-serialization/testData/firMembers/serializableWith.kt"); + } } }