diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt index 59334939952..45c8f839e49 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt @@ -398,9 +398,17 @@ abstract class BaseIrGenerator(private val currentClass: IrClass, final override val kSerializerType = kSerializerClass.typeWith(compilerContext.irBuiltIns.anyType) val arrayType = compilerContext.irBuiltIns.arrayClass.typeWith(kSerializerType) - return addValPropertyWithJvmFieldInitializer(arrayType, SerialEntityNames.CACHED_CHILD_SERIALIZERS_PROPERTY_NAME) { + val property = addValPropertyWithJvmFieldInitializer(arrayType, SerialEntityNames.CACHED_CHILD_SERIALIZERS_PROPERTY_NAME) { createArrayOfExpression(kSerializerType, cacheableSerializers.map { it ?: irNull() }) } + + if (declarations.removeIf { declaration -> declaration === property }) { + // adding the property very first because children can be used even in first constructor + declarations.add(0, property) + } + + + return property } /** diff --git a/plugins/kotlinx-serialization/testData/boxIr/caching.kt b/plugins/kotlinx-serialization/testData/boxIr/caching.kt index 04c0e469222..bac772946eb 100644 --- a/plugins/kotlinx-serialization/testData/boxIr/caching.kt +++ b/plugins/kotlinx-serialization/testData/boxIr/caching.kt @@ -32,6 +32,18 @@ sealed class SealedListGeneric { var holder = GenericHolder>>() } +@Serializable +class AccessFromCompanion(@Contextual val category: Any) { + companion object { + init { + serializer().descriptor.getElementDescriptor(0).isNullable + } + var isNullable = serializer().descriptor.getElementDescriptor(0).isNullable + val isNullable2 = serializer().descriptor.getElementDescriptor(0).isNullable + } +} + + fun box(): String { // A correctly cached class must be initialized correctly in order to exclude cyclic nesting of caches Plain.serializer() @@ -40,6 +52,7 @@ fun box(): String { Abstract.serializer() SealedGeneric.serializer() SealedListGeneric.serializer() + AccessFromCompanion("any") return "OK" }