[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(
members: List<FakeOverride>,
current: IrClass
): Modality {
// Optimization: avoid creating hash sets in frequent cases when modality can be computed trivially
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) {
return Modality.OPEN
}
if (!hasOpen && hasAbstract) {
return if (transformAbstractToClassModality) current.modality else Modality.ABSTRACT
return Modality.ABSTRACT
}
val realOverrides = members
.map { it.original }
.collectAndFilterRealOverrides()
return getMinimalModality(realOverrides, transformAbstractToClassModality, current.modality)
return getMinimalModality(realOverrides)
}
private fun getMinimalModality(
members: Collection<IrOverridableMember>,
transformAbstractToClassModality: Boolean,
classModality: Modality
): Modality {
var result = Modality.ABSTRACT
for (member in members) {
val effectiveModality =
if (transformAbstractToClassModality && member.modality === Modality.ABSTRACT) classModality else member.modality
val effectiveModality = member.modality
if (effectiveModality < result) {
result = effectiveModality
}
@@ -334,7 +324,7 @@ class IrFakeOverrideBuilder(
addedFakeOverrides: MutableList<IrOverridableMember>,
compatibilityMode: Boolean
) {
val modality = determineModalityForFakeOverride(overridables, currentClass)
val modality = determineModalityForFakeOverride(overridables)
val visibility = findMemberWithMaxVisibility(overridables).override.visibility
val mostSpecific = selectMostSpecificMember(overridables)