From d3a596e3c2a7177ba333425d46229e8c591f836b Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Mon, 3 Jun 2019 19:43:51 +0300 Subject: [PATCH] Correctly copy init blocks code to deserialization constructor Fixes https://github.com/JetBrains/kotlin-native/issues/3019 Workaround problem with proguard and inline reified functions --- .../backend/ir/SerializableIrGenerator.kt | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) 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")