diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt index 0a75506a395..e4d92d964f3 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt @@ -66,11 +66,9 @@ open class SerializerIrGenerator( SerialEntityNames.SERIAL_DESC_FIELD ) { true }?.takeIf { it.isFromPlugin(compilerContext.afterK2) } - protected val anySerialDescProperty = getProperty( + protected val irAnySerialDescProperty = getProperty( SerialEntityNames.SERIAL_DESC_FIELD, - ) { true } // remove true? - - protected val irAnySerialDescProperty = anySerialDescProperty + ) { true } fun getProperty( name: String, @@ -83,13 +81,16 @@ open class SerializerIrGenerator( private set // child serializers cached if serializable class is internal - private val cachedChildSerializersProperty = if (isGeneratedSerializer) - serializableIrClass.companionObject()?.properties?.singleOrNull { it.name == CACHED_CHILD_SERIALIZERS_PROPERTY_NAME } - else null + private val cachedChildSerializersProperty by lazy { + if (isGeneratedSerializer) + serializableIrClass.companionObject()?.properties?.singleOrNull { it.name == CACHED_CHILD_SERIALIZERS_PROPERTY_NAME } + else null + } // non-object serializers which can be cached - private val cacheableChildSerializers = + private val cacheableChildSerializers by lazy { serializableIrClass.createCachedChildSerializers(properties.serializableProperties).map { it != null } + } // null if was not found — we're in FIR private fun findLocalSerializersFieldDescriptors(): List { @@ -230,7 +231,12 @@ open class SerializerIrGenerator( val allSerializers = serializableProperties.mapIndexed { index, property -> requireNotNull( - serializerTower(this@SerializerIrGenerator, irFun.dispatchReceiverParameter!!, property, cachedChildSerializerByIndex(index)) + serializerTower( + this@SerializerIrGenerator, + irFun.dispatchReceiverParameter!!, + property, + cachedChildSerializerByIndex(index) + ) ) { "Property ${property.name} must have a serializer" } } diff --git a/plugins/kotlinx-serialization/testData/boxIr/externalSerialierJava.kt b/plugins/kotlinx-serialization/testData/boxIr/externalSerialierJava.kt index e3e735616dd..5405da70aee 100644 --- a/plugins/kotlinx-serialization/testData/boxIr/externalSerialierJava.kt +++ b/plugins/kotlinx-serialization/testData/boxIr/externalSerialierJava.kt @@ -25,4 +25,4 @@ object URLSerializer : KSerializer { fun box(): String { if (URLSerializer.descriptor.toString() != "PrimitiveDescriptor(java.net.URL)") return URLSerializer.descriptor.toString() return "OK" -} \ No newline at end of file +} diff --git a/plugins/kotlinx-serialization/testData/boxIr/externalSerializerForClassWithNonSerializableType.kt b/plugins/kotlinx-serialization/testData/boxIr/externalSerializerForClassWithNonSerializableType.kt new file mode 100644 index 00000000000..45e2815e805 --- /dev/null +++ b/plugins/kotlinx-serialization/testData/boxIr/externalSerializerForClassWithNonSerializableType.kt @@ -0,0 +1,30 @@ +// TARGET_BACKEND: JVM_IR + +// FULL_JDK +// WITH_STDLIB + +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.* +import kotlinx.serialization.encoding.* +import java.math.BigDecimal + +@Serializable(with = DataBigDecimal.Serializer::class) +data class DataBigDecimal(val value: BigDecimal) { + + @kotlinx.serialization.Serializer(forClass = DataBigDecimal::class) + object Serializer : KSerializer { + + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("my.DataBigDecimal", PrimitiveKind.STRING) + + override fun deserialize(decoder: Decoder): DataBigDecimal = + TODO() + + override fun serialize(encoder: Encoder, value: DataBigDecimal): Unit = + TODO() + } +} + +fun box(): String { + if (DataBigDecimal.Serializer.descriptor.toString() != "PrimitiveDescriptor(my.DataBigDecimal)") return DataBigDecimal.Serializer.descriptor.toString() + return "OK" +} diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirLightTreeBlackBoxTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirLightTreeBlackBoxTestGenerated.java index 0859f60b835..b88db08cbca 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirLightTreeBlackBoxTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirLightTreeBlackBoxTestGenerated.java @@ -81,6 +81,12 @@ public class SerializationFirLightTreeBlackBoxTestGenerated extends AbstractSeri runTest("plugins/kotlinx-serialization/testData/boxIr/externalSerialierJava.kt"); } + @Test + @TestMetadata("externalSerializerForClassWithNonSerializableType.kt") + public void testExternalSerializerForClassWithNonSerializableType() throws Exception { + runTest("plugins/kotlinx-serialization/testData/boxIr/externalSerializerForClassWithNonSerializableType.kt"); + } + @Test @TestMetadata("generatedClassifiersViaLibraryDependency.kt") public void testGeneratedClassifiersViaLibraryDependency() throws Exception { diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java index 5a6df348563..5dd4777432a 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrBoxTestGenerated.java @@ -79,6 +79,12 @@ public class SerializationIrBoxTestGenerated extends AbstractSerializationIrBoxT runTest("plugins/kotlinx-serialization/testData/boxIr/externalSerialierJava.kt"); } + @Test + @TestMetadata("externalSerializerForClassWithNonSerializableType.kt") + public void testExternalSerializerForClassWithNonSerializableType() throws Exception { + runTest("plugins/kotlinx-serialization/testData/boxIr/externalSerializerForClassWithNonSerializableType.kt"); + } + @Test @TestMetadata("generatedClassifiersViaLibraryDependency.kt") public void testGeneratedClassifiersViaLibraryDependency() throws Exception {