FIR Completion: Use name filtering in completion contributor
This commit is contained in:
committed by
Ilya Kirillov
parent
75d8710bf6
commit
1ab6595ae2
+11
-7
@@ -14,6 +14,7 @@ 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.scopes.KtScope
|
||||
import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScopeNameFilter
|
||||
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
|
||||
@@ -33,7 +34,7 @@ private object KotlinFirCompletionProvider : CompletionProvider<CompletionParame
|
||||
override fun addCompletions(parameters: CompletionParameters, context: ProcessingContext, result: CompletionResultSet) {
|
||||
if (shouldSuppressCompletion(parameters, result.prefixMatcher)) return
|
||||
|
||||
KotlinAvailableScopesCompletionProvider.addCompletions(parameters, result)
|
||||
KotlinAvailableScopesCompletionProvider(result.prefixMatcher).addCompletions(parameters, result)
|
||||
}
|
||||
|
||||
private val AFTER_NUMBER_LITERAL = PsiJavaPatterns.psiElement().afterLeafSkipping(
|
||||
@@ -59,9 +60,12 @@ private object KotlinFirCompletionProvider : CompletionProvider<CompletionParame
|
||||
}
|
||||
}
|
||||
|
||||
private object KotlinAvailableScopesCompletionProvider {
|
||||
private class KotlinAvailableScopesCompletionProvider(prefixMatcher: PrefixMatcher) {
|
||||
private val lookupElementFactory = KotlinFirLookupElementFactory()
|
||||
|
||||
private val scopeNameFilter: KtScopeNameFilter =
|
||||
{ name -> !name.isSpecial && prefixMatcher.prefixMatches(name.identifier) }
|
||||
|
||||
private fun CompletionResultSet.addSymbolToCompletion(symbol: KtSymbol) {
|
||||
if (symbol !is KtNamedSymbol) return
|
||||
addElement(lookupElementFactory.createLookupElement(symbol))
|
||||
@@ -92,7 +96,7 @@ private object KotlinAvailableScopesCompletionProvider {
|
||||
}
|
||||
|
||||
private fun collectTypesCompletion(result: CompletionResultSet, implicitScopes: KtScope) {
|
||||
val availableClasses = implicitScopes.getClassifierSymbols()
|
||||
val availableClasses = implicitScopes.getClassifierSymbols(scopeNameFilter)
|
||||
availableClasses.forEach { result.addSymbolToCompletion(it) }
|
||||
}
|
||||
|
||||
@@ -106,11 +110,11 @@ private object KotlinAvailableScopesCompletionProvider {
|
||||
val possibleReceiverScope = typeOfPossibleReceiver.getTypeScope() ?: return
|
||||
|
||||
val nonExtensionMembers = possibleReceiverScope
|
||||
.getCallableSymbols()
|
||||
.getCallableSymbols(scopeNameFilter)
|
||||
.filterNot { it.isExtension }
|
||||
|
||||
val extensionNonMembers = implicitScopes
|
||||
.getCallableSymbols()
|
||||
.getCallableSymbols(scopeNameFilter)
|
||||
.filter { it.isExtension && it.hasSuitableExtensionReceiver() }
|
||||
|
||||
nonExtensionMembers.forEach { result.addSymbolToCompletion(it) }
|
||||
@@ -123,11 +127,11 @@ private object KotlinAvailableScopesCompletionProvider {
|
||||
hasSuitableExtensionReceiver: KtCallableSymbol.() -> Boolean,
|
||||
) {
|
||||
val availableNonExtensions = implicitScopes
|
||||
.getCallableSymbols()
|
||||
.getCallableSymbols(scopeNameFilter)
|
||||
.filterNot { it.isExtension }
|
||||
|
||||
val extensionsWhichCanBeCalled = implicitScopes
|
||||
.getCallableSymbols()
|
||||
.getCallableSymbols(scopeNameFilter)
|
||||
.filter { it.isExtension && it.hasSuitableExtensionReceiver() }
|
||||
|
||||
availableNonExtensions.forEach { result.addSymbolToCompletion(it) }
|
||||
|
||||
Reference in New Issue
Block a user