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