[MPP] Permit const actual properties for non-const expects

It's safe as not having const is more restrictive, therefore can be
allowed in common. Otherwise, it's not possible to declare an expect
declaration for a platform property with `const` modifier in common

KT-18856
This commit is contained in:
Pavel Kirpichenkov
2022-01-18 16:03:28 +03:00
committed by TeamCityServer
parent 8ad06ef725
commit b4c854429f
5 changed files with 26 additions and 16 deletions
@@ -536,14 +536,16 @@ object FirExpectActualResolver {
return ExpectActualCompatibility.Compatible return ExpectActualCompatibility.Compatible
} }
private fun areCompatibleProperties(a: FirPropertySymbol, b: FirPropertySymbol): ExpectActualCompatibility<FirBasedSymbol<*>> { private fun areCompatibleProperties(
if (!equalBy(a, b) { p -> p.isVar }) { expected: FirPropertySymbol,
return ExpectActualCompatibility.Incompatible.PropertyKind actual: FirPropertySymbol,
): ExpectActualCompatibility<FirBasedSymbol<*>> {
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 ---------------------------------------- // ---------------------------------------- Utils ----------------------------------------
@@ -88,7 +88,9 @@ object ClassicPositioningStrategies {
} }
ExpectActualCompatibility.Incompatible.FunctionModifiersDifferent, ExpectActualCompatibility.Incompatible.FunctionModifiersDifferent,
ExpectActualCompatibility.Incompatible.FunctionModifiersNotSubset, ExpectActualCompatibility.Incompatible.FunctionModifiersNotSubset,
ExpectActualCompatibility.Incompatible.PropertyModifiers, ExpectActualCompatibility.Incompatible.ClassModifiers -> { ExpectActualCompatibility.Incompatible.PropertyLateinitModifier,
ExpectActualCompatibility.Incompatible.PropertyConstModifier,
ExpectActualCompatibility.Incompatible.ClassModifiers -> {
element.modifierList element.modifierList
} }
ExpectActualCompatibility.Incompatible.PropertyKind -> { ExpectActualCompatibility.Incompatible.PropertyKind -> {
@@ -56,7 +56,8 @@ sealed class ExpectActualCompatibility<out D> {
// Properties // Properties
object PropertyKind : Incompatible<Nothing>("property kinds are different (val vs var)") object PropertyKind : Incompatible<Nothing>("property kinds are different (val vs var)")
object PropertyModifiers : Incompatible<Nothing>("modifiers are different (const, lateinit)") object PropertyLateinitModifier : Incompatible<Nothing>("modifiers are different (lateinit)")
object PropertyConstModifier : Incompatible<Nothing>("modifiers are different (const)")
// Classifiers // Classifiers
@@ -360,11 +360,16 @@ object ExpectedActualResolver {
return Compatible return Compatible
} }
private fun areCompatibleProperties(a: PropertyDescriptor, b: PropertyDescriptor): ExpectActualCompatibility<MemberDescriptor> { private fun areCompatibleProperties(
if (!equalBy(a, b) { p -> p.isVar }) return Incompatible.PropertyKind expected: PropertyDescriptor,
if (!equalBy(a, b) { p -> listOf(p.isConst, p.isLateInit) }) return Incompatible.PropertyModifiers actual: PropertyDescriptor,
): ExpectActualCompatibility<MemberDescriptor> {
return Compatible 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<MemberDescriptor> { private fun areCompatibleClassifiers(a: ClassDescriptor, other: ClassifierDescriptor): ExpectActualCompatibility<MemberDescriptor> {
@@ -46,11 +46,11 @@ class ConstImpl {
// actuals // actuals
actual typealias NonConstNonConst = NonConstImpl actual typealias NonConstNonConst = NonConstImpl
actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>NonConstConst<!> = ConstImpl actual typealias NonConstConst = ConstImpl
actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>ConstNonConst<!> = NonConstImpl actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>ConstNonConst<!> = NonConstImpl
actual typealias ConstConst = ConstImpl actual typealias ConstConst = ConstImpl
actual val NonConstNonConstTl: Int get() = 42 actual val NonConstNonConstTl: Int get() = 42
<!ACTUAL_WITHOUT_EXPECT!>actual const<!> val NonConstConstTl: Int = 42 actual const val NonConstConstTl: Int = 42
<!ACTUAL_WITHOUT_EXPECT!>actual<!> val ConstNonConstTl: Int get() = 42 <!ACTUAL_WITHOUT_EXPECT!>actual<!> val ConstNonConstTl: Int get() = 42
actual const val ConstConstTl: Int = 42 actual const val ConstConstTl: Int = 42