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