From bc853e45e8982eff74e3263b0197c1af6086615d Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Fri, 3 Jun 2022 12:54:51 +0400 Subject: [PATCH] [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 --- .../api/fir/components/KtFirVisibilityChecker.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt index 28a2da60af0..3796eb1e3aa 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt @@ -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.impl.barebone.parentsOfType 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.markers.KtSymbolWithVisibility 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.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject +import org.jetbrains.kotlin.utils.addToStdlib.runIf internal class KtFirVisibilityChecker( override val analysisSession: KtFirAnalysisSession, @@ -41,9 +43,12 @@ internal class KtFirVisibilityChecker( val useSiteFirFile = useSiteFile.firSymbol.fir val containers = collectContainingDeclarations(position) - val explicitDispatchReceiver = receiverExpression - ?.getOrBuildFirSafe(analysisSession.firResolveSession) - ?.let { ExpressionReceiverValue(it) } + val dispatchReceiverCanBeExplicit = candidateSymbol is KtCallableSymbol && !candidateSymbol.isExtension + val explicitDispatchReceiver = runIf(dispatchReceiverCanBeExplicit) { + receiverExpression + ?.getOrBuildFirSafe(analysisSession.firResolveSession) + ?.let { ExpressionReceiverValue(it) } + } val candidateFirSymbol = candidateSymbol.firSymbol.fir as FirMemberDeclaration