K2: introduce platform-specific visibility checks for overrides + tests

Related to KT-53197
This commit is contained in:
pyos
2022-09-09 13:28:22 +02:00
committed by Space
parent 1ad2ec302b
commit 3a5d75fd22
19 changed files with 427 additions and 11 deletions
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.resolve.SupertypeSupplier
import org.jetbrains.kotlin.fir.resolve.calls.FirSimpleSyntheticPropertySymbol
import org.jetbrains.kotlin.fir.resolve.calls.ReceiverValue
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.name.FqName
@NoMutableState
object FirJavaVisibilityChecker : FirVisibilityChecker() {
@@ -50,17 +51,22 @@ object FirJavaVisibilityChecker : FirVisibilityChecker() {
}
}
JavaVisibilities.PackageVisibility -> {
if (symbol.packageFqName() == useSiteFile.packageFqName) {
true
} else if (symbol.fir is FirSyntheticPropertyAccessor) {
symbol.getOwnerLookupTag()?.classId?.packageFqName == useSiteFile.packageFqName
} else {
false
}
}
JavaVisibilities.PackageVisibility -> symbol.isInPackage(useSiteFile.packageFqName)
else -> true
}
}
override fun platformOverrideVisibilityCheck(
session: FirSession,
candidateInDerivedClass: FirBasedSymbol<*>,
symbolInBaseClass: FirBasedSymbol<*>,
visibilityInBaseClass: Visibility,
): Boolean = when (visibilityInBaseClass) {
JavaVisibilities.ProtectedAndPackage, JavaVisibilities.ProtectedStaticVisibility -> true
JavaVisibilities.PackageVisibility -> symbolInBaseClass.isInPackage(candidateInDerivedClass.packageFqName())
else -> true
}
private fun FirBasedSymbol<*>.isInPackage(expected: FqName): Boolean =
packageFqName() == expected || (fir is FirSyntheticPropertyAccessor && getOwnerLookupTag()?.classId?.packageFqName == expected)
}