FIR: Support checking PRIVATE_TO_THIS visibility #KT-49875 Fixed

This commit is contained in:
Mikhail Glukhikh
2022-07-12 10:25:42 +02:00
committed by Space
parent 83200f8774
commit d16e5e5e50
7 changed files with 38 additions and 17 deletions
@@ -12,10 +12,12 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression
import org.jetbrains.kotlin.fir.references.FirSuperReference
import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.ExpressionReceiverValue
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue
import org.jetbrains.kotlin.fir.resolve.calls.ReceiverValue
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
@@ -243,8 +245,9 @@ abstract class FirVisibilityChecker : FirSessionComponent {
}
if (dispatchReceiver != null) {
val fir = symbol.fir
val dispatchReceiverParameterClassSymbol =
(symbol.fir as? FirCallableDeclaration)
(fir as? FirCallableDeclaration)
?.propertyIfAccessor?.propertyIfBackingField
?.dispatchReceiverClassOrNull()?.toSymbol(session)
?: return true
@@ -260,6 +263,24 @@ abstract class FirVisibilityChecker : FirSessionComponent {
)
if (dispatchReceiverParameterClassLookupTag != dispatchReceiverValueOwnerLookupTag) return false
if (fir.visibility == Visibilities.PrivateToThis) {
when (dispatchReceiver) {
is ExpressionReceiverValue -> {
val explicitReceiver = dispatchReceiver.explicitReceiver
if (explicitReceiver !is FirThisReceiverExpression) {
return false
}
if (explicitReceiver.calleeReference.boundSymbol != dispatchReceiverParameterClassSymbol) {
return false
}
}
is ImplicitReceiverValue<*> -> {
if (dispatchReceiver.boundSymbol != dispatchReceiverParameterClassSymbol) {
return false
}
}
}
}
}
for (declaration in containingDeclarationOfUseSite) {