JVM IR: generate delegates to DefaultImpls for fun interfaces
This commit is contained in:
@@ -485,7 +485,7 @@ val IrFunction.allParameters: List<IrValueParameter>
|
||||
explicitParameters
|
||||
}
|
||||
|
||||
fun IrClass.addFakeOverrides(implementedMembers: List<IrSimpleFunction> = emptyList()) {
|
||||
fun IrClass.addFakeOverridesViaIncorrectHeuristic(implementedMembers: List<IrSimpleFunction> = emptyList()) {
|
||||
fun IrDeclaration.toList() = when (this) {
|
||||
is IrSimpleFunction -> listOf(this)
|
||||
is IrProperty -> listOfNotNull(getter, setter)
|
||||
@@ -519,7 +519,7 @@ fun IrClass.addFakeOverrides(implementedMembers: List<IrSimpleFunction> = emptyL
|
||||
IrDeclarationOrigin.FAKE_OVERRIDE,
|
||||
IrSimpleFunctionSymbolImpl(descriptor),
|
||||
irFunction.name,
|
||||
Visibilities.INHERITED,
|
||||
Visibilities.PUBLIC,
|
||||
irFunction.modality,
|
||||
irFunction.returnType,
|
||||
isInline = irFunction.isInline,
|
||||
@@ -531,7 +531,7 @@ fun IrClass.addFakeOverrides(implementedMembers: List<IrSimpleFunction> = emptyL
|
||||
isOperator = irFunction.isOperator
|
||||
).apply {
|
||||
descriptor.bind(this)
|
||||
parent = this@addFakeOverrides
|
||||
parent = this@addFakeOverridesViaIncorrectHeuristic
|
||||
overriddenSymbols = overriddenFunctions.map { it.symbol }
|
||||
copyParameterDeclarationsFrom(irFunction)
|
||||
copyAttributes(irFunction)
|
||||
|
||||
+1
-1
@@ -367,7 +367,7 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
|
||||
}
|
||||
|
||||
coroutineClass.superTypes += superTypes
|
||||
coroutineClass.addFakeOverrides()
|
||||
coroutineClass.addFakeOverridesViaIncorrectHeuristic()
|
||||
|
||||
initializeStateMachine(coroutineConstructors, coroutineClassThis)
|
||||
|
||||
|
||||
+2
-2
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.backend.common.lower
|
||||
import org.jetbrains.kotlin.backend.common.CommonBackendContext
|
||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
|
||||
import org.jetbrains.kotlin.backend.common.ir.addFakeOverrides
|
||||
import org.jetbrains.kotlin.backend.common.ir.addFakeOverridesViaIncorrectHeuristic
|
||||
import org.jetbrains.kotlin.backend.common.ir.copyTo
|
||||
import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
@@ -215,7 +215,7 @@ abstract class SingleAbstractMethodLowering(val context: CommonBackendContext) :
|
||||
|
||||
generateEqualsHashCode(subclass, superType, field)
|
||||
|
||||
subclass.addFakeOverrides()
|
||||
subclass.addFakeOverridesViaIncorrectHeuristic()
|
||||
|
||||
return subclass
|
||||
}
|
||||
|
||||
+1
-1
@@ -468,7 +468,7 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
|
||||
coroutineClass.superTypes += coroutineBaseClass.defaultType
|
||||
}
|
||||
|
||||
coroutineClass.addFakeOverrides(implementedMembers)
|
||||
coroutineClass.addFakeOverridesViaIncorrectHeuristic(implementedMembers)
|
||||
|
||||
// TODO: to meet PIR lower model constructor modification shouldn't be performed here
|
||||
initializeStateMachine(listOf(coroutineConstructor), coroutineClassThis)
|
||||
|
||||
+8
-7
@@ -7,10 +7,7 @@ package org.jetbrains.kotlin.backend.jvm.lower
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
|
||||
import org.jetbrains.kotlin.backend.common.ir.copyTo
|
||||
import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor
|
||||
import org.jetbrains.kotlin.backend.common.ir.isSuspend
|
||||
import org.jetbrains.kotlin.backend.common.ir.moveBodyTo
|
||||
import org.jetbrains.kotlin.backend.common.ir.*
|
||||
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
||||
@@ -150,10 +147,11 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
|
||||
private val adaptedReferenceOriginalTarget: IrFunction? = adapteeCall?.symbol?.owner
|
||||
private val isAdaptedReference = adaptedReferenceOriginalTarget != null
|
||||
|
||||
private val isKotlinFunInterface =
|
||||
samSuperType != null && samSuperType.getClass()?.origin != IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
|
||||
|
||||
private val needToGenerateSamEqualsHashCodeMethods =
|
||||
samSuperType != null &&
|
||||
samSuperType.getClass()?.origin != IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB &&
|
||||
(isAdaptedReference || !isLambda)
|
||||
isKotlinFunInterface && (isAdaptedReference || !isLambda)
|
||||
|
||||
private val superType =
|
||||
samSuperType ?: when {
|
||||
@@ -229,6 +227,9 @@ internal class FunctionReferenceLowering(private val context: JvmBackendContext)
|
||||
if (needToGenerateSamEqualsHashCodeMethods) {
|
||||
generateSamEqualsHashCodeMethods(boundReceiverVar)
|
||||
}
|
||||
if (isKotlinFunInterface) {
|
||||
functionReferenceClass.addFakeOverridesViaIncorrectHeuristic()
|
||||
}
|
||||
|
||||
+functionReferenceClass
|
||||
+irCall(constructor.symbol).apply {
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// !LANGUAGE: +NewInference +FunctionalInterfaceConversion +SamConversionPerArgument +SamConversionForKotlinFunctions
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// SKIP_DCE_DRIVEN
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// IGNORE_BACKEND: JVM_IR, JS_IR
|
||||
// IGNORE_BACKEND: JS_IR
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
|
||||
interface I {
|
||||
|
||||
Reference in New Issue
Block a user