[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:
committed by
TeamCityServer
parent
8ad06ef725
commit
b4c854429f
+9
-7
@@ -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 ----------------------------------------
|
||||||
|
|||||||
+3
-1
@@ -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 -> {
|
||||||
|
|||||||
+2
-1
@@ -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
|
||||||
|
|
||||||
|
|||||||
+10
-5
@@ -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> {
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user