FIR: Support checking PRIVATE_TO_THIS visibility #KT-49875 Fixed
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user