JVM IR: generate delegates to DefaultImpls for fun interfaces

This commit is contained in:
Alexander Udalov
2020-05-01 18:58:45 +02:00
parent fc1217ba07
commit 6adad1055b
7 changed files with 16 additions and 16 deletions
@@ -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)
@@ -367,7 +367,7 @@ abstract class AbstractSuspendFunctionsLowering<C : CommonBackendContext>(val co
}
coroutineClass.superTypes += superTypes
coroutineClass.addFakeOverrides()
coroutineClass.addFakeOverridesViaIncorrectHeuristic()
initializeStateMachine(coroutineConstructors, coroutineClassThis)
@@ -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
}
@@ -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)
@@ -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 {