diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualResolver.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualResolver.kt index 064ef456ed8..5720182c4b6 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualResolver.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualResolver.kt @@ -536,14 +536,16 @@ object FirExpectActualResolver { return ExpectActualCompatibility.Compatible } - private fun areCompatibleProperties(a: FirPropertySymbol, b: FirPropertySymbol): ExpectActualCompatibility> { - if (!equalBy(a, b) { p -> p.isVar }) { - return ExpectActualCompatibility.Incompatible.PropertyKind + private fun areCompatibleProperties( + expected: FirPropertySymbol, + actual: FirPropertySymbol, + ): ExpectActualCompatibility> { + return when { + !equalBy(expected, actual) { p -> p.isVar } -> ExpectActualCompatibility.Incompatible.PropertyKind + !equalBy(expected, actual) { p -> p.isLateInit } -> ExpectActualCompatibility.Incompatible.PropertyLateinitModifier + expected.isConst && !actual.isConst -> ExpectActualCompatibility.Incompatible.PropertyConstModifier + else -> ExpectActualCompatibility.Compatible } - if (!equalBy(a, b) { p -> listOf(p.isConst, p.isLateInit) }) { - return ExpectActualCompatibility.Incompatible.PropertyModifiers - } - return ExpectActualCompatibility.Compatible } // ---------------------------------------- Utils ---------------------------------------- diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/ClassicPositioningStrategies.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/ClassicPositioningStrategies.kt index 34e32257800..ff46343862d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/ClassicPositioningStrategies.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/ClassicPositioningStrategies.kt @@ -88,7 +88,9 @@ object ClassicPositioningStrategies { } ExpectActualCompatibility.Incompatible.FunctionModifiersDifferent, ExpectActualCompatibility.Incompatible.FunctionModifiersNotSubset, - ExpectActualCompatibility.Incompatible.PropertyModifiers, ExpectActualCompatibility.Incompatible.ClassModifiers -> { + ExpectActualCompatibility.Incompatible.PropertyLateinitModifier, + ExpectActualCompatibility.Incompatible.PropertyConstModifier, + ExpectActualCompatibility.Incompatible.ClassModifiers -> { element.modifierList } ExpectActualCompatibility.Incompatible.PropertyKind -> { diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectActualCompatibility.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectActualCompatibility.kt index 39ac11c1d92..eb8d869e061 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectActualCompatibility.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectActualCompatibility.kt @@ -56,7 +56,8 @@ sealed class ExpectActualCompatibility { // Properties object PropertyKind : Incompatible("property kinds are different (val vs var)") - object PropertyModifiers : Incompatible("modifiers are different (const, lateinit)") + object PropertyLateinitModifier : Incompatible("modifiers are different (lateinit)") + object PropertyConstModifier : Incompatible("modifiers are different (const)") // Classifiers diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt index 43bac3f6c38..53c800dd511 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ExpectedActualResolver.kt @@ -360,11 +360,16 @@ object ExpectedActualResolver { return Compatible } - private fun areCompatibleProperties(a: PropertyDescriptor, b: PropertyDescriptor): ExpectActualCompatibility { - if (!equalBy(a, b) { p -> p.isVar }) return Incompatible.PropertyKind - if (!equalBy(a, b) { p -> listOf(p.isConst, p.isLateInit) }) return Incompatible.PropertyModifiers - - return Compatible + private fun areCompatibleProperties( + expected: PropertyDescriptor, + actual: PropertyDescriptor, + ): ExpectActualCompatibility { + return when { + !equalBy(expected, actual) { p -> p.isVar } -> Incompatible.PropertyKind + !equalBy(expected, actual) { p -> p.isLateInit } -> Incompatible.PropertyLateinitModifier + expected.isConst && !actual.isConst -> Incompatible.PropertyConstModifier + else -> Compatible + } } private fun areCompatibleClassifiers(a: ClassDescriptor, other: ClassifierDescriptor): ExpectActualCompatibility { diff --git a/compiler/testData/diagnostics/testsWithMultiplatformCompositeAnalysis/constVals/nonConstExpectConstActual.kt b/compiler/testData/diagnostics/testsWithMultiplatformCompositeAnalysis/constVals/nonConstExpectConstActual.kt index 7b59cfd2dff..5f4aca07bd2 100644 --- a/compiler/testData/diagnostics/testsWithMultiplatformCompositeAnalysis/constVals/nonConstExpectConstActual.kt +++ b/compiler/testData/diagnostics/testsWithMultiplatformCompositeAnalysis/constVals/nonConstExpectConstActual.kt @@ -46,11 +46,11 @@ class ConstImpl { // actuals actual typealias NonConstNonConst = NonConstImpl -actual typealias NonConstConst = ConstImpl +actual typealias NonConstConst = ConstImpl actual typealias ConstNonConst = NonConstImpl actual typealias ConstConst = ConstImpl actual val NonConstNonConstTl: Int get() = 42 -actual const val NonConstConstTl: Int = 42 +actual const val NonConstConstTl: Int = 42 actual val ConstNonConstTl: Int get() = 42 actual const val ConstConstTl: Int = 42