From abb8e5e914bb9bfc5f95aaf376d2de20aa8b96ea Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Mon, 8 Oct 2018 17:25:14 +0300 Subject: [PATCH] Support @Transient properties initializers and init blocks in IR plugin --- .../backend/ir/SerializableIrGenerator.kt | 23 +++++++++++++------ 1 file changed, 16 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 13b5f96d389..89d77348445 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 @@ -8,8 +8,10 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ParameterDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor 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.IrField +import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl @@ -90,13 +92,20 @@ class SerializableIrGenerator( // todo: transient initializers and init blocks // remaining initalizers of variables -// val serialDescs = properties.serializableProperties.map { it.descriptor }.toSet() -// irClass.declarations.asSequence() -// .filterIsInstance() -// .filter { it.descriptor !in serialDescs } -// .filter { it.backingField != null } -// .mapNotNull { prop -> prop.backingField!!.initializer?.let { prop to it.expression } } -// .forEach { (prop, expr) -> +irSetField(irGet(thiz), prop.backingField!!, expr) } + val serialDescs = properties.serializableProperties.map { it.descriptor }.toSet() + irClass.declarations.asSequence() + .filterIsInstance() + .filter { it.descriptor !in serialDescs } + .filter { it.backingField != null } + .mapNotNull { prop -> transformFieldInitializer(prop.backingField!!)?.let { prop to it } } + .forEach { (prop, expr) -> +irSetField(irGet(thiz), prop.backingField!!, expr) } + + // init blocks + irClass.declarations.asSequence() + .filterIsInstance() + .forEach { initializer -> + initializer.body.statements.forEach { +it } + } } override fun generateWriteSelfMethod(methodDescriptor: FunctionDescriptor) {