From 68c0c838795d2f595bb645918896d5c25dd7d44c Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 21 Aug 2015 14:20:23 +0300 Subject: [PATCH] Better sorting: current package is preferred --- .../basic/LocalFileBeforeImported.Data1.kt | 3 ++ .../weighers/basic/LocalFileBeforeImported.kt | 11 +++++-- .../core/SymbolUsageProximityPrioritizer.kt | 29 ++++++++++--------- 3 files changed, 27 insertions(+), 16 deletions(-) create mode 100644 idea/idea-completion/testData/weighers/basic/LocalFileBeforeImported.Data1.kt diff --git a/idea/idea-completion/testData/weighers/basic/LocalFileBeforeImported.Data1.kt b/idea/idea-completion/testData/weighers/basic/LocalFileBeforeImported.Data1.kt new file mode 100644 index 00000000000..00d298c2d38 --- /dev/null +++ b/idea/idea-completion/testData/weighers/basic/LocalFileBeforeImported.Data1.kt @@ -0,0 +1,3 @@ +package test + +fun fooFromSamePackage() = 12 diff --git a/idea/idea-completion/testData/weighers/basic/LocalFileBeforeImported.kt b/idea/idea-completion/testData/weighers/basic/LocalFileBeforeImported.kt index 986affc6563..17070c79e95 100644 --- a/idea/idea-completion/testData/weighers/basic/LocalFileBeforeImported.kt +++ b/idea/idea-completion/testData/weighers/basic/LocalFileBeforeImported.kt @@ -1,12 +1,19 @@ +package test + import some.fooImported val fooVar = 12 -fun fooLocal() = 12 +fun fooCurentFile() = 12 val some = foo // "foo" is before other elements because of exact prefix match -// ORDER: foo, fooVar, fooLocal, fooImported, fooNotImported +// ORDER: foo +// ORDER: fooVar +// ORDER: fooCurentFile +// ORDER: fooFromSamePackage +// ORDER: fooImported +// ORDER: fooNotImported // INVOCATION_COUNT: 2 // SELECTED: 0 \ No newline at end of file diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/SymbolUsageProximityPrioritizer.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/SymbolUsageProximityPrioritizer.kt index 403c92887d6..4a5984d6b08 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/SymbolUsageProximityPrioritizer.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/SymbolUsageProximityPrioritizer.kt @@ -31,7 +31,7 @@ class SymbolUsageProximityPrioritizer(private val file: JetFile) { private val thisModule = ModuleUtilCore.findModuleForPsiElement(file) private enum class PriorityBasedOnImports { - thisFile, + thisPackage, defaultImport, preciseImport, allUnderImport, @@ -41,13 +41,14 @@ class SymbolUsageProximityPrioritizer(private val file: JetFile) { notToBeUsedInKotlin } - private enum class PriorityBasedOnModule { + private enum class PriorityBasedOnLocation { + thisFile, thisModule, project, other } - data class Priority(private val priority1: PriorityBasedOnImports, private val priority2: PriorityBasedOnModule) : Comparable { + data class Priority(private val priority1: PriorityBasedOnImports, private val priority2: PriorityBasedOnLocation) : Comparable { override fun compareTo(other: Priority): Int { val c1 = priority1.compareTo(other.priority1) if (c1 != 0) return c1 @@ -55,16 +56,14 @@ class SymbolUsageProximityPrioritizer(private val file: JetFile) { } companion object { - val DEFAULT = Priority(PriorityBasedOnImports.default, PriorityBasedOnModule.other) + val DEFAULT = Priority(PriorityBasedOnImports.default, PriorityBasedOnLocation.other) } } fun priority(fqName: FqName, declaration: PsiElement?, isPackage: Boolean) - = Priority(priorityBasedOnImports(fqName, declaration, isPackage), priorityBasedOnModule(declaration)) - - private fun priorityBasedOnImports(fqName: FqName, declaration: PsiElement?, isPackage: Boolean): PriorityBasedOnImports { - if (declaration?.containingFile == file) return PriorityBasedOnImports.thisFile + = Priority(priorityBasedOnImports(fqName, isPackage), priorityBasedOnLocation(declaration)) + private fun priorityBasedOnImports(fqName: FqName, isPackage: Boolean): PriorityBasedOnImports { val importPath = ImportPath(fqName, false) if (isPackage) { @@ -76,7 +75,8 @@ class SymbolUsageProximityPrioritizer(private val file: JetFile) { return when { JavaToKotlinClassMap.INSTANCE.mapPlatformClass(fqName).isNotEmpty() -> PriorityBasedOnImports.notToBeUsedInKotlin - ImportInsertHelper.getInstance(file.getProject()).isImportedWithDefault(importPath, file) -> PriorityBasedOnImports.defaultImport + fqName.parent() == file.packageFqName -> PriorityBasedOnImports.thisPackage + ImportInsertHelper.getInstance(file.project).isImportedWithDefault(importPath, file) -> PriorityBasedOnImports.defaultImport importCache.isImportedWithPreciseImport(fqName) -> PriorityBasedOnImports.preciseImport importCache.isImportedWithAllUnderImport(fqName) -> PriorityBasedOnImports.allUnderImport importCache.hasPreciseImportFromPackage(fqName.parent()) -> PriorityBasedOnImports.hasImportFromSamePackage @@ -84,12 +84,13 @@ class SymbolUsageProximityPrioritizer(private val file: JetFile) { } } - private fun priorityBasedOnModule(declaration: PsiElement?): PriorityBasedOnModule { + private fun priorityBasedOnLocation(declaration: PsiElement?): PriorityBasedOnLocation { return when { - declaration == null -> PriorityBasedOnModule.other - ModuleUtilCore.findModuleForPsiElement(declaration) == thisModule -> PriorityBasedOnModule.thisModule - ProjectRootsUtil.isInProjectSource(declaration) -> PriorityBasedOnModule.project - else -> PriorityBasedOnModule.other + declaration == null -> PriorityBasedOnLocation.other + declaration.containingFile == file -> PriorityBasedOnLocation.thisFile + ModuleUtilCore.findModuleForPsiElement(declaration) == thisModule -> PriorityBasedOnLocation.thisModule + ProjectRootsUtil.isInProjectSource(declaration) -> PriorityBasedOnLocation.project + else -> PriorityBasedOnLocation.other } }