From d7bc7871c5230f51b98b9f0942e641dd41865d0a Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 21 Aug 2015 18:52:10 +0300 Subject: [PATCH] Preference of properties to functions made lower priority in completion --- .../idea/completion/CompletionSession.kt | 4 +- .../kotlin/idea/completion/Weighers.kt | 48 +++++++++++-------- 2 files changed, 31 insertions(+), 21 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 711cf235868..02552f663e4 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 @@ -233,9 +233,9 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC val importableFqNameClassifier = ImportableFqNameClassifier(file) - sorter = sorter.weighBefore("stats", DeprecatedWeigher, PriorityWeigher, NotImportedWeigher(importableFqNameClassifier), KindWeigher) + sorter = sorter.weighBefore("stats", DeprecatedWeigher, PriorityWeigher, NotImportedWeigher(importableFqNameClassifier), KindWeigher, CallableWeigher) - sorter = sorter.weighAfter("stats", ImportedWeigher(importableFqNameClassifier), LocationWeigher(file, parameters.originalFile as JetFile)) + sorter = sorter.weighAfter("stats", VariableOrFunctionWeigher, ImportedWeigher(importableFqNameClassifier), LocationWeigher(file, parameters.originalFile as JetFile)) sorter = sorter.weighBefore("middleMatching", PreferMatchingItemWeigher) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/Weighers.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/Weighers.kt index e3cb14b811a..34f81dc545c 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/Weighers.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/Weighers.kt @@ -109,41 +109,51 @@ object SmartCompletionPriorityWeigher : LookupElementWeigher("kotlin.smartComple object KindWeigher : LookupElementWeigher("kotlin.kind") { private enum class Weight { - variable, // variable or property - function, + enumMember, + callable, keyword, default, packages } - private data class CompoundWeight(val weight: Weight, val callableWeight: CallableWeight? = null) : Comparable { - override fun compareTo(other: CompoundWeight): Int { - if (callableWeight != null && other.callableWeight != null && callableWeight != other.callableWeight) { - return callableWeight.compareTo(other.callableWeight) - } - return weight.compareTo(other.weight) - } - } - - override fun weigh(element: LookupElement): CompoundWeight { + override fun weigh(element: LookupElement): Weight { val o = element.getObject() return when (o) { - is PackageLookupObject -> CompoundWeight(Weight.packages) + is PackageLookupObject -> Weight.packages is DeclarationLookupObject -> { val descriptor = o.descriptor when (descriptor) { - is VariableDescriptor -> CompoundWeight(Weight.variable, element.getUserData(CALLABLE_WEIGHT_KEY)) - is FunctionDescriptor -> CompoundWeight(Weight.function, element.getUserData(CALLABLE_WEIGHT_KEY)) - is ClassDescriptor -> if (descriptor.kind == ClassKind.ENUM_ENTRY) CompoundWeight(Weight.variable) else CompoundWeight(Weight.default) - else -> CompoundWeight(Weight.default) + is VariableDescriptor, is FunctionDescriptor -> Weight.callable + is ClassDescriptor -> if (descriptor.kind == ClassKind.ENUM_ENTRY) Weight.enumMember else Weight.default + else -> Weight.default } } - is KeywordLookupObject -> CompoundWeight(Weight.keyword) + is KeywordLookupObject -> Weight.keyword - else -> CompoundWeight(Weight.default) + else -> Weight.default + } + } +} + +object CallableWeigher : LookupElementWeigher("kotlin.callableWeight") { + override fun weigh(element: LookupElement) = element.getUserData(CALLABLE_WEIGHT_KEY) +} + +object VariableOrFunctionWeigher : LookupElementWeigher("kotlin.variableOrFunction"){ + private enum class Weight { + variable, + function + } + + override fun weigh(element: LookupElement): Weight? { + val descriptor = (element.`object` as? DeclarationLookupObject)?.descriptor ?: return null + return when (descriptor) { + is VariableDescriptor -> Weight.variable + is FunctionDescriptor -> Weight.function + else -> null } } }