[FIR] 2/2 AbstractExpectActualChecker & FirExpectActualResolver: don't match with private expect callables
^KT-68674 Fixed
Review: https://jetbrains.team/p/kt/reviews/16291/timeline
== Related issue: KT-68688
Test for the related case (private constructor) is already presented
compiler/testData/diagnostics/tests/multiplatform/sealedClassWithPrivateConstructor.kt
== Alternative fix
Prohibit matching with privates in AbstractExpectActualMatcher. It's a
worse fix because IDE navigation between declarations will break
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt
index 7b802f0..0700423 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualResolver.kt
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.resolve.transformers.mpp
+import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirExpectActualMatchingContext
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.ExpectForActualMatchingData
@@ -60,8 +61,9 @@
}
val transitiveDependsOn = actualSymbol.moduleData.allDependsOnDependencies
candidates.filter { expectSymbol ->
- actualSymbol != expectSymbol && (expectContainingClass != null /*match fake overrides*/ ||
- expectSymbol.isExpect && expectSymbol.moduleData in transitiveDependsOn)
+ actualSymbol != expectSymbol &&
+ (expectContainingClass != null && expectSymbol.visibility != Visibilities.Private /*match non-private fake overrides*/ ||
+ expectSymbol.isExpect && expectSymbol.moduleData in transitiveDependsOn)
}.groupBy { expectDeclaration ->
AbstractExpectActualMatcher.getCallablesMatchingCompatibility(
expectDeclaration,
diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualChecker.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualChecker.kt
index b660b92..d6a7a11 100644
--- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualChecker.kt
+++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualChecker.kt
@@ -182,7 +182,9 @@
val actualMembersByName = actualClassSymbol.collectAllMembers(isActualDeclaration = true).groupBy { nameOf(it) }
- outer@ for (expectMember in expectClassSymbol.collectAllMembers(isActualDeclaration = false)) {
+ val expectMembers = expectClassSymbol.collectAllMembers(isActualDeclaration = false)
+ .filterNot { it is CallableSymbolMarker && it.visibility == Visibilities.Private }
+ for (expectMember in expectMembers) {
val actualMembers = getPossibleActualsByExpectName(expectMember, actualMembersByName)
val matched = matchSingleExpectAgainstPotentialActuals(
diff --git a/compiler/testData/diagnostics/tests/multiplatform/privateExpectFakeOverride_incompatibleReturnType.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/privateExpectFakeOverride_incompatibleReturnType.fir.kt
deleted file mode 100644
index 9b44a5c..0000000
--- a/compiler/testData/diagnostics/tests/multiplatform/privateExpectFakeOverride_incompatibleReturnType.fir.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-// MODULE: m1-common
-// FILE: common.kt
-// ISSUE: KT-68674
-abstract class BaseClass(private val x: String)
-
-expect class ExpectClass : BaseClass {}
-
-// MODULE: m2-jvm()()(m1-common)
-// FILE: jvm.kt
-actual class ExpectClass(val <!ACTUAL_WITHOUT_EXPECT!>x<!>: Int) : BaseClass(x.toString())
diff --git a/compiler/testData/diagnostics/tests/multiplatform/privateExpectFakeOverride_incompatibleReturnType.kt b/compiler/testData/diagnostics/tests/multiplatform/privateExpectFakeOverride_incompatibleReturnType.kt
index c584c33..7278578 100644
--- a/compiler/testData/diagnostics/tests/multiplatform/privateExpectFakeOverride_incompatibleReturnType.kt
+++ b/compiler/testData/diagnostics/tests/multiplatform/privateExpectFakeOverride_incompatibleReturnType.kt
@@ -1,3 +1,4 @@
+// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
// ISSUE: KT-68674