diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt index 1a8c88a0f0d..a7a67365278 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt @@ -327,7 +327,7 @@ interface IrBuilderExtension { fun KotlinType.toIrType() = compilerContext.typeTranslator.translateType(this) // note: this method should be used only for properties from current module. Fields from other modules are private and inaccessible. - val SerializableProperty.irField: IrField get() = compilerContext.symbolTable.referenceField(this.descriptor).owner + val SerializableProperty.irField: IrField? get() = compilerContext.symbolTable.referenceField(this.descriptor).let { if (it.isBound) it.owner else null } fun IrClass.searchForProperty(descriptor: PropertyDescriptor): IrProperty { // this API is used to reference both current module descriptors and external ones (because serializable class can be in any of them), @@ -1260,11 +1260,12 @@ interface IrBuilderExtension { // check for call to .shouldEncodeElementDefault val encodeDefaults = property.getIrPropertyFrom(serializableIrClass).getEncodeDefaultAnnotationValue() - if (!property.optional || encodeDefaults == true) { + val field = property.irField // Nullable when property from another module; can't compare it with default value on JS or Native + if (!property.optional || encodeDefaults == true || field == null) { // emit call right away +elementCall } else { - val partB = irNotEquals(property.irGet(), initializerAdapter(property.irField.initializer!!)) + val partB = irNotEquals(property.irGet(), initializerAdapter(field.initializer!!)) val condition = if (encodeDefaults == false) { // drop default without call to .shouldEncodeElementDefault diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt index 828a36fb77a..e12f1fbf61a 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt @@ -141,7 +141,7 @@ class SerializableIrGenerator( val ifNotSeenExpr: IrExpression = if (prop.optional) { val initializerBody = - requireNotNull(initializerAdapter(prop.irField.initializer!!)) { "Optional value without an initializer" } // todo: filter abstract here + requireNotNull(initializerAdapter(prop.irField?.initializer!!)) { "Optional value without an initializer" } // todo: filter abstract here irSetField(irGet(thiz), backingFieldToAssign, initializerBody) } else { // property required