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,
possibleExplicitReceiver: KtExpression?,
): 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 ->
checkExtension(firFunction, originalFile, originalEnclosingFunction, nameExpression, possibleExplicitReceiver)
checkExtension(firFunction, originalFile, originalPosition, nameExpression, possibleExplicitReceiver)
}
val propertyFits = firSymbolForCandidate.withResolvedFirOfType<KtFirPropertySymbol, FirProperty, Boolean> { firProperty ->
checkExtension(firProperty, originalFile, originalEnclosingFunction, nameExpression, possibleExplicitReceiver)
checkExtension(firProperty, originalFile, originalPosition, nameExpression, possibleExplicitReceiver)
}
functionFits ?: propertyFits ?: false
@@ -64,15 +61,14 @@ internal class KtFirCompletionCandidateChecker(
private fun checkExtension(
candidateSymbol: FirCallableDeclaration<*>,
originalFile: KtFile,
originalEnclosingFunction: KtNamedFunction,
originalPosition: PsiElement?,
nameExpression: KtSimpleNameExpression,
possibleExplicitReceiver: KtExpression?,
): Boolean {
val file = originalFile.getOrBuildFirOfType<FirFile>(firResolveState)
val explicitReceiverExpression = possibleExplicitReceiver?.getOrBuildFirOfType<FirExpression>(firResolveState)
val resolver = SingleCandidateResolver(firResolveState.firIdeSourcesSession, file)
val implicitReceivers = getImplicitReceivers(file, nameExpression, originalEnclosingFunction)
val implicitReceivers = getImplicitReceivers(file, nameExpression, originalPosition)
for (implicitReceiverValue in implicitReceivers) {
val resolutionParameters = ResolutionParameters(
singleCandidateResolutionMode = SingleCandidateResolutionMode.CHECK_EXTENSION_FOR_COMPLETION,
@@ -90,12 +86,13 @@ internal class KtFirCompletionCandidateChecker(
private fun getImplicitReceivers(
file: FirFile,
fakeNameExpression: KtElement,
originalEnclosingFunction: KtNamedFunction,
fakeNameExpression: KtSimpleNameExpression,
originalPosition: PsiElement?
): Sequence<ImplicitReceiverValue<*>?> {
val fakeEnclosingFunction = fakeNameExpression.getNonStrictParentOfType<KtNamedFunction>()
?: 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) {
LowLevelFirApiFacade.buildCompletionContextForFunction(
file,