ML in SE: Reuse prefix matching features from files in classes (IDEA-278231)

Move features produced by PrefixMatchingUtil up, so that they
can be used for both files and classes

GitOrigin-RevId: 588906a4a4ad680039a541de75de50548c6ac15a
This commit is contained in:
adam.malek
2021-12-03 18:51:25 +00:00
committed by intellij-monorepo-bot
parent 95948310a4
commit 3908fd0a72
3 changed files with 31 additions and 25 deletions
@@ -8,6 +8,7 @@ import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiNamedElement
class SearchEverywhereClassFeaturesProvider : SearchEverywhereClassOrFileFeaturesProvider(ClassSearchEverywhereContributor::class.java) {
companion object {
@@ -26,6 +27,10 @@ class SearchEverywhereClassFeaturesProvider : SearchEverywhereClassOrFileFeature
PRIORITY to elementPriority,
)
(element as? PsiNamedElement)?.name?.let { elementName ->
data.putAll(getNameMatchingFeatures(elementName, searchQuery))
}
data.putIfValueNotNull(IS_DEPRECATED, isDeprecated(presentation))
data.putIfValueNotNull(IS_ACCESSIBLE_FROM_MODULE, isAccessibleFromModule(element, cache?.openedFile))
return data
@@ -17,6 +17,7 @@ import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFileSystemItem
import com.intellij.textMatching.PrefixMatchingUtil
import com.intellij.util.Time
abstract class SearchEverywhereClassOrFileFeaturesProvider(supportedTab: Class<out SearchEverywhereContributor<*>>)
@@ -234,5 +235,25 @@ abstract class SearchEverywhereClassOrFileFeaturesProvider(supportedTab: Class<o
}
}
protected fun getNameMatchingFeatures(nameOfFoundElement: String, searchQuery: String): Map<String, Any> {
fun changeToCamelCase(str: String): String {
val words = str.split('_')
val firstWord = words.first()
if (words.size == 1) {
return firstWord
} else {
return firstWord.plus(
words.subList(1, words.size)
.joinToString(separator = "") { s -> s.replaceFirstChar { it.uppercaseChar() } }
)
}
}
val features = mutableMapOf<String, Any>()
PrefixMatchingUtil.calculateFeatures(nameOfFoundElement, searchQuery, features)
return features.mapKeys { changeToCamelCase(it.key) } // Change snake case to camel case for consistency with other feature names.
.mapValues { if (it.value is Double) roundDouble(it.value as Double) else it.value }
}
protected data class Cache(val fileTypeStats: Map<String, FileTypeUsageSummary>, val openedFile: VirtualFile?)
}
@@ -13,7 +13,6 @@ import com.intellij.openapi.fileEditor.impl.EditorHistoryManager
import com.intellij.openapi.util.io.FileUtil
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFileSystemItem
import com.intellij.textMatching.PrefixMatchingUtil
import com.intellij.util.PathUtil
import com.intellij.util.Time.*
@@ -53,7 +52,11 @@ internal class SearchEverywhereFileFeaturesProvider
SearchEverywhereUsageTriggerCollector.TOTAL_SYMBOLS_AMOUNT_DATA_KEY to searchQuery.length,
)
data.putAll(getNameMatchingFeatures(item, searchQuery))
val nameOfItem = item.virtualFile.nameWithoutExtension
// Remove the directory and the extension if they are present
val fileNameFromQuery = FileUtil.getNameWithoutExtension(PathUtil.getFileName(searchQuery))
data.putAll(getNameMatchingFeatures(nameOfItem, fileNameFromQuery))
if (item.isDirectory) {
// Rest of the features are only applicable to files, not directories
@@ -75,29 +78,6 @@ internal class SearchEverywhereFileFeaturesProvider
return ReadAction.compute<Boolean, Nothing> { favoritesManager.getFavoriteListName(null, item.virtualFile) != null }
}
private fun getNameMatchingFeatures(item: PsiFileSystemItem, searchQuery: String): Map<String, Any> {
fun changeToCamelCase(str: String): String {
val words = str.split('_')
val firstWord = words.first()
if (words.size == 1) {
return firstWord
} else {
return firstWord.plus(
words.subList(1, words.size)
.joinToString(separator = "") { s -> s.replaceFirstChar { it.uppercaseChar() } }
)
}
}
// Remove the directory and the extension if they are present
val filename = FileUtil.getNameWithoutExtension(PathUtil.getFileName(searchQuery))
val features = mutableMapOf<String, Any>()
PrefixMatchingUtil.calculateFeatures(item.virtualFile.nameWithoutExtension, filename, features)
return features.mapKeys { changeToCamelCase(it.key) } // Change snake case to camel case for consistency with other feature names.
.mapValues { if (it.value is Double) roundDouble(it.value as Double) else it.value }
}
private fun isOpened(item: PsiFileSystemItem): Boolean {
val openedFiles = FileEditorManager.getInstance(item.project).openFiles
return item.virtualFile in openedFiles