JVM IR: transform fake override properties in SAM adapters

Replace every property with its getter and setter. This is needed
because later on, JVM backend assumes that all properties have been
lowered (by JvmPropertiesLowering) to this state.

 #KT-64116 Fixed
This commit is contained in:
Alexander Udalov
2024-01-02 15:32:07 +01:00
committed by Space Team
parent d5b59c48c2
commit d08c9ba222
24 changed files with 167 additions and 10 deletions
@@ -18,14 +18,12 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.declarations.IrFunctionBuilder
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrTypeOperatorCall
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.getClass
import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities
import org.jetbrains.kotlin.utils.filterIsInstanceAnd
internal val singleAbstractMethodPhase = makeIrFilePhase(
::JvmSingleAbstractMethodLowering,
@@ -67,4 +65,13 @@ private class JvmSingleAbstractMethodLowering(context: JvmBackendContext) : Sing
override val IrType.needEqualsHashCodeMethods
get() = isKotlinFunInterface || isJavaSamConversionWithEqualsHashCode
override fun postprocessCreatedObjectProxy(klass: IrClass) {
val fakeOverrideProperties = klass.declarations.filterIsInstanceAnd(IrProperty::isFakeOverride)
klass.declarations.removeAll(fakeOverrideProperties)
for (property in fakeOverrideProperties) {
property.getter?.let(klass.declarations::add)
property.setter?.let(klass.declarations::add)
}
}
}