From 190f7c4d306fffcdc56d809276a8316b673b990a Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 6 Sep 2023 10:56:45 +0200 Subject: [PATCH] [frontend] refactoring, reuse `org.jetbrains.kotlin.resolve.multiplatform.isCompatibleOrWeakCompatible` to avoid code duplication --- .../FirExpectActualDeclarationChecker.kt | 7 ++----- .../checkers/ExpectActualInTheSameModuleChecker.kt | 4 ++-- .../checkers/ExpectedActualDeclarationChecker.kt | 13 +++++-------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt index 71a67defad1..b655f2659e5 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.resolve.calls.mpp.AbstractExpectActualAnnotationMatc import org.jetbrains.kotlin.resolve.checkers.OptInNames import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility.* +import org.jetbrains.kotlin.resolve.multiplatform.isCompatibleOrWeaklyIncompatible @Suppress("DuplicatedCode") object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { @@ -205,7 +206,7 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { ) { val filesWithAtLeastWeaklyCompatibleExpects = compatibility.asSequence() .filter { (compatibility, _) -> - compatibility.isCompatibleOrWeakCompatible() + compatibility.isCompatibleOrWeaklyIncompatible } .map { (_, members) -> members } .flatten() @@ -273,10 +274,6 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { return keys.all { it is Incompatible.StrongIncompatible } } - private fun ExpectActualCompatibility>.isCompatibleOrWeakCompatible(): Boolean { - return this is Compatible || this is Incompatible.WeakIncompatible - } - // we don't require `actual` modifier on // - annotation constructors, because annotation classes can only have one constructor // - value class primary constructors, because value class must have primary constructor diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectActualInTheSameModuleChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectActualInTheSameModuleChecker.kt index 73f54ce9f49..ee66652fcb3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectActualInTheSameModuleChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectActualInTheSameModuleChecker.kt @@ -13,10 +13,10 @@ import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.platform.isCommon import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration -import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker.Companion.isCompatibleOrWeakCompatible import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver import org.jetbrains.kotlin.resolve.multiplatform.isCommonSource +import org.jetbrains.kotlin.resolve.multiplatform.isCompatibleOrWeaklyIncompatible import org.jetbrains.kotlin.resolve.source.KotlinSourceElement object ExpectActualInTheSameModuleChecker : DeclarationChecker { @@ -29,7 +29,7 @@ object ExpectActualInTheSameModuleChecker : DeclarationChecker { if (descriptor.containingDeclaration !is PackageFragmentDescriptor) return val module = descriptor.module val actuals = ExpectedActualResolver.findActualForExpected(descriptor, module) - ?.filter { (compatibility, _) -> compatibility.isCompatibleOrWeakCompatible() } + ?.filter { (compatibility, _) -> compatibility.isCompatibleOrWeaklyIncompatible } ?.flatMap { (_, members) -> members } ?.takeIf(List::isNotEmpty) ?: return diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt index 05339f39f33..a731009d31a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt @@ -125,7 +125,7 @@ class ExpectedActualDeclarationChecker( context: DeclarationCheckerContext ) { val actualMembers = actuals - .filter { (compatibility, _) -> compatibility.isCompatibleOrWeakCompatible() } + .filter { (compatibility, _) -> compatibility.isCompatibleOrWeaklyIncompatible } .flatMap { (_, members) -> members } .takeIf(List::isNotEmpty) ?: return @@ -149,7 +149,7 @@ class ExpectedActualDeclarationChecker( trace: BindingTrace, ) { val atLeastWeaklyCompatibleActuals = actuals - .filterKeys { compatibility -> compatibility.isCompatibleOrWeakCompatible() } + .filterKeys { compatibility -> compatibility.isCompatibleOrWeaklyIncompatible } .values.flatten() // Eagerly return here: We won't find a duplicate in any module path in this case @@ -217,7 +217,7 @@ class ExpectedActualDeclarationChecker( // Here we have exactly one compatible actual and/or some weakly incompatible. In either case, we don't report anything on expect... val actualMembers = actuals.asSequence() - .filter { it.key.isCompatibleOrWeakCompatible() }.flatMap { it.value.asSequence() } + .filter { it.key.isCompatibleOrWeaklyIncompatible }.flatMap { it.value.asSequence() } // ...except diagnostics regarding missing actual keyword, because in that case we won't start looking for the actual at all if (checkActualModifier) { @@ -305,7 +305,7 @@ class ExpectedActualDeclarationChecker( // For top-level declaration missing actual error reported in Actual checker if (checkActualModifier && descriptor.containingDeclaration !is PackageFragmentDescriptor - && compatibility.any { it.key.isCompatibleOrWeakCompatible() } + && compatibility.any { it.key.isCompatibleOrWeaklyIncompatible } ) { reportMissingActualModifier(descriptor, reportOn, trace) } @@ -392,7 +392,7 @@ class ExpectedActualDeclarationChecker( ) { val filesWithAtLeastWeaklyCompatibleExpects = compatibility.asSequence() .filter { (compatibility, _) -> - compatibility.isCompatibleOrWeakCompatible() + compatibility.isCompatibleOrWeaklyIncompatible } .map { (_, members) -> members } .flatten() @@ -505,9 +505,6 @@ class ExpectedActualDeclarationChecker( companion object { fun Map, Collection>.allStrongIncompatibilities(): Boolean = this.keys.all { it is Incompatible.StrongIncompatible } - - internal fun ExpectActualCompatibility.isCompatibleOrWeakCompatible() = - this is Compatible || this is Incompatible.WeakIncompatible } }