diff --git a/plugins/kotlin/base/analysis-api/analysis-api-utils/src/org/jetbrains/kotlin/idea/base/analysis/api/utils/KtSymbolFromIndexProvider.kt b/plugins/kotlin/base/analysis-api/analysis-api-utils/src/org/jetbrains/kotlin/idea/base/analysis/api/utils/KtSymbolFromIndexProvider.kt index 8f22f68723e3..d12aa528b467 100644 --- a/plugins/kotlin/base/analysis-api/analysis-api-utils/src/org/jetbrains/kotlin/idea/base/analysis/api/utils/KtSymbolFromIndexProvider.kt +++ b/plugins/kotlin/base/analysis-api/analysis-api-utils/src/org/jetbrains/kotlin/idea/base/analysis/api/utils/KtSymbolFromIndexProvider.kt @@ -306,6 +306,36 @@ class KtSymbolFromIndexProvider( resolveExtensionScopeWithTopLevelDeclarations.callables(nameFilter) .filterNot { it.isExtension } + /** + * Returns top-level callables, including extensions. + */ + context(KaSession) + @OptIn(KaExperimentalApi::class) + fun getTopLevelCallableSymbolsByNameFilterIncludingExtensions( + nameFilter: (Name) -> Boolean, + scope: GlobalSearchScope = analysisScope, + psiFilter: (KtCallableDeclaration) -> Boolean = { true } + ): Sequence = sequenceOf( + KotlinTopLevelFunctionFqnNameIndex, + KotlinTopLevelPropertyFqnNameIndex, + ).flatMap { helper -> + val results = mutableListOf() + val processor = cancelableCollectFilterProcessor(results) { declaration: KtCallableDeclaration -> + declaration.isAcceptable(psiFilter) + } + + helper.processAllElements( + project = project, + scope = scope, + filter = { nameFilter(getShortName(it)) }, + processor = processor, + ) + + results + }.map { it.symbol } + .filterIsInstance() + + resolveExtensionScopeWithTopLevelDeclarations.callables(nameFilter) + context(KaSession) @OptIn(KaExperimentalApi::class) fun getExtensionCallableSymbolsByName( diff --git a/plugins/kotlin/completion/impl-k2/src/org/jetbrains/kotlin/idea/completion/impl/k2/lookups/TailTextProvider.kt b/plugins/kotlin/completion/impl-k2/src/org/jetbrains/kotlin/idea/completion/impl/k2/lookups/TailTextProvider.kt index 6e2a0e948281..e10ea99c7012 100644 --- a/plugins/kotlin/completion/impl-k2/src/org/jetbrains/kotlin/idea/completion/impl/k2/lookups/TailTextProvider.kt +++ b/plugins/kotlin/completion/impl-k2/src/org/jetbrains/kotlin/idea/completion/impl/k2/lookups/TailTextProvider.kt @@ -3,6 +3,7 @@ package org.jetbrains.kotlin.idea.completion.lookups +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.analysis.api.KaExperimentalApi import org.jetbrains.kotlin.analysis.api.KaSession import org.jetbrains.kotlin.analysis.api.signatures.KaCallableSignature @@ -18,14 +19,22 @@ import org.jetbrains.kotlin.idea.completion.lookups.CompletionShortNamesRenderer import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.renderer.render -internal object TailTextProvider { +@ApiStatus.Internal +object TailTextProvider { context(KaSession) fun getTailText( signature: KaCallableSignature<*>, - ): String = buildString { + ): String { // use unsubstituted type when rendering receiver type of extension val symbol = signature.symbol + return getTailText(symbol) + } + + context(KaSession) + fun getTailText( + symbol: KaCallableSymbol, + ): String = buildString { symbol.receiverType?.let { renderReceiverType(it) } symbol.getContainerPresentation(isFunctionalVariableCall = false)?.let { append(it) }