From 9bbf15c14a0e0dadc1369dfcbcdccc5b1d5a9a20 Mon Sep 17 00:00:00 2001 From: Pavel Kunyavskiy Date: Tue, 20 Feb 2024 16:10:09 +0100 Subject: [PATCH] [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 --- .../ir/overrides/IrFakeOverrideBuilder.kt | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrFakeOverrideBuilder.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrFakeOverrideBuilder.kt index 5ecd7d4d84b..75a0fb79ef4 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrFakeOverrideBuilder.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrFakeOverrideBuilder.kt @@ -264,7 +264,6 @@ class IrFakeOverrideBuilder( private fun determineModalityForFakeOverride( members: List, - 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, - 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, compatibilityMode: Boolean ) { - val modality = determineModalityForFakeOverride(overridables, currentClass) + val modality = determineModalityForFakeOverride(overridables) val visibility = findMemberWithMaxVisibility(overridables).override.visibility val mostSpecific = selectMostSpecificMember(overridables)