Don't issue a warning about expect/actual in the same module for incompatible expect/actual pairs

^KT-57067 Fixed
Review: https://jetbrains.team/p/kt/reviews/9123
This commit is contained in:
Nikita Bobko
2023-03-06 14:24:20 +01:00
committed by Space Team
parent 3d0bca5ca1
commit 62d2327ca3
8 changed files with 94 additions and 5 deletions
@@ -13,6 +13,7 @@ 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
@@ -27,7 +28,9 @@ object ExpectActualInTheSameModuleChecker : DeclarationChecker {
// Only look for top level actual members; class members will be handled as a part of that expected class
if (descriptor.containingDeclaration !is PackageFragmentDescriptor) return
val module = descriptor.module
val actuals = ExpectedActualResolver.findActualForExpected(descriptor, module)?.flatMap { it.value }
val actuals = ExpectedActualResolver.findActualForExpected(descriptor, module)
?.filter { (compatibility, _) -> compatibility.isCompatibleOrWeakCompatible() }
?.flatMap { (_, members) -> members }
?.takeIf(List<MemberDescriptor>::isNotEmpty) ?: return
// There are 4 cases:
@@ -329,10 +329,6 @@ class ExpectedActualDeclarationChecker(
}
}
private fun ExpectActualCompatibility<MemberDescriptor>.isCompatibleOrWeakCompatible() =
this is Compatible ||
this is Incompatible && kind == IncompatibilityKind.WEAK
// we don't require `actual` modifier on
// - annotation constructors, because annotation classes can only have one constructor
// - inline class primary constructors, because inline class must have primary constructor
@@ -399,6 +395,10 @@ class ExpectedActualDeclarationChecker(
companion object {
fun Map<out ExpectActualCompatibility<MemberDescriptor>, Collection<MemberDescriptor>>.allStrongIncompatibilities(): Boolean =
this.keys.all { it is Incompatible && it.kind == IncompatibilityKind.STRONG }
internal fun ExpectActualCompatibility<MemberDescriptor>.isCompatibleOrWeakCompatible() =
this is Compatible ||
this is Incompatible && kind == IncompatibilityKind.WEAK
}
}