FIR IDE: Refactor KtFirCompletionCandidateChecker

- Move searching for the `originalEnclosingFunction`
to the `getImplicitReceivers`
This commit is contained in:
Roman Golyshev
2020-09-07 18:18:02 +03:00
parent 33ac487a42
commit 828fc2520c
@@ -44,14 +44,11 @@ internal class KtFirCompletionCandidateChecker(
nameExpression: KtSimpleNameExpression, nameExpression: KtSimpleNameExpression,
possibleExplicitReceiver: KtExpression?, possibleExplicitReceiver: KtExpression?,
): Boolean = withValidityAssertion { ): Boolean = withValidityAssertion {
val originalEnclosingFunction = originalPosition?.getNonStrictParentOfType<KtNamedFunction>()
?: error("Cannot find enclosing function for completion in provided position (or position is absent)")
val functionFits = firSymbolForCandidate.withResolvedFirOfType<KtFirFunctionSymbol, FirSimpleFunction, Boolean> { firFunction -> val functionFits = firSymbolForCandidate.withResolvedFirOfType<KtFirFunctionSymbol, FirSimpleFunction, Boolean> { firFunction ->
checkExtension(firFunction, originalFile, originalEnclosingFunction, nameExpression, possibleExplicitReceiver) checkExtension(firFunction, originalFile, originalPosition, nameExpression, possibleExplicitReceiver)
} }
val propertyFits = firSymbolForCandidate.withResolvedFirOfType<KtFirPropertySymbol, FirProperty, Boolean> { firProperty -> val propertyFits = firSymbolForCandidate.withResolvedFirOfType<KtFirPropertySymbol, FirProperty, Boolean> { firProperty ->
checkExtension(firProperty, originalFile, originalEnclosingFunction, nameExpression, possibleExplicitReceiver) checkExtension(firProperty, originalFile, originalPosition, nameExpression, possibleExplicitReceiver)
} }
functionFits ?: propertyFits ?: false functionFits ?: propertyFits ?: false
@@ -64,15 +61,14 @@ internal class KtFirCompletionCandidateChecker(
private fun checkExtension( private fun checkExtension(
candidateSymbol: FirCallableDeclaration<*>, candidateSymbol: FirCallableDeclaration<*>,
originalFile: KtFile, originalFile: KtFile,
originalEnclosingFunction: KtNamedFunction, originalPosition: PsiElement?,
nameExpression: KtSimpleNameExpression, nameExpression: KtSimpleNameExpression,
possibleExplicitReceiver: KtExpression?, possibleExplicitReceiver: KtExpression?,
): Boolean { ): Boolean {
val file = originalFile.getOrBuildFirOfType<FirFile>(firResolveState) val file = originalFile.getOrBuildFirOfType<FirFile>(firResolveState)
val explicitReceiverExpression = possibleExplicitReceiver?.getOrBuildFirOfType<FirExpression>(firResolveState) val explicitReceiverExpression = possibleExplicitReceiver?.getOrBuildFirOfType<FirExpression>(firResolveState)
val resolver = SingleCandidateResolver(firResolveState.firIdeSourcesSession, file) val resolver = SingleCandidateResolver(firResolveState.firIdeSourcesSession, file)
val implicitReceivers = getImplicitReceivers(file, nameExpression, originalEnclosingFunction) val implicitReceivers = getImplicitReceivers(file, nameExpression, originalPosition)
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,
@@ -90,12 +86,13 @@ internal class KtFirCompletionCandidateChecker(
private fun getImplicitReceivers( private fun getImplicitReceivers(
file: FirFile, file: FirFile,
fakeNameExpression: KtElement, fakeNameExpression: KtSimpleNameExpression,
originalEnclosingFunction: KtNamedFunction, originalPosition: PsiElement?
): Sequence<ImplicitReceiverValue<*>?> { ): Sequence<ImplicitReceiverValue<*>?> {
val fakeEnclosingFunction = fakeNameExpression.getNonStrictParentOfType<KtNamedFunction>() val fakeEnclosingFunction = fakeNameExpression.getNonStrictParentOfType<KtNamedFunction>()
?: error("Cannot find enclosing function for ${fakeNameExpression.getElementTextInContext()}") ?: error("Cannot find enclosing function for ${fakeNameExpression.getElementTextInContext()}")
val originalEnclosingFunction = originalPosition?.getNonStrictParentOfType<KtNamedFunction>()
?: error("Cannot find enclosing function for completion in provided position (or position is absent)")
val completionContext = completionContextCache.getOrCreate(file to fakeEnclosingFunction) { val completionContext = completionContextCache.getOrCreate(file to fakeEnclosingFunction) {
LowLevelFirApiFacade.buildCompletionContextForFunction( LowLevelFirApiFacade.buildCompletionContextForFunction(
file, file,