[IRFakeOverrides] Do not override modality in expect classes

It was a workaround for case, where expect class don't have
override of abstract function. We don't allow it anymore,
so it can be dropped to make correct modality comparation.

^KT-65971
This commit is contained in:
Pavel Kunyavskiy
2024-02-20 16:10:09 +01:00
committed by Space Team
parent 21ae6e46b7
commit 9bbf15c14a
@@ -264,7 +264,6 @@ class IrFakeOverrideBuilder(
private fun determineModalityForFakeOverride( private fun determineModalityForFakeOverride(
members: List<FakeOverride>, members: List<FakeOverride>,
current: IrClass
): Modality { ): Modality {
// Optimization: avoid creating hash sets in frequent cases when modality can be computed trivially // Optimization: avoid creating hash sets in frequent cases when modality can be computed trivially
var hasOpen = false var hasOpen = false
@@ -278,34 +277,25 @@ class IrFakeOverrideBuilder(
} }
} }
// Fake overrides of abstract members in non-abstract expected classes should not be abstract, because otherwise it would be
// impossible to inherit a non-expected class from that expected class in common code.
// We're making their modality that of the containing class, because this is the least confusing behavior for the users.
// However, it may cause problems if we reuse resolution results of common code when compiling platform code (see KT-15220)
val transformAbstractToClassModality =
current.isExpect && current.modality !== Modality.ABSTRACT && current.modality !== Modality.SEALED
if (hasOpen && !hasAbstract) { if (hasOpen && !hasAbstract) {
return Modality.OPEN return Modality.OPEN
} }
if (!hasOpen && hasAbstract) { if (!hasOpen && hasAbstract) {
return if (transformAbstractToClassModality) current.modality else Modality.ABSTRACT return Modality.ABSTRACT
} }
val realOverrides = members val realOverrides = members
.map { it.original } .map { it.original }
.collectAndFilterRealOverrides() .collectAndFilterRealOverrides()
return getMinimalModality(realOverrides, transformAbstractToClassModality, current.modality) return getMinimalModality(realOverrides)
} }
private fun getMinimalModality( private fun getMinimalModality(
members: Collection<IrOverridableMember>, members: Collection<IrOverridableMember>,
transformAbstractToClassModality: Boolean,
classModality: Modality
): Modality { ): Modality {
var result = Modality.ABSTRACT var result = Modality.ABSTRACT
for (member in members) { for (member in members) {
val effectiveModality = val effectiveModality = member.modality
if (transformAbstractToClassModality && member.modality === Modality.ABSTRACT) classModality else member.modality
if (effectiveModality < result) { if (effectiveModality < result) {
result = effectiveModality result = effectiveModality
} }
@@ -334,7 +324,7 @@ class IrFakeOverrideBuilder(
addedFakeOverrides: MutableList<IrOverridableMember>, addedFakeOverrides: MutableList<IrOverridableMember>,
compatibilityMode: Boolean compatibilityMode: Boolean
) { ) {
val modality = determineModalityForFakeOverride(overridables, currentClass) val modality = determineModalityForFakeOverride(overridables)
val visibility = findMemberWithMaxVisibility(overridables).override.visibility val visibility = findMemberWithMaxVisibility(overridables).override.visibility
val mostSpecific = selectMostSpecificMember(overridables) val mostSpecific = selectMostSpecificMember(overridables)