diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt index bfab66ed21c..ecf892ef780 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InheritedDefaultMethodsOnClassesLowering.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.backend.common.ir.passTypeArgumentsFrom import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface import org.jetbrains.kotlin.backend.jvm.ir.* import org.jetbrains.kotlin.builtins.StandardNames @@ -260,22 +259,18 @@ private class InterfaceObjectCallsLowering(val context: JvmBackendContext) : IrE * interface implementation should be generated into the class containing the fake override; or null if the given function is not a fake * override of any interface implementation or such method was already generated into the superclass or is a method from Any. */ -private fun isDefaultImplsBridge(f: IrSimpleFunction) = - f.origin == JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE || - f.origin == JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE_TO_SYNTHETIC - internal fun IrSimpleFunction.findInterfaceImplementation(jvmDefaultMode: JvmDefaultMode): IrSimpleFunction? { if (!isFakeOverride) return null parent.let { if (it is IrClass && it.isJvmInterface) return null } - val implementation = resolveFakeOverride(toSkip = ::isDefaultImplsBridge) ?: return null + val implementation = resolveFakeOverride() ?: return null // Only generate interface delegation for functions immediately inherited from an interface. // (Otherwise, delegation will be present in the parent class) if (overriddenSymbols.any { !it.owner.parentAsClass.isInterface && it.owner.modality != Modality.ABSTRACT && - it.owner.resolveFakeOverride(toSkip = ::isDefaultImplsBridge) == implementation + it.owner.resolveFakeOverride() == implementation }) { return null } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt index 5639181114c..20c456a4c2a 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrFakeOverrideUtils.kt @@ -24,36 +24,26 @@ val IrSimpleFunction.target: IrSimpleFunction else resolveFakeOverride() ?: error("Could not resolveFakeOverride() for ${this.render()}") -val IrFunction.target: IrFunction get() = when (this) { - is IrSimpleFunction -> this.target - is IrConstructor -> this - else -> error(this) -} +val IrFunction.target: IrFunction + get() = when (this) { + is IrSimpleFunction -> this.target + is IrConstructor -> this + else -> error(this) + } -fun IrSimpleFunction.collectRealOverrides( - toSkip: (IrSimpleFunction) -> Boolean = { false }, - filter: (IrOverridableMember) -> Boolean = { false } -): Set { - if (isReal && !toSkip(this)) return setOf(this) +fun IrSimpleFunction.collectRealOverrides(filter: (IrOverridableMember) -> Boolean = { false }): Set { + if (isReal) return setOf(this) return this.overriddenSymbols .map { it.owner } - .collectAndFilterRealOverrides( - { - require(it is IrSimpleFunction) { "Expected IrSimpleFunction: ${it.render()}" } - toSkip(it) - }, - filter - ) + .collectAndFilterRealOverrides(filter) .map { it as IrSimpleFunction } .toSet() } fun Collection.collectAndFilterRealOverrides( - toSkip: (IrOverridableMember) -> Boolean = { false }, filter: (IrOverridableMember) -> Boolean = { false } ): Set { - val visited = mutableSetOf() val realOverrides = mutableSetOf() @@ -68,7 +58,7 @@ fun Collection.collectAndFilterRealOverrides( fun collectRealOverrides(member: IrOverridableMember) { if (!visited.add(member) || filter(member)) return - if (member.isReal && !toSkip(member)) { + if (member.isReal) { realOverrides += member } else { overriddenSymbols(member).forEach { collectRealOverrides(it.owner as IrOverridableMember) } @@ -93,13 +83,13 @@ fun Collection.collectAndFilterRealOverrides( } // TODO: use this implementation instead of any other -fun IrSimpleFunction.resolveFakeOverride(allowAbstract: Boolean = false, toSkip: (IrSimpleFunction) -> Boolean = { false }): IrSimpleFunction? { +fun IrSimpleFunction.resolveFakeOverride(allowAbstract: Boolean = false): IrSimpleFunction? { return if (allowAbstract) { - val reals = collectRealOverrides(toSkip) + val reals = collectRealOverrides() if (reals.isEmpty()) error("No real overrides for ${this.render()}") reals.first() } else { - collectRealOverrides(toSkip, { it.modality == Modality.ABSTRACT }) + collectRealOverrides { it.modality == Modality.ABSTRACT } .let { realOverrides -> // Kotlin forbids conflicts between overrides, but they may trickle down from Java. realOverrides.singleOrNull { it.parent.safeAs()?.isInterface != true }