[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")