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 b70d443634f..5194427581c 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 @@ -7,17 +7,15 @@ import org.jetbrains.kotlin.codegen.CompilationException import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.builders.* -import org.jetbrains.kotlin.ir.declarations.IrAnonymousInitializer -import org.jetbrains.kotlin.ir.declarations.IrClass -import org.jetbrains.kotlin.ir.declarations.IrProperty -import org.jetbrains.kotlin.ir.declarations.IrValueParameter +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl -import org.jetbrains.kotlin.ir.util.SymbolTable -import org.jetbrains.kotlin.ir.util.TypeTranslator +import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny @@ -103,10 +101,22 @@ class SerializableIrGenerator( irClass.declarations.asSequence() .filterIsInstance() .forEach { initializer -> - initializer.body.statements.forEach { +it } + initializer.body.statements.forEach { +it.deepCopyWithSymbols(initialParent = ctor) } } } + // todo: this is copypaste from DeepCopyIrWithSymbols.kt, + // remove after KT-18563 is fixed and bootstrap updated. + private inline fun T.deepCopyWithSymbols( + initialParent: IrDeclarationParent? = null, + descriptorRemapper: DescriptorsRemapper = DescriptorsRemapper.Default + ): T { + val symbolRemapper = DeepCopySymbolRemapper(descriptorRemapper) + acceptVoid(symbolRemapper) + val typeRemapper = DeepCopyTypeRemapper(symbolRemapper) + return transform(DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper), null).patchDeclarationParents(initialParent) as T + } + private fun IrBlockBodyBuilder.generateSuperNonSerializableCall(superClass: ClassDescriptor) { val suitableCtor = superClass.constructors.singleOrNull { it.valueParameters.size == 0 } ?: throw IllegalArgumentException("Non-serializable parent of serializable $serializableDescriptor must have no arg constructor")