[FE] Check visibilities of expected and actual property setters are compatible

^KT-30905 Fixed
This commit is contained in:
Roman Efremov
2023-04-06 11:54:32 +02:00
committed by Space Team
parent 9044dfe394
commit c718c77c43
9 changed files with 123 additions and 0 deletions
@@ -127,6 +127,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst
runTest("compiler/testData/diagnostics/tests/multiplatform/smartcastOnMemberPropertyFromCommonClass.kt");
}
@Test
@TestMetadata("varSetterVisibility.kt")
public void testVarSetterVisibility() throws Exception {
runTest("compiler/testData/diagnostics/tests/multiplatform/varSetterVisibility.kt");
}
@Nested
@TestMetadata("compiler/testData/diagnostics/tests/multiplatform/defaultArguments")
@TestDataPath("$PROJECT_ROOT")
@@ -127,6 +127,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi
runTest("compiler/testData/diagnostics/tests/multiplatform/smartcastOnMemberPropertyFromCommonClass.kt");
}
@Test
@TestMetadata("varSetterVisibility.kt")
public void testVarSetterVisibility() throws Exception {
runTest("compiler/testData/diagnostics/tests/multiplatform/varSetterVisibility.kt");
}
@Nested
@TestMetadata("compiler/testData/diagnostics/tests/multiplatform/defaultArguments")
@TestDataPath("$PROJECT_ROOT")
@@ -523,10 +523,23 @@ object FirExpectActualResolver {
!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
!arePropertySettersWithCompatibleVisibilities(expected, actual) -> ExpectActualCompatibility.Incompatible.PropertySetterVisibility
else -> ExpectActualCompatibility.Compatible
}
}
private fun arePropertySettersWithCompatibleVisibilities(
expected: FirPropertySymbol,
actual: FirPropertySymbol,
): Boolean {
val expectedSetterStatus = expected.setterSymbol?.resolvedStatus
val actualSetterStatus = actual.setterSymbol?.resolvedStatus
if (expectedSetterStatus == null || actualSetterStatus == null) {
return true
}
return areDeclarationsWithCompatibleVisibilities(expectedSetterStatus, actualSetterStatus)
}
// ---------------------------------------- Utils ----------------------------------------
private fun List<FirValueParameterSymbol>.toTypeList(substitutor: ConeSubstitutor): List<ConeKotlinType> {