From e05c20b5c0e3471201b1b71ca7b979f6a3c62320 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 16 Jul 2015 17:58:52 +0300 Subject: [PATCH] Completion: fixed ordering for packages + exclude for package items supported too --- .../idea/completion/CompletionSorting.kt | 12 ++++++-- .../idea/completion/LookupElementFactory.kt | 29 ++++++++++--------- .../testData/weighers/basic/Packages.Data.kt | 5 ++++ .../testData/weighers/basic/Packages.Data1.kt | 3 ++ .../testData/weighers/basic/Packages.kt | 10 +++++++ .../BasicCompletionWeigherTestGenerated.java | 6 ++++ 6 files changed, 49 insertions(+), 16 deletions(-) create mode 100644 idea/idea-completion/testData/weighers/basic/Packages.Data.kt create mode 100644 idea/idea-completion/testData/weighers/basic/Packages.Data1.kt create mode 100644 idea/idea-completion/testData/weighers/basic/Packages.kt diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSorting.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSorting.kt index b3feb91d44b..4599210c11b 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSorting.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSorting.kt @@ -90,12 +90,13 @@ private object KindWeigher : LookupElementWeigher("kotlin.kind") { val o = element.getObject() return when (o) { + is PackageLookupObject -> CompoundWeight(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 PackageViewDescriptor -> CompoundWeight(Weight.packages) else -> CompoundWeight(Weight.default) } } @@ -144,9 +145,16 @@ private class DeclarationRemotenessWeigher(private val file: JetFile) : LookupEl } val fqName = o.importableFqName - // Invalid name can be met for companion object descriptor: Test.MyTest.A..testOther if (fqName != null) { val importPath = ImportPath(fqName, false) + + if (o is PackageLookupObject) { + return when { + importCache.isImportedWithPreciseImport(fqName) -> Weight.preciseImport + else -> Weight.default + } + } + return when { JavaToKotlinClassMap.INSTANCE.mapPlatformClass(fqName).isNotEmpty() -> Weight.notToBeUsedInKotlin ImportInsertHelper.getInstance(file.getProject()).isImportedWithDefault(importPath, file) -> Weight.kotlinDefaultImport diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt index 2f4bb767736..1055b0a3b0f 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt @@ -42,6 +42,20 @@ import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.types.TypeUtils import javax.swing.Icon +public data class PackageLookupObject(val fqName: FqName) : DeclarationLookupObject { + override val psiElement: PsiElement? get() = null + + override val descriptor: DeclarationDescriptor? get() = null + + override val name: Name get() = fqName.shortName() + + override val importableFqName: FqName get() = fqName + + override val isDeprecated: Boolean get() = false + + override fun getIcon(flags: Int) = PlatformIcons.PACKAGE_ICON +} + public class LookupElementFactory( private val resolutionFacade: ResolutionFacade, private val receiverTypes: Collection @@ -142,8 +156,7 @@ public class LookupElementFactory( } public fun createLookupElementForPackage(name: FqName): LookupElement { - val shortName = name.shortName() - var element = LookupElementBuilder.create(PackageLookupObject(shortName), shortName.asString()) + var element = LookupElementBuilder.create(PackageLookupObject(name), name.shortName().asString()) element = element.withInsertHandler(BaseDeclarationInsertHandler()) @@ -154,18 +167,6 @@ public class LookupElementFactory( return element.withIconFromLookupObject() } - private data class PackageLookupObject(override val name: Name) : DeclarationLookupObject { - override val psiElement: PsiElement? get() = null - - override val descriptor: DeclarationDescriptor? get() = null - - override val importableFqName: FqName? get() = null - - override val isDeprecated: Boolean get() = false - - override fun getIcon(flags: Int) = PlatformIcons.PACKAGE_ICON - } - private fun createLookupElement( descriptor: DeclarationDescriptor, declaration: PsiElement?, diff --git a/idea/idea-completion/testData/weighers/basic/Packages.Data.kt b/idea/idea-completion/testData/weighers/basic/Packages.Data.kt new file mode 100644 index 00000000000..752edb89ae6 --- /dev/null +++ b/idea/idea-completion/testData/weighers/basic/Packages.Data.kt @@ -0,0 +1,5 @@ +package my.koza + +class K + +fun kokoFun(){} \ No newline at end of file diff --git a/idea/idea-completion/testData/weighers/basic/Packages.Data1.kt b/idea/idea-completion/testData/weighers/basic/Packages.Data1.kt new file mode 100644 index 00000000000..34e14e27953 --- /dev/null +++ b/idea/idea-completion/testData/weighers/basic/Packages.Data1.kt @@ -0,0 +1,3 @@ +package kotlin + +class K1 diff --git a/idea/idea-completion/testData/weighers/basic/Packages.kt b/idea/idea-completion/testData/weighers/basic/Packages.kt new file mode 100644 index 00000000000..4b23fb67aa8 --- /dev/null +++ b/idea/idea-completion/testData/weighers/basic/Packages.kt @@ -0,0 +1,10 @@ +import my.koza + +class A { + val v = ko +} + +// INVOCATION_COUNT: 2 +// ORDER: kokoFun +// ORDER: koza +// ORDER: kotlin 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 c378b9a6ab2..f5f4aed2f15 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 @@ -119,6 +119,12 @@ public class BasicCompletionWeigherTestGenerated extends AbstractBasicCompletion doTest(fileName); } + @TestMetadata("Packages.kt") + public void testPackages() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/weighers/basic/Packages.kt"); + doTest(fileName); + } + @TestMetadata("ParametersBeforeKeywords.kt") public void testParametersBeforeKeywords() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/weighers/basic/ParametersBeforeKeywords.kt");