From 582443ea7bc7ebc20b6089376e31a0de47bbb810 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 28 Oct 2015 20:23:24 +0300 Subject: [PATCH] More efficient filtering of runtime receiver type variants in debugger --- .../idea/completion/CompletionSession.kt | 21 ++++++++++++++++--- .../codeFragments/runtimeType/runtimeCast.kt | 11 +++++++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt index 432b98b7e8e..3163d469f9a 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt @@ -55,6 +55,7 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.typeUtil.makeNotNullable import org.jetbrains.kotlin.util.capitalizeDecapitalize.decapitalizeSmart import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance +import java.util.* class CompletionSessionConfiguration( val completeNonImportedDeclarations: Boolean, @@ -337,12 +338,26 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC if (runtimeType == null || runtimeType == type) return null val (variants, notImportedExtensions) = collectReferenceVariants(descriptorKindFilter!!, ExpressionReceiver(explicitReceiver, runtimeType)) - val normalVariants = referenceVariants!!.imported + referenceVariants!!.notImportedExtensions - val filteredVariants = variants.filter { descriptor -> normalVariants.none { compareDescriptors(project, it, descriptor) } } - val filteredNotImportedExtensions = notImportedExtensions.filter { descriptor -> normalVariants.none { compareDescriptors(project, it, descriptor) } } + val filteredVariants = filterVariantsForRuntimeReceiverType(variants, referenceVariants!!.imported) + val filteredNotImportedExtensions = filterVariantsForRuntimeReceiverType(notImportedExtensions, referenceVariants!!.notImportedExtensions) return ReferenceVariants(filteredVariants, filteredNotImportedExtensions) } + private fun filterVariantsForRuntimeReceiverType( + runtimeVariants: Collection, + baseVariants: Collection + ): Collection { + val baseVariantsByName = baseVariants.groupBy { it.name } + val result = ArrayList() + for (variant in runtimeVariants) { + val candidates = baseVariantsByName[variant.name] + if (candidates == null || candidates.none { compareDescriptors(project, variant, it) }) { + result.add(variant) + } + } + return result + } + protected fun shouldCompleteTopLevelCallablesFromIndex(): Boolean { if (!configuration.completeNonImportedDeclarations) return false if ((descriptorKindFilter?.kindMask ?: 0).and(DescriptorKindFilter.CALLABLES_MASK) == 0) return false diff --git a/idea/idea-completion/testData/basic/codeFragments/runtimeType/runtimeCast.kt b/idea/idea-completion/testData/basic/codeFragments/runtimeType/runtimeCast.kt index 34a95239b43..08b83c17a37 100644 --- a/idea/idea-completion/testData/basic/codeFragments/runtimeType/runtimeCast.kt +++ b/idea/idea-completion/testData/basic/codeFragments/runtimeType/runtimeCast.kt @@ -8,16 +8,25 @@ open class Base { open fun funWithOverride() { } open fun funWithoutOverride() { } + + fun funInBoth() { } } class Derived: Base() { fun funInDerived() { } override fun funWithOverride() { } + + fun funInBoth(p: Int) { } } // INVOCATION_COUNT: 1 -// EXIST: funInBase, funWithOverride, funWithoutOverride, funInDerived +// EXIST: funInBase +// EXIST: funWithOverride +// EXIST: funWithoutOverride +// EXIST: funInDerived +// EXIST: { itemText: "funInBoth", tailText: "()", attributes: "bold" } +// EXIST: { itemText: "funInBoth", tailText: "(p: Int)", attributes: "grayed" } // NOTHING_ELSE