K2: introduce platform-specific visibility checks for overrides + tests
Related to KT-53197
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user