[FIR, IR] Improve expect-actual visibility mismatch error reporting
Similar to KT-30424
I checked other ExpectActualCheckingCompatibility and
ExpectActualMatchingCompatibility and I don't think it makes sense to
change them
* ReturnType Return type is already rendered as part of the signature
* ParameterNames Parameter type is already already rendered as part of the signature
* ClassKind Messages like "Expect declaration class kind is 'class'" look weird.
The current message: "class kinds are different (class, interface, object, enum, annotation)" is clear enough
* ... ...
Note: visibility is not rendered as part of the signature, that's why
I explicitly add in this commit.
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 8a348fe..e9bb0f2 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
@@ -132,7 +132,7 @@
}
if (!areCompatibleClassVisibilities(expectClassSymbol, actualClass)) {
- return ExpectActualCheckingCompatibility.Visibility
+ return ExpectActualCheckingCompatibility.Visibility(expectClassSymbol.visibility, actualClass.visibility)
}
val substitutor = createExpectActualTypeParameterSubstitutor(
@@ -339,7 +339,7 @@
languageVersionSettings
)
) {
- return ExpectActualCheckingCompatibility.Visibility
+ return ExpectActualCheckingCompatibility.Visibility(expectDeclaration.visibility, actualDeclaration.visibility)
}
getTypeParametersVarianceOrReifiedIncompatibility(expectedTypeParameters, actualTypeParameters)?.let { return it }
@@ -541,7 +541,7 @@
!equalBy(expected, actual) { p -> p.isLateinit } -> ExpectActualCheckingCompatibility.PropertyLateinitModifier
expected.isConst && !actual.isConst -> ExpectActualCheckingCompatibility.PropertyConstModifier
!arePropertySettersWithCompatibleVisibilities(expected, actual, expectContainingClass, languageVersionSettings) ->
- ExpectActualCheckingCompatibility.PropertySetterVisibility
+ ExpectActualCheckingCompatibility.PropertySetterVisibility(expected.setter?.visibility, actual.setter?.visibility)
else -> null
}
}
diff --git a/compiler/testData/multiplatform/incompatibleCallables/output.txt b/compiler/testData/multiplatform/incompatibleCallables/output.txt
index 1c4ce51..d4b6b66 100644
--- a/compiler/testData/multiplatform/incompatibleCallables/output.txt
+++ b/compiler/testData/multiplatform/incompatibleCallables/output.txt
@@ -54,7 +54,7 @@
actual fun <K, V> f7() {}
^^
compiler/testData/multiplatform/incompatibleCallables/jvm.kt:17:21: error: 'actual fun f10(): Unit' has no corresponding expected declaration
-The following declaration is incompatible because visibility is different:
+The following declaration is incompatible because visibility is different. Expect declaration visibility is 'public'. Actual declaration visibility is 'internal':
expect fun f10(): Unit
internal actual fun f10() {}
diff --git a/compiler/testData/multiplatform/incompatibleClasses/output.txt b/compiler/testData/multiplatform/incompatibleClasses/output.txt
index 5439b74..f46474e 100644
--- a/compiler/testData/multiplatform/incompatibleClasses/output.txt
+++ b/compiler/testData/multiplatform/incompatibleClasses/output.txt
@@ -87,7 +87,7 @@
actual class PAnnotationClass
^^^^^^^^^^^^^^^^
compiler/testData/multiplatform/incompatibleClasses/jvm.kt:7:24: error: 'actual object PublicObject : Any' has no corresponding expected declaration
-The following declaration is incompatible because visibility is different:
+The following declaration is incompatible because visibility is different. Expect declaration visibility is 'public'. Actual declaration visibility is 'internal':
expect object PublicObject : Any
internal actual object PublicObject
diff --git a/core/compiler.common/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectActualCompatibility.kt b/core/compiler.common/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectActualCompatibility.kt
index 7f41d1f..2f9c4c2 100644
--- a/core/compiler.common/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectActualCompatibility.kt
+++ b/core/compiler.common/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectActualCompatibility.kt
@@ -51,7 +51,7 @@
sealed class ExpectActualCheckingCompatibility<out D> : ExpectActualCompatibility<D> {
sealed class Incompatible<out D>(override val reason: String?) : ExpectActualCheckingCompatibility<D>(),
ExpectActualCompatibility.MismatchOrIncompatible<D> {
- constructor(property: String, expect: String, actual: String) : this(
+ constructor(property: String, expect: String?, actual: String?) : this(
"$property is different. " +
"Expect declaration $property is '$expect'. " +
"Actual declaration $property is '$actual'"
@@ -83,7 +83,10 @@
object PropertyKind : Incompatible<Nothing>("property kinds are different (val vs var)")
object PropertyLateinitModifier : Incompatible<Nothing>("modifiers are different (lateinit)")
object PropertyConstModifier : Incompatible<Nothing>("modifiers are different (const)")
- object PropertySetterVisibility : Incompatible<Nothing>("setter visibility is different")
+ class PropertySetterVisibility(
+ expectVisibility: org.jetbrains.kotlin.descriptors.Visibility?,
+ actualVisibility: org.jetbrains.kotlin.descriptors.Visibility?,
+ ) : Incompatible<Nothing>("setter visibility", expectVisibility?.name, actualVisibility?.name)
// Classifiers
object ClassKind : Incompatible<Nothing>("class kinds are different (class, interface, object, enum, annotation)")
@@ -101,7 +104,10 @@
expectModality: org.jetbrains.kotlin.descriptors.Modality,
actualModality: org.jetbrains.kotlin.descriptors.Modality,
) : Incompatible<Nothing>("modality", expectModality.toString().lowercase(), actualModality.toString().lowercase())
- object Visibility : Incompatible<Nothing>("visibility is different")
+ class Visibility(
+ expectVisibility: org.jetbrains.kotlin.descriptors.Visibility,
+ actualVisibility: org.jetbrains.kotlin.descriptors.Visibility,
+ ) : Incompatible<Nothing>("visibility", expectVisibility.name, actualVisibility.name)
object ClassTypeParameterUpperBounds : Incompatible<Nothing>(TYPE_PARAMETER_UPPER_BOUNDS)
object TypeParameterVariance : Incompatible<Nothing>("declaration-site variances of type parameters are different")