in src/org/jetbrains/r/editor/completion/RPackageCompletionUtil.kt [68:104]
fun addCompletionFromIndices(project: Project,
scope: GlobalSearchScope,
originFile: PsiFile,
prefix: String,
shownNames: HashSet<String>,
result: CompletionResultSet,
elementFactory: RLookupElementFactory,
isInternalAccess: Boolean = false) {
val runtimeInfo = originFile.runtimeInfo
val state = RInterpreterStateManager.getCurrentStateOrNull(project) ?: return
var hasElementsWithPrefix = false
if (runtimeInfo != null) {
val loadedPackages = runtimeInfo.loadedPackages
.mapNotNull { state.getSkeletonFileByPackageName(it.key)?.virtualFile?.to(it.value) }
.toMap()
val runtimeScope = GlobalSearchScope.filesScope(originFile.project, loadedPackages.keys).intersectWith(scope)
val lookupElements = mutableMapOf<String, Pair<LookupElement, Int?>>()
processElementsFromIndex(project, runtimeScope, isInternalAccess, elementFactory) { element, file ->
if (shownNames.contains(element.lookupString)) return@processElementsFromIndex
if (element.lookupString.startsWith(prefix)) {
hasElementsWithPrefix = true
}
val previousPriority = lookupElements[element.lookupString]?.second
val currentPriority = loadedPackages[file]
if (previousPriority == null || (currentPriority != null && currentPriority < previousPriority)) {
lookupElements[element.lookupString] = element to currentPriority
}
}
result.addAllElements(lookupElements.values.map { it.first })
shownNames.addAll(lookupElements.keys)
}
if (!hasElementsWithPrefix) {
processElementsFromIndex(project, scope, isInternalAccess, elementFactory) { it, _ ->
if (shownNames.add(it.lookupString)) result.consume(it)
}
}
}