FIR IDE: Refactor KtFirCompletionCandidateChecker
- Move searching for the `originalEnclosingFunction` to the `getImplicitReceivers`
This commit is contained in:
+8
-11
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user