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
This commit is contained in:
+17
-7
@@ -7,17 +7,15 @@ import org.jetbrains.kotlin.codegen.CompilationException
|
|||||||
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.builders.*
|
import org.jetbrains.kotlin.ir.builders.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrAnonymousInitializer
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
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.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl
|
import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl
|
||||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.ir.util.TypeTranslator
|
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||||
import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
|
import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny
|
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny
|
||||||
@@ -103,10 +101,22 @@ class SerializableIrGenerator(
|
|||||||
irClass.declarations.asSequence()
|
irClass.declarations.asSequence()
|
||||||
.filterIsInstance<IrAnonymousInitializer>()
|
.filterIsInstance<IrAnonymousInitializer>()
|
||||||
.forEach { initializer ->
|
.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 <reified T : IrElement> 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) {
|
private fun IrBlockBodyBuilder.generateSuperNonSerializableCall(superClass: ClassDescriptor) {
|
||||||
val suitableCtor = superClass.constructors.singleOrNull { it.valueParameters.size == 0 }
|
val suitableCtor = superClass.constructors.singleOrNull { it.valueParameters.size == 0 }
|
||||||
?: throw IllegalArgumentException("Non-serializable parent of serializable $serializableDescriptor must have no arg constructor")
|
?: throw IllegalArgumentException("Non-serializable parent of serializable $serializableDescriptor must have no arg constructor")
|
||||||
|
|||||||
Reference in New Issue
Block a user