From 7198b897ab96bac6ab83c1030f1f5f410c2bca00 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 3 Nov 2015 12:29:25 +0300 Subject: [PATCH] Ordering of static members in completion --- .../idea/completion/CompletionSession.kt | 7 +++++-- .../completion/StaticMembersCompletion.kt | 1 - .../kotlin/idea/completion/Weighers.kt | 12 ++++++++++-- .../weighers/basic/StaticMembers.Data1.kt | 5 +++++ .../weighers/basic/StaticMembers.Data2.kt | 8 ++++++++ .../weighers/basic/StaticMembers.Data3.kt | 5 +++++ .../weighers/basic/StaticMembers.Data4.kt | 5 +++++ .../weighers/basic/StaticMembers.Data5.kt | 6 ++++++ .../weighers/basic/StaticMembers.Data6.kt | 5 +++++ .../testData/weighers/basic/StaticMembers.kt | 19 +++++++++++++++++++ .../weighers/AbstractCompletionWeigherTest.kt | 3 +-- .../BasicCompletionWeigherTestGenerated.java | 6 ++++++ .../idea/core/ImportableFqNameClassifier.kt | 4 ++-- 13 files changed, 77 insertions(+), 9 deletions(-) create mode 100644 idea/idea-completion/testData/weighers/basic/StaticMembers.Data1.kt create mode 100644 idea/idea-completion/testData/weighers/basic/StaticMembers.Data2.kt create mode 100644 idea/idea-completion/testData/weighers/basic/StaticMembers.Data3.kt create mode 100644 idea/idea-completion/testData/weighers/basic/StaticMembers.Data4.kt create mode 100644 idea/idea-completion/testData/weighers/basic/StaticMembers.Data5.kt create mode 100644 idea/idea-completion/testData/weighers/basic/StaticMembers.Data6.kt create mode 100644 idea/idea-completion/testData/weighers/basic/StaticMembers.kt 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 020e5536ffe..f419bfa0915 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 @@ -253,7 +253,10 @@ abstract class CompletionSession( protected open fun createSorter(): CompletionSorter { var sorter = CompletionSorter.defaultSorter(parameters, prefixMatcher)!! - sorter = sorter.weighBefore("stats", DeprecatedWeigher, PriorityWeigher, NotImportedWeigher(importableFqNameClassifier), KindWeigher, CallableWeigher) + sorter = sorter.weighBefore("stats", DeprecatedWeigher, PriorityWeigher, + NotImportedWeigher(importableFqNameClassifier), + NotImportedStaticMemberWeigher(importableFqNameClassifier), + KindWeigher, CallableWeigher) sorter = sorter.weighAfter("stats", VariableOrFunctionWeigher, ImportedWeigher(importableFqNameClassifier)) @@ -452,6 +455,6 @@ abstract class CompletionSession( protected fun isImportableDescriptorImported(descriptor: DeclarationDescriptor): Boolean { val classification = importableFqNameClassifier.classify(descriptor.importableFqName!!, false) return classification != ImportableFqNameClassifier.Classification.notImported - && classification != ImportableFqNameClassifier.Classification.hasImportFromSamePackage + && classification != ImportableFqNameClassifier.Classification.siblingImported } } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/StaticMembersCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/StaticMembersCompletion.kt index f62aac81bcc..8758cb8db8b 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/StaticMembersCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/StaticMembersCompletion.kt @@ -68,7 +68,6 @@ class StaticMembersCompletion( //TODO: filter out those that are accessible from SmartCompletion.additionalItems //TODO: what about enum members? //TODO: better presentation for lookup elements from imports too - //TODO: better sorting //TODO: from the same file fun completeFromIndices(indicesHelper: KotlinIndicesHelper) { val descriptorKindFilter = DescriptorKindFilter.CALLABLES exclude DescriptorKindExclude.Extensions 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 030e46857ae..a607b88894d 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 @@ -42,7 +42,7 @@ object PriorityWeigher : LookupElementWeigher("kotlin.priority") { class NotImportedWeigher(private val classifier: ImportableFqNameClassifier) : LookupElementWeigher("kotlin.notImported") { private enum class Weight { default, - hasImportFromSamePackage, + siblingImported, notImported, notToBeUsedInKotlin } @@ -52,7 +52,7 @@ class NotImportedWeigher(private val classifier: ImportableFqNameClassifier) : L val o = element.`object` as? DeclarationLookupObject val fqName = o?.importableFqName ?: return Weight.default return when (classifier.classify(fqName, o is PackageLookupObject)) { - ImportableFqNameClassifier.Classification.hasImportFromSamePackage -> Weight.hasImportFromSamePackage + ImportableFqNameClassifier.Classification.siblingImported -> Weight.siblingImported ImportableFqNameClassifier.Classification.notImported -> Weight.notImported ImportableFqNameClassifier.Classification.notToBeUsedInKotlin -> Weight.notToBeUsedInKotlin else -> Weight.default @@ -60,6 +60,14 @@ class NotImportedWeigher(private val classifier: ImportableFqNameClassifier) : L } } +class NotImportedStaticMemberWeigher(private val classifier: ImportableFqNameClassifier) : LookupElementWeigher("kotlin.notImportedMember") { + override fun weigh(element: LookupElement): Comparable<*>? { + if (element.getUserData(ITEM_PRIORITY_KEY) != ItemPriority.STATIC_MEMBER) return null + val fqName = (element.`object` as DeclarationLookupObject).importableFqName!! + return classifier.classify(fqName.parent(), false) + } +} + class ImportedWeigher(private val classifier: ImportableFqNameClassifier) : LookupElementWeigher("kotlin.imported") { private enum class Weight { currentPackage, diff --git a/idea/idea-completion/testData/weighers/basic/StaticMembers.Data1.kt b/idea/idea-completion/testData/weighers/basic/StaticMembers.Data1.kt new file mode 100644 index 00000000000..5cb05c76921 --- /dev/null +++ b/idea/idea-completion/testData/weighers/basic/StaticMembers.Data1.kt @@ -0,0 +1,5 @@ +package p1 + +object O1 { + fun xxx_fun1FromP1O1(){} +} diff --git a/idea/idea-completion/testData/weighers/basic/StaticMembers.Data2.kt b/idea/idea-completion/testData/weighers/basic/StaticMembers.Data2.kt new file mode 100644 index 00000000000..a43d424fdea --- /dev/null +++ b/idea/idea-completion/testData/weighers/basic/StaticMembers.Data2.kt @@ -0,0 +1,8 @@ +package p2 + +object O1 { +} + +object O2 { + fun xxx_fun1FromP2O2(){} +} diff --git a/idea/idea-completion/testData/weighers/basic/StaticMembers.Data3.kt b/idea/idea-completion/testData/weighers/basic/StaticMembers.Data3.kt new file mode 100644 index 00000000000..5d77fdccff1 --- /dev/null +++ b/idea/idea-completion/testData/weighers/basic/StaticMembers.Data3.kt @@ -0,0 +1,5 @@ +package p3 + +object O1 { + fun xxx_fun1FromP3O1(){} +} diff --git a/idea/idea-completion/testData/weighers/basic/StaticMembers.Data4.kt b/idea/idea-completion/testData/weighers/basic/StaticMembers.Data4.kt new file mode 100644 index 00000000000..16543d7df9b --- /dev/null +++ b/idea/idea-completion/testData/weighers/basic/StaticMembers.Data4.kt @@ -0,0 +1,5 @@ +package p4 + +object O1 { + fun xxx_fun1FromP4O1(){} +} diff --git a/idea/idea-completion/testData/weighers/basic/StaticMembers.Data5.kt b/idea/idea-completion/testData/weighers/basic/StaticMembers.Data5.kt new file mode 100644 index 00000000000..be202507261 --- /dev/null +++ b/idea/idea-completion/testData/weighers/basic/StaticMembers.Data5.kt @@ -0,0 +1,6 @@ +package p5 + +object O1 { + fun xxx_fun1FromP5O1(){} + fun xxx_fun2FromP5O1(){} +} diff --git a/idea/idea-completion/testData/weighers/basic/StaticMembers.Data6.kt b/idea/idea-completion/testData/weighers/basic/StaticMembers.Data6.kt new file mode 100644 index 00000000000..c6eb54db7af --- /dev/null +++ b/idea/idea-completion/testData/weighers/basic/StaticMembers.Data6.kt @@ -0,0 +1,5 @@ +package p6 + +object O1 { + fun xxx_fun1FromP6O1(){} +} diff --git a/idea/idea-completion/testData/weighers/basic/StaticMembers.kt b/idea/idea-completion/testData/weighers/basic/StaticMembers.kt new file mode 100644 index 00000000000..87d11ff69ff --- /dev/null +++ b/idea/idea-completion/testData/weighers/basic/StaticMembers.kt @@ -0,0 +1,19 @@ +package p6 + +import p5.O1.xxx_fun2FromP5O1 +import p4.O1 +import p3.* +import p2.O1 + +fun foo() { + xxx_ +} + +// INVOCATION_COUNT: 2 +// ORDER: xxx_fun2FromP5O1 +// ORDER: xxx_fun1FromP5O1 +// ORDER: xxx_fun1FromP6O1 +// ORDER: xxx_fun1FromP4O1 +// ORDER: xxx_fun1FromP3O1 +// ORDER: xxx_fun1FromP2O2 +// ORDER: xxx_fun1FromP1O1 diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/AbstractCompletionWeigherTest.kt b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/AbstractCompletionWeigherTest.kt index e06f5d34b08..86302366439 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/AbstractCompletionWeigherTest.kt +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/AbstractCompletionWeigherTest.kt @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.test.InTextDirectivesUtils -import org.jetbrains.kotlin.test.KotlinTestUtils import org.jetbrains.kotlin.test.util.configureWithExtraFile import org.junit.Assert import java.io.File @@ -34,7 +33,7 @@ public abstract class AbstractCompletionWeigherTest(val completionType: Completi assert(path.startsWith(pathPrefix)) val relativePath = path.removePrefix(pathPrefix) - myFixture.configureWithExtraFile(relativePath, ".Data", ".Data1", ".Data2", ".Data3", relativePaths = true) + myFixture.configureWithExtraFile(relativePath, ".Data", ".Data1", ".Data2", ".Data3", ".Data4", ".Data5", ".Data6", relativePaths = true) val text = myFixture.getEditor().getDocument().getText() diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/BasicCompletionWeigherTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/BasicCompletionWeigherTestGenerated.java index b7c73e70f58..387f2b2e64d 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/BasicCompletionWeigherTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/weighers/BasicCompletionWeigherTestGenerated.java @@ -155,6 +155,12 @@ public class BasicCompletionWeigherTestGenerated extends AbstractBasicCompletion doTest(fileName); } + @TestMetadata("StaticMembers.kt") + public void testStaticMembers() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/weighers/basic/StaticMembers.kt"); + doTest(fileName); + } + @TestMetadata("idea/idea-completion/testData/weighers/basic/expectedInfo") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ImportableFqNameClassifier.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ImportableFqNameClassifier.kt index da54432f505..95b32a1e8fb 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ImportableFqNameClassifier.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ImportableFqNameClassifier.kt @@ -49,7 +49,7 @@ class ImportableFqNameClassifier(private val file: KtFile) { defaultImport, preciseImport, allUnderImport, - hasImportFromSamePackage, + siblingImported, notImported, notToBeUsedInKotlin } @@ -77,7 +77,7 @@ class ImportableFqNameClassifier(private val file: KtFile) { isImportedWithAllUnderImport(fqName) -> Classification.allUnderImport - hasPreciseImportFromPackage(fqName.parent()) -> Classification.hasImportFromSamePackage + hasPreciseImportFromPackage(fqName.parent()) -> Classification.siblingImported else -> Classification.notImported }