IdeaModuleInfos: cache Module.findImplementedModules

Calling ModuleSourceInfo.expectedBy can be quite costly otherwise
    because creating IdeModifiableModuleProvider is not cheap
This commit is contained in:
Pavel V. Talanov
2018-05-28 17:57:59 +02:00
parent 607fab994c
commit c54967b1b4
@@ -21,7 +21,6 @@ import com.intellij.openapi.util.ModificationTracker
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import com.intellij.util.PathUtil import com.intellij.util.PathUtil
import com.intellij.util.SmartList import com.intellij.util.SmartList
import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.jps.model.java.JavaSourceRootType
@@ -131,8 +130,15 @@ fun Module.findImplementedModuleNames(modelsProvider: IdeModifiableModelsProvide
return facet?.configuration?.settings?.implementedModuleNames ?: emptyList() return facet?.configuration?.settings?.implementedModuleNames ?: emptyList()
} }
fun Module.findImplementedModules(modelsProvider: IdeModifiableModelsProvider) = fun Module.findImplementedModules() = this.cached<List<Module>>(
findImplementedModuleNames(modelsProvider).mapNotNull { modelsProvider.findIdeModule(it) } CachedValueProvider {
val modelsProvider = IdeModifiableModelsProviderImpl(project)
CachedValueProvider.Result(
findImplementedModuleNames(modelsProvider).mapNotNull { modelsProvider.findIdeModule(it) },
ProjectRootModificationTracker.getInstance(project)
)
}
)
interface ModuleSourceInfo : IdeaModuleInfo, TrackableModuleInfo { interface ModuleSourceInfo : IdeaModuleInfo, TrackableModuleInfo {
val module: Module val module: Module
@@ -154,8 +160,7 @@ interface ModuleSourceInfo : IdeaModuleInfo, TrackableModuleInfo {
sealed class ModuleSourceInfoWithExpectedBy(private val forProduction: Boolean) : ModuleSourceInfo { sealed class ModuleSourceInfoWithExpectedBy(private val forProduction: Boolean) : ModuleSourceInfo {
override val expectedBy: List<ModuleSourceInfo> override val expectedBy: List<ModuleSourceInfo>
get() { get() {
val modelsProvider = IdeModifiableModelsProviderImpl(module.project) val expectedByModules = module.findImplementedModules()
val expectedByModules = module.findImplementedModules(modelsProvider)
return expectedByModules.mapNotNull { if (forProduction) it.productionSourceInfo() else it.testSourceInfo() } return expectedByModules.mapNotNull { if (forProduction) it.productionSourceInfo() else it.testSourceInfo() }
} }