[FIR] Consider containing class during visibility check of static function call

^KT-53441
This commit is contained in:
Dmitriy Novozhilov
2022-10-11 11:51:38 +03:00
committed by Space Team
parent a14cab7245
commit 64e21af03b
4 changed files with 28 additions and 27 deletions
@@ -101,7 +101,12 @@ abstract class FirVisibilityChecker : FirSessionComponent {
if (skipCheckForContainingClassVisibility) return true
val parentClass = declaration.containingNonLocalClass(session, dispatchReceiver) ?: return true
val parentClass = declaration.containingNonLocalClass(
session,
dispatchReceiver,
containingDeclarations,
supertypeSupplier
) ?: return true
return generateSequence(parentClass) { it.containingNonLocalClass(session) }.all { parent ->
isSpecificDeclarationVisible(
parent,
@@ -137,7 +142,9 @@ abstract class FirVisibilityChecker : FirSessionComponent {
private fun FirMemberDeclaration.containingNonLocalClass(
session: FirSession,
dispatchReceiverValue: ReceiverValue?
dispatchReceiverValue: ReceiverValue?,
containingUseSiteDeclarations: List<FirDeclaration>,
supertypeSupplier: SupertypeSupplier
): FirClassLikeDeclaration? {
return when (this) {
is FirCallableDeclaration -> {
@@ -147,7 +154,17 @@ abstract class FirVisibilityChecker : FirSessionComponent {
}
}
this.containingClass()?.toSymbol(session)?.fir
val containingLookupTag = this.containingClass()
val containingClass = containingLookupTag?.toSymbol(session)?.fir
if (isStatic && containingClass != null) {
containingUseSiteDeclarations.firstNotNullOfOrNull {
if (it !is FirClass) return@firstNotNullOfOrNull null
it.takeIf { it.isSubClass(containingLookupTag, session, supertypeSupplier) }
}?.let { return it }
}
containingClass
}
is FirClassLikeDeclaration -> containingNonLocalClass(session)
}