From 64645c504991a555978cfe3d1bfe8f552051afc8 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Wed, 2 Sep 2020 13:36:25 +0300 Subject: [PATCH] FIR Completion: Refactor `KotlinAvailableScopesCompletionProvider` - Move different types of completion to separate functions --- .../KotlinFirCompletionContributor.kt | 74 ++++++++++++------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt index 34933a1f0e5..63b6cff0e91 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/completion/KotlinFirCompletionContributor.kt @@ -10,7 +10,9 @@ import com.intellij.patterns.PlatformPatterns import com.intellij.patterns.PsiJavaPatterns import com.intellij.util.ProcessingContext import org.jetbrains.kotlin.idea.frontend.api.InvalidWayOfUsingAnalysisSession +import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.getAnalysisSessionFor +import org.jetbrains.kotlin.idea.frontend.api.scopes.KtCompositeScope import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtNamedSymbol @@ -19,6 +21,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.isExtension import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtLabelReferenceExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression @@ -63,7 +66,7 @@ private object KotlinFirCompletionProvider : CompletionProvider + ) { + val availableNonExtensions = implicitScopes + .getCallableSymbols() + .filterNot { it.isExtension } + + val extensionsWhichCanBeCalled = implicitScopes + .getCallableSymbols() + .filter { it.isExtension && it.canBeCalledWith(implicitReceivers) } + + availableNonExtensions.forEach { result.addSymbolToCompletion(it) } + extensionsWhichCanBeCalled.forEach { result.addSymbolToCompletion(it) } + + val availableClasses = implicitScopes.getClassifierSymbols() + availableClasses.forEach { result.addSymbolToCompletion(it) } + } } private fun KtCallableSymbol.canBeCalledWith(implicitReceivers: List): Boolean {