Indexing diagnostics: distinct module roots by name.
[idea/community.git] / platform / lang-impl / src / com / intellij / util / indexing / roots / ModuleIndexableFilesIteratorImpl.kt
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.util.indexing.roots
3
4 import com.intellij.openapi.application.ApplicationManager
5 import com.intellij.openapi.module.Module
6 import com.intellij.openapi.module.ModuleType
7 import com.intellij.openapi.project.Project
8 import com.intellij.openapi.roots.ContentIterator
9 import com.intellij.openapi.roots.ModuleRootManager
10 import com.intellij.openapi.roots.impl.ModuleFileIndexImpl
11 import com.intellij.openapi.vfs.VirtualFile
12 import com.intellij.openapi.vfs.VirtualFileFilter
13 import com.intellij.util.indexing.IndexingBundle
14 import com.intellij.util.indexing.roots.kind.ModuleRootOrigin
15 import com.intellij.util.indexing.roots.kind.ModuleRootOriginImpl
16
17 open class ModuleIndexableFilesPolicy {
18   companion object {
19     fun getInstance() = ApplicationManager.getApplication().getService(ModuleIndexableFilesPolicy::class.java)
20   }
21
22   open fun shouldIndexSeparateRoots() = true
23 }
24
25 internal class ModuleIndexableFilesIteratorImpl(private val module: Module,
26                                                 private val roots: List<VirtualFile>,
27                                                 private val shouldPrintSingleRootInDebugName: Boolean) : ModuleIndexableFilesIterator {
28   companion object {
29     @JvmStatic
30     fun getModuleIterators(module: Module): Collection<ModuleIndexableFilesIteratorImpl> {
31       val fileIndex = ModuleRootManager.getInstance(module).fileIndex as ModuleFileIndexImpl
32       val moduleRoots = fileIndex.moduleRootsToIterate.toList()
33       if (moduleRoots.isEmpty()) return emptyList()
34
35       if (ModuleIndexableFilesPolicy.getInstance().shouldIndexSeparateRoots()) {
36         return moduleRoots.map { ModuleIndexableFilesIteratorImpl(module, listOf(it), moduleRoots.size > 1) }
37       }
38       return listOf(ModuleIndexableFilesIteratorImpl(module, moduleRoots, false))
39     }
40   }
41
42   override fun getDebugName(): String =
43     "Module '${module.name}'" + if (shouldPrintSingleRootInDebugName) {
44       " (" + roots.first().name + ")"
45     }
46     else {
47       ""
48     }
49
50   override fun getIndexingProgressText(): String =
51     if (ModuleType.isInternal(module)) {
52       IndexingBundle.message("indexable.files.provider.indexing.internal.module.name")
53     }
54     else {
55       IndexingBundle.message("indexable.files.provider.indexing.module.name", module.name)
56     }
57
58   override fun getRootsScanningProgressText(): String {
59     if (ModuleType.isInternal(module))
60       return IndexingBundle.message("indexable.files.provider.scanning.internal.module.name")
61     return IndexingBundle.message("indexable.files.provider.scanning.module.name", module.name)
62   }
63
64   override fun getOrigin(): ModuleRootOrigin = ModuleRootOriginImpl(module, roots)
65
66   override fun iterateFiles(
67     project: Project,
68     fileIterator: ContentIterator,
69     fileFilter: VirtualFileFilter
70   ): Boolean {
71     for (root in roots) {
72       ModuleRootManager.getInstance(module).fileIndex.iterateContentUnderDirectory(root, fileIterator, fileFilter)
73     }
74     return true
75   }
76 }