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:
committed by
Space Team
parent
d5b59c48c2
commit
d08c9ba222
+4
@@ -79,6 +79,8 @@ abstract class SingleAbstractMethodLowering(val context: CommonBackendContext) :
|
||||
|
||||
open val inInlineFunctionScope get() = allScopes.any { scope -> (scope.irElement as? IrFunction)?.isInline ?: false }
|
||||
|
||||
protected open fun postprocessCreatedObjectProxy(klass: IrClass) {}
|
||||
|
||||
override fun lower(irFile: IrFile) {
|
||||
cachedImplementations.clear()
|
||||
inlineCachedImplementations.clear()
|
||||
@@ -248,6 +250,8 @@ abstract class SingleAbstractMethodLowering(val context: CommonBackendContext) :
|
||||
ignoredParentSymbols = listOf(transformedSuperMethod.symbol)
|
||||
)
|
||||
|
||||
postprocessCreatedObjectProxy(subclass)
|
||||
|
||||
return subclass
|
||||
}
|
||||
|
||||
|
||||
+11
-4
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1311,12 +1311,11 @@ fun IrClass.addFakeOverrides(
|
||||
implementedMembers: List<IrOverridableMember> = emptyList(),
|
||||
ignoredParentSymbols: List<IrSymbol> = emptyList()
|
||||
) {
|
||||
IrFakeOverrideBuilder(typeSystem, BindToNewEmptySymbols, emptyList())
|
||||
.buildFakeOverridesForClassUsingOverriddenSymbols(this,
|
||||
implementedMembers = implementedMembers,
|
||||
compatibilityMode = false,
|
||||
ignoredParentSymbols = ignoredParentSymbols)
|
||||
.forEach { addChild(it) }
|
||||
val fakeOverrides = IrFakeOverrideBuilder(typeSystem, BindToNewEmptySymbols, emptyList())
|
||||
.buildFakeOverridesForClassUsingOverriddenSymbols(this, implementedMembers, compatibilityMode = false, ignoredParentSymbols)
|
||||
for (fakeOverride in fakeOverrides) {
|
||||
addChild(fakeOverride)
|
||||
}
|
||||
}
|
||||
|
||||
fun IrFactory.createStaticFunctionWithReceivers(
|
||||
|
||||
Reference in New Issue
Block a user