From 90bf36ea7a109e7a21afaf79b19571128e3329a9 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Tue, 23 Apr 2019 16:22:26 +0300 Subject: [PATCH] Fix reference to IrField when serializing superclass' properties --- .../compiler/backend/ir/SerializerIrGenerator.kt | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt index 5ed7712dcc2..d17eeec12a9 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt @@ -216,10 +216,19 @@ class SerializerIrGenerator(val irClass: IrClass, override val compilerContext: } // can it be done in more concise way? e.g. additional builder function? call.dispatchReceiver = irGet(saveFunc.valueParameters[0]) - val serialObjectSymbol = saveFunc.valueParameters[1] + val objectToSerialize = saveFunc.valueParameters[1] val localOutput = irTemporary(call, "output") - fun SerializableProperty.irGet(): IrGetField = irGetField(irGet(serialObjectSymbol), irField) + fun SerializableProperty.irGet(): IrGetField { + val ownerType = (descriptor.containingDeclaration as? ClassDescriptor)?.defaultType?.toIrType() ?: + throw IllegalStateException("Serializable property must be contained in class") + return irGetField( + irGet( + type = ownerType, + variable = objectToSerialize.symbol + ), irField + ) + } // internal serialization via virtual calls? for ((index, property) in serializableProperties.filter { !it.transient }.withIndex()) {