[FIR IDE] Do more precise extraction of the dispatcher receiver
If the `candidateSymbol` is an extension, then it cannot be called with an explicit dispatch receiver, because only the extension receiver can be explicit in such case Therefore, we consider `receiverExpression` to be a dispatch receiver only if the `candidateSymbol` is not an extension KTIJ-21910
This commit is contained in:
+8
-3
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFileSymbol
|
|||||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
|
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.impl.barebone.parentsOfType
|
import org.jetbrains.kotlin.analysis.api.impl.barebone.parentsOfType
|
||||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
||||||
|
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
|
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDesignation
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDesignation
|
||||||
@@ -23,6 +24,7 @@ import org.jetbrains.kotlin.fir.resolve.calls.ExpressionReceiverValue
|
|||||||
import org.jetbrains.kotlin.fir.visibilityChecker
|
import org.jetbrains.kotlin.fir.visibilityChecker
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||||
|
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||||
|
|
||||||
internal class KtFirVisibilityChecker(
|
internal class KtFirVisibilityChecker(
|
||||||
override val analysisSession: KtFirAnalysisSession,
|
override val analysisSession: KtFirAnalysisSession,
|
||||||
@@ -41,9 +43,12 @@ internal class KtFirVisibilityChecker(
|
|||||||
val useSiteFirFile = useSiteFile.firSymbol.fir
|
val useSiteFirFile = useSiteFile.firSymbol.fir
|
||||||
val containers = collectContainingDeclarations(position)
|
val containers = collectContainingDeclarations(position)
|
||||||
|
|
||||||
val explicitDispatchReceiver = receiverExpression
|
val dispatchReceiverCanBeExplicit = candidateSymbol is KtCallableSymbol && !candidateSymbol.isExtension
|
||||||
?.getOrBuildFirSafe<FirExpression>(analysisSession.firResolveSession)
|
val explicitDispatchReceiver = runIf(dispatchReceiverCanBeExplicit) {
|
||||||
?.let { ExpressionReceiverValue(it) }
|
receiverExpression
|
||||||
|
?.getOrBuildFirSafe<FirExpression>(analysisSession.firResolveSession)
|
||||||
|
?.let { ExpressionReceiverValue(it) }
|
||||||
|
}
|
||||||
|
|
||||||
val candidateFirSymbol = candidateSymbol.firSymbol.fir as FirMemberDeclaration
|
val candidateFirSymbol = candidateSymbol.firSymbol.fir as FirMemberDeclaration
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user