Refactoring: move ModuleSourceRootMap.kt from idea-jvm to idea module

This commit is contained in:
Nikolay Krasko
2018-07-19 18:49:51 +03:00
parent 99e0b998cf
commit d27002827e
@@ -21,46 +21,54 @@ import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.idea.util.projectStructure.allModules import org.jetbrains.kotlin.idea.util.projectStructure.allModules
class ModuleSourceRootGroup(val baseModule: Module, class ModuleSourceRootGroup(
val sourceRootModules: List<Module>) val baseModule: Module,
val sourceRootModules: List<Module>
)
class ModuleSourceRootMap(val modules: Collection<Module>) { class ModuleSourceRootMap(val modules: Collection<Module>) {
private val baseModuleByExternalPath: Map<String, Module> private val baseModuleByExternalPath: Map<String, Module>
@Suppress("JoinDeclarationAndAssignment")
private val allModulesByExternalPath: Map<String, List<Module>> private val allModulesByExternalPath: Map<String, List<Module>>
constructor(project: Project): this(project.allModules()) constructor(project: Project) : this(project.allModules())
init { init {
allModulesByExternalPath = modules allModulesByExternalPath = modules
.filter { it.externalProjectPath != null && it.externalProjectId != null } .filter { it.externalProjectPath != null && it.externalProjectId != null }
.groupBy { it.externalProjectPath!! } .groupBy { it.externalProjectPath!! }
baseModuleByExternalPath = allModulesByExternalPath baseModuleByExternalPath = allModulesByExternalPath
.mapValues { (path, modules) -> .mapValues { (_, modules) ->
modules.reduce { m1, m2 -> modules.reduce { m1, m2 ->
if (isSourceRootPrefix(m2.externalProjectId!!, m1.externalProjectId!!)) m2 else m1 if (isSourceRootPrefix(m2.externalProjectId!!, m1.externalProjectId!!)) m2 else m1
}
} }
}
} }
fun groupByBaseModules(modules: Collection<Module>): List<ModuleSourceRootGroup> { fun groupByBaseModules(modules: Collection<Module>): List<ModuleSourceRootGroup> {
return modules return modules
.groupBy { module -> .groupBy { module ->
val externalPath = module.externalProjectPath val externalPath = module.externalProjectPath
if (externalPath == null) module else (baseModuleByExternalPath[externalPath] ?: module) if (externalPath == null) module else (baseModuleByExternalPath[externalPath] ?: module)
} }
.map { (module, sourceRootModules) -> .map { (module, sourceRootModules) ->
ModuleSourceRootGroup(module, ModuleSourceRootGroup(
if (sourceRootModules.size > 1) sourceRootModules - module else sourceRootModules) module,
} if (sourceRootModules.size > 1) sourceRootModules - module else sourceRootModules
)
}
} }
fun toModuleGroup(module: Module): ModuleSourceRootGroup = groupByBaseModules(listOf(module)).single() fun toModuleGroup(module: Module): ModuleSourceRootGroup = groupByBaseModules(listOf(module)).single()
fun getWholeModuleGroup(module: Module): ModuleSourceRootGroup { fun getWholeModuleGroup(module: Module): ModuleSourceRootGroup {
val externalPath = module.externalProjectPath val externalPath = module.externalProjectPath
val baseModule = (if (externalPath != null) baseModuleByExternalPath[externalPath] else null) ?: val baseModule = (if (externalPath != null) baseModuleByExternalPath[externalPath] else null) ?: return ModuleSourceRootGroup(
return ModuleSourceRootGroup(module, listOf(module)) module,
listOf(module)
)
val externalPathModules = allModulesByExternalPath[externalPath] ?: listOf() val externalPathModules = allModulesByExternalPath[externalPath] ?: listOf()
return ModuleSourceRootGroup(baseModule, if (externalPathModules.size > 1) externalPathModules - module else externalPathModules) return ModuleSourceRootGroup(baseModule, if (externalPathModules.size > 1) externalPathModules - module else externalPathModules)
@@ -70,8 +78,8 @@ class ModuleSourceRootMap(val modules: Collection<Module>) {
fun Module.toModuleGroup() = ModuleSourceRootMap(project).toModuleGroup(this) fun Module.toModuleGroup() = ModuleSourceRootMap(project).toModuleGroup(this)
fun Module.getWholeModuleGroup() = ModuleSourceRootMap(project).getWholeModuleGroup(this) fun Module.getWholeModuleGroup() = ModuleSourceRootMap(project).getWholeModuleGroup(this)
private fun isSourceRootPrefix(externalId: String, previousModuleExternalId: String) private fun isSourceRootPrefix(externalId: String, previousModuleExternalId: String) =
= externalId.length < previousModuleExternalId.length && previousModuleExternalId.startsWith(externalId) externalId.length < previousModuleExternalId.length && previousModuleExternalId.startsWith(externalId)
val Module.externalProjectId: String? val Module.externalProjectId: String?
get() = ExternalSystemApiUtil.getExternalProjectId(this) get() = ExternalSystemApiUtil.getExternalProjectId(this)