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
@@ -62,6 +62,15 @@ abstract class FirVisibilityChecker : FirSessionComponent {
): Boolean {
return true
}
override fun platformOverrideVisibilityCheck(
session: FirSession,
candidateInDerivedClass: FirBasedSymbol<*>,
symbolInBaseClass: FirBasedSymbol<*>,
visibilityInBaseClass: Visibility,
): Boolean {
return true
}
}
fun isVisible(
@@ -107,6 +116,24 @@ abstract class FirVisibilityChecker : FirSessionComponent {
}
}
fun isVisibleForOverriding(
session: FirSession,
candidateInDerivedClass: FirMemberDeclaration,
candidateInBaseClass: FirMemberDeclaration
): Boolean = when (candidateInBaseClass.visibility) {
Visibilities.Internal -> {
candidateInBaseClass.moduleData == candidateInDerivedClass.moduleData ||
(candidateInDerivedClass.moduleData == session.moduleData &&
session.moduleVisibilityChecker?.isInFriendModule(candidateInBaseClass) == true)
}
Visibilities.Private, Visibilities.PrivateToThis -> false
Visibilities.Protected -> true
else -> platformOverrideVisibilityCheck(
session, candidateInDerivedClass.symbol, candidateInBaseClass.symbol, candidateInBaseClass.visibility
)
}
private fun FirMemberDeclaration.containingNonLocalClass(
session: FirSession,
dispatchReceiverValue: ReceiverValue?
@@ -226,6 +253,13 @@ abstract class FirVisibilityChecker : FirSessionComponent {
supertypeSupplier: SupertypeSupplier
): Boolean
protected abstract fun platformOverrideVisibilityCheck(
session: FirSession,
candidateInDerivedClass: FirBasedSymbol<*>,
symbolInBaseClass: FirBasedSymbol<*>,
visibilityInBaseClass: Visibility,
): Boolean
private fun canSeePrivateMemberOf(
symbol: FirBasedSymbol<*>,
containingDeclarationOfUseSite: List<FirDeclaration>,
@@ -357,7 +391,9 @@ abstract class FirVisibilityChecker : FirSessionComponent {
stubTypesEqualToAnything = false
)
if (AbstractTypeChecker.isSubtypeOf(
typeCheckerState, dispatchReceiverType.fullyExpandedType(session), containingUseSiteClass.symbol.constructStarProjectedType()
typeCheckerState,
dispatchReceiverType.fullyExpandedType(session),
containingUseSiteClass.symbol.constructStarProjectedType()
)
) {
return true