[FIR-IDE] Minor: refactor completion contributor
This commit is contained in:
+11
-32
@@ -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) }
|
||||||
|
|||||||
Reference in New Issue
Block a user