IR: do not build fake overrides for static members if not needed

This is kind of another fix for KT-65456, independent from the one in
the previous commit. Here we restore the old behavior of
`buildFakeOverridesForClassUsingOverriddenSymbols`, which is used in
places where fake overrides for static declarations from
superclasses are not necessary at all, such as SAM adapters or
annotation implementation classes.
This commit is contained in:
Alexander Udalov
2024-02-01 15:11:10 +01:00
committed by Space Team
parent a22c16e745
commit b28339e8bc
@@ -109,7 +109,7 @@ class IrFakeOverrideBuilder(
val superClass = superType.getClass() ?: error("Unexpected super type: $superType")
superClass.declarations
.filterIsInstanceAnd<IrOverridableMember> {
it !in overriddenMembers && it.symbol !in ignoredParentSymbols
it !in overriddenMembers && it.symbol !in ignoredParentSymbols && !it.isStaticMember
}
.mapNotNull { overriddenMember ->
val fakeOverride = strategy.fakeOverrideMember(superType, overriddenMember, clazz) ?: return@mapNotNull null
@@ -125,6 +125,16 @@ class IrFakeOverrideBuilder(
return fakeOverrides
}
private val IrOverridableMember.isStaticMember: Boolean
get() = when (this) {
is IrFunction ->
dispatchReceiverParameter == null
is IrProperty ->
backingField?.isStatic == true ||
getter?.let { it.dispatchReceiverParameter == null } == true
else -> error("Unknown overridable member: ${render()}")
}
private fun generateOverridesInFunctionGroup(
membersFromSupertypes: List<FakeOverride>,
membersFromCurrent: List<IrOverridableMember>,