diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt index 047dacedde9..a4c87c3dcc1 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrOverridingUtil.kt @@ -144,7 +144,6 @@ class IrOverridingUtil( fun buildFakeOverridesForClass(clazz: IrClass, oldSignatures: Boolean) { val superTypes = clazz.superTypes - @Suppress("UNCHECKED_CAST") val fromCurrent = clazz.declarations.filterIsInstance() val allFromSuper = superTypes.flatMap { superType -> @@ -275,8 +274,8 @@ class IrOverridingUtil( ) { val fromSuper = notOverridden.toMutableSet() while (fromSuper.isNotEmpty()) { - val notOverriddenFromSuper = findMemberWithMaxVisibility(fromSuper) - val overridables = extractMembersOverridableInBothWays( + val notOverriddenFromSuper: IrOverridableMember = findMemberWithMaxVisibility(filterOutCustomizedFakeOverrides(fromSuper)) + val overridables: Collection = extractMembersOverridableInBothWays( notOverriddenFromSuper, fromSuper ) @@ -284,6 +283,19 @@ class IrOverridingUtil( } } + /** + * If there is a mix of [IrOverridableMember]s with origin=[IrDeclarationOrigin.FAKE_OVERRIDE]s (true "fake overrides") + * and [IrOverridableMember]s that were customized with the help of [IrUnimplementedOverridesStrategy] (customized "fake overrides"), + * then leave only true ones. Rationale: They should point to non-abstract callable members in one of super classes, so + * effectively they are implemented in the current class. + */ + private fun filterOutCustomizedFakeOverrides(overridableMembers: Collection): Collection { + if (overridableMembers.size < 2) return overridableMembers + + val (trueFakeOverrides, customizedFakeOverrides) = overridableMembers.partition { it.origin == IrDeclarationOrigin.FAKE_OVERRIDE } + return trueFakeOverrides.ifEmpty { customizedFakeOverrides } + } + private fun filterVisibleFakeOverrides(toFilter: Collection): Collection { return toFilter.filter { member: IrOverridableMember -> !DescriptorVisibilities.isPrivate(member.visibility) && member.visibility != DescriptorVisibilities.INVISIBLE_FAKE