[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:
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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user