[Analysis API] Use ContextCollector in 'KtFirCompletionCandidateChecker'
This commit is contained in:
+17
-8
@@ -16,18 +16,20 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType
|
|||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.resolver.ResolutionParameters
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.resolver.ResolutionParameters
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.resolver.SingleCandidateResolutionMode
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.resolver.SingleCandidateResolutionMode
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.resolver.SingleCandidateResolver
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.resolver.SingleCandidateResolver
|
||||||
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.llFirSession
|
||||||
|
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.ContextCollector
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirVariable
|
import org.jetbrains.kotlin.fir.declarations.FirVariable
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression
|
import org.jetbrains.kotlin.fir.expressions.FirSafeCallExpression
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.FirErrorReferenceWithCandidate
|
import org.jetbrains.kotlin.fir.resolve.calls.FirErrorReferenceWithCandidate
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue
|
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue
|
||||||
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
||||||
import org.jetbrains.kotlin.fir.types.receiverType
|
import org.jetbrains.kotlin.fir.types.receiverType
|
||||||
import org.jetbrains.kotlin.psi.KtExpression
|
import org.jetbrains.kotlin.psi.KtExpression
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.psi.KtLoopExpression
|
|
||||||
import org.jetbrains.kotlin.psi.KtSafeQualifiedExpression
|
import org.jetbrains.kotlin.psi.KtSafeQualifiedExpression
|
||||||
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
||||||
import org.jetbrains.kotlin.psi.KtStatementExpression
|
import org.jetbrains.kotlin.psi.KtStatementExpression
|
||||||
@@ -60,7 +62,7 @@ internal class KtFirCompletionCandidateChecker(
|
|||||||
val file = originalFile.getOrBuildFirFile(firResolveSession)
|
val file = originalFile.getOrBuildFirFile(firResolveSession)
|
||||||
val explicitReceiverExpression = possibleExplicitReceiver?.getMatchingFirExpressionForCallReceiver()
|
val explicitReceiverExpression = possibleExplicitReceiver?.getMatchingFirExpressionForCallReceiver()
|
||||||
val resolver = SingleCandidateResolver(firResolveSession.useSiteFirSession, file)
|
val resolver = SingleCandidateResolver(firResolveSession.useSiteFirSession, file)
|
||||||
val implicitReceivers = getImplicitReceivers(originalFile, nameExpression)
|
val implicitReceivers = getImplicitReceivers(nameExpression)
|
||||||
for (implicitReceiverValue in implicitReceivers) {
|
for (implicitReceiverValue in implicitReceivers) {
|
||||||
val resolutionParameters = ResolutionParameters(
|
val resolutionParameters = ResolutionParameters(
|
||||||
singleCandidateResolutionMode = SingleCandidateResolutionMode.CHECK_EXTENSION_FOR_COMPLETION,
|
singleCandidateResolutionMode = SingleCandidateResolutionMode.CHECK_EXTENSION_FOR_COMPLETION,
|
||||||
@@ -87,12 +89,19 @@ internal class KtFirCompletionCandidateChecker(
|
|||||||
return KtExtensionApplicabilityResult.NonApplicable(token)
|
return KtExtensionApplicabilityResult.NonApplicable(token)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getImplicitReceivers(
|
private fun getImplicitReceivers(fakeNameExpression: KtSimpleNameExpression): Sequence<ImplicitReceiverValue<*>?> {
|
||||||
originalFile: KtFile,
|
val fakeFile = fakeNameExpression.containingKtFile
|
||||||
fakeNameExpression: KtSimpleNameExpression
|
val fakeFirFile = fakeFile.getOrBuildFirFile(firResolveSession)
|
||||||
): Sequence<ImplicitReceiverValue<*>?> {
|
|
||||||
val towerDataContext = analysisSession.firResolveSession.getTowerContextProvider(originalFile)
|
val sessionHolder = run {
|
||||||
.getClosestAvailableParentContext(fakeNameExpression)
|
val firSession = fakeFirFile.llFirSession
|
||||||
|
val scopeSession = firResolveSession.getScopeSessionFor(firSession)
|
||||||
|
SessionHolderImpl(firSession, scopeSession)
|
||||||
|
}
|
||||||
|
|
||||||
|
val elementContext = ContextCollector.process(fakeFirFile, sessionHolder, fakeNameExpression, bodyElement = null)
|
||||||
|
|
||||||
|
val towerDataContext = elementContext?.towerDataContext
|
||||||
?: errorWithAttachment("Cannot find enclosing declaration for ${fakeNameExpression::class}") {
|
?: errorWithAttachment("Cannot find enclosing declaration for ${fakeNameExpression::class}") {
|
||||||
withPsiEntry("fakeNameExpression", fakeNameExpression)
|
withPsiEntry("fakeNameExpression", fakeNameExpression)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user