[FIR-IDE] Minor: refactor completion contributor

This commit is contained in:
Pavel Kirpichenkov
2020-09-03 13:47:16 +03:00
parent c3aeaa9052
commit 177fcefa68
@@ -18,9 +18,7 @@ import org.jetbrains.kotlin.idea.frontend.api.scopes.KtScope
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol 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.KtSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtNamedSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtNamedSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtPossibleExtensionSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.isExtension 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.idea.references.mainReference
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
@@ -82,17 +80,14 @@ private object KotlinAvailableScopesCompletionProvider {
with(getAnalysisSessionFor(originalFile).createContextDependentCopy()) { with(getAnalysisSessionFor(originalFile).createContextDependentCopy()) {
val (implicitScopes, _) = originalFile.getScopeContextForPosition(nameExpression) val (implicitScopes, _) = originalFile.getScopeContextForPosition(nameExpression)
fun KtCallableSymbol.hasSuitableExtensionReceiver(): Boolean =
checkExtensionIsSuitable(originalFile, parameters.originalPosition, nameExpression, explicitReceiver)
when { when {
nameExpression.parent is KtUserType -> collectTypesCompletion(result, implicitScopes) nameExpression.parent is KtUserType -> collectTypesCompletion(result, implicitScopes)
explicitReceiver != null -> collectDotCompletion( explicitReceiver != null ->
result, collectDotCompletion(result, implicitScopes, explicitReceiver, KtCallableSymbol::hasSuitableExtensionReceiver)
implicitScopes, else -> collectDefaultCompletion(result, implicitScopes, KtCallableSymbol::hasSuitableExtensionReceiver)
explicitReceiver,
nameExpression,
originalFile,
parameters.originalPosition
)
else -> collectDefaultCompletion(result, implicitScopes, nameExpression, originalFile, parameters.originalPosition)
} }
} }
} }
@@ -106,9 +101,7 @@ private object KotlinAvailableScopesCompletionProvider {
result: CompletionResultSet, result: CompletionResultSet,
implicitScopes: KtCompositeScope, implicitScopes: KtCompositeScope,
explicitReceiver: KtExpression, explicitReceiver: KtExpression,
nameExpression: KtSimpleNameExpression, hasSuitableExtensionReceiver: KtCallableSymbol.() -> Boolean
originalFile: KtFile,
originalPosition: PsiElement?,
) { ) {
val typeOfPossibleReceiver = explicitReceiver.getKtType() val typeOfPossibleReceiver = explicitReceiver.getKtType()
val possibleReceiverScope = typeOfPossibleReceiver.getTypeScope() ?: return val possibleReceiverScope = typeOfPossibleReceiver.getTypeScope() ?: return
@@ -119,25 +112,16 @@ private object KotlinAvailableScopesCompletionProvider {
val extensionNonMembers = implicitScopes val extensionNonMembers = implicitScopes
.getCallableSymbols() .getCallableSymbols()
.filter { .filter { it.isExtension && it.hasSuitableExtensionReceiver() }
it.isExtension && it.checkExtensionIsSuitable(
originalFile,
originalPosition,
nameExpression,
explicitReceiver
)
}
nonExtensionMembers.forEach { result.addSymbolToCompletion(it) } nonExtensionMembers.forEach { result.addSymbolToCompletion(it) }
extensionNonMembers.forEach { result.addSymbolToCompletion(it) } extensionNonMembers.forEach { result.addSymbolToCompletion(it) }
} }
private fun KtAnalysisSession.collectDefaultCompletion( private fun collectDefaultCompletion(
result: CompletionResultSet, result: CompletionResultSet,
implicitScopes: KtCompositeScope, implicitScopes: KtCompositeScope,
nameExpression: KtSimpleNameExpression, hasSuitableExtensionReceiver: KtCallableSymbol.() -> Boolean,
originalFile: KtFile,
originalPosition: PsiElement?,
) { ) {
val availableNonExtensions = implicitScopes val availableNonExtensions = implicitScopes
.getCallableSymbols() .getCallableSymbols()
@@ -146,12 +130,7 @@ private object KotlinAvailableScopesCompletionProvider {
val extensionsWhichCanBeCalled = implicitScopes val extensionsWhichCanBeCalled = implicitScopes
.getCallableSymbols() .getCallableSymbols()
.filter { .filter {
it.isExtension && it.checkExtensionIsSuitable( it.isExtension && it.hasSuitableExtensionReceiver()
originalFile,
originalPosition,
nameExpression,
null
)
} }
availableNonExtensions.forEach { result.addSymbolToCompletion(it) } availableNonExtensions.forEach { result.addSymbolToCompletion(it) }