From cec37cf78a6563ee70c853d46b908734a3a76a0c Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Mon, 19 Aug 2019 14:09:22 +0300 Subject: [PATCH] Add supertype type arguments to super() call in deserialization ctor #KT-31619 fixed Fixes https://github.com/Kotlin/kotlinx.serialization/issues/525 --- .../backend/ir/SerializableIrGenerator.kt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) 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 cd5272e80b5..c4c36d9f6c7 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 @@ -15,6 +15,9 @@ import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.IrValueParameter import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl +import org.jetbrains.kotlin.ir.types.IrSimpleType +import org.jetbrains.kotlin.ir.types.IrTypeProjection +import org.jetbrains.kotlin.ir.types.classOrNull import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.TypeTranslator import org.jetbrains.kotlin.ir.util.patchDeclarationParents @@ -111,13 +114,24 @@ class SerializableIrGenerator( val suitableCtor = superClass.constructors.singleOrNull { it.valueParameters.size == 0 } ?: throw IllegalArgumentException("Non-serializable parent of serializable $serializableDescriptor must have no arg constructor") val ctorRef = compilerContext.externalSymbols.referenceConstructor(suitableCtor) - +IrDelegatingConstructorCallImpl( + val call = IrDelegatingConstructorCallImpl( startOffset, endOffset, compilerContext.irBuiltIns.unitType, ctorRef, suitableCtor ) + call.insertTypeArgumentsForSuperClass(superClass) + +call + } + + private fun IrDelegatingConstructorCallImpl.insertTypeArgumentsForSuperClass(superClass: ClassDescriptor) { + val superTypeCallArguments = (irClass.superTypes.find { it.classOrNull?.descriptor == superClass } as? IrSimpleType)?.arguments + superTypeCallArguments?.forEachIndexed { index, irTypeArgument -> + val argType = + irTypeArgument as? IrTypeProjection ?: throw IllegalStateException("Star projection in immediate argument for supertype") + putTypeArgument(index, argType.type) + } } // returns offset in serializable properties array @@ -141,6 +155,7 @@ class SerializableIrGenerator( superCtorRef.owner.descriptor ) arguments.forEachIndexed { index, parameter -> call.putValueArgument(index, irGet(parameter)) } + call.insertTypeArgumentsForSuperClass(superClass) +call return superProperties.size }