fun addCompletionFromIndices()

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)
      }
    }
  }