diff --git a/platform/projectModel-api/src/com/intellij/openapi/module/ModuleGrouper.kt b/platform/projectModel-api/src/com/intellij/openapi/module/ModuleGrouper.kt index 49b29652bd97..fc5cb9d7bba4 100644 --- a/platform/projectModel-api/src/com/intellij/openapi/module/ModuleGrouper.kt +++ b/platform/projectModel-api/src/com/intellij/openapi/module/ModuleGrouper.kt @@ -17,9 +17,7 @@ package com.intellij.openapi.module import com.intellij.openapi.project.Project import com.intellij.openapi.util.registry.Registry -import com.intellij.openapi.util.text.StringUtil import org.jetbrains.annotations.ApiStatus -import java.util.* /** * Use this class to determine how modules show by organized in a tree. It supports the both ways of module grouping: the old one where @@ -64,59 +62,10 @@ abstract class ModuleGrouper { @JvmStatic @JvmOverloads fun instanceFor(project: Project, moduleModel: ModifiableModuleModel? = null): ModuleGrouper { - val hasGroups = moduleModel?.hasModuleGroups() ?: ModuleManager.getInstance(project).hasModuleGroups() - if (!isQualifiedModuleNamesEnabled(project) || hasGroups) { - return ExplicitModuleGrouper(project, moduleModel) - } - return QualifiedNameGrouper(project, moduleModel) + return ModuleManager.getInstance(project).getModuleGrouper(moduleModel) } } } fun isQualifiedModuleNamesEnabled(project: Project) = Registry.`is`("project.qualified.module.names") && !ModuleManager.getInstance(project).hasModuleGroups() - -private abstract class ModuleGrouperBase(protected val project: Project, protected val model: ModifiableModuleModel?) : ModuleGrouper() { - override fun getAllModules(): Array = model?.modules ?: ModuleManager.getInstance(project).modules - - protected fun getModuleName(module: Module) = model?.getNewName(module) ?: module.name - - override fun getShortenedName(module: Module) = getShortenedNameByFullModuleName(getModuleName(module)) -} - -private class QualifiedNameGrouper(project: Project, model: ModifiableModuleModel?) : ModuleGrouperBase(project, model) { - override fun getGroupPath(module: Module): List { - return getGroupPathByModuleName(getModuleName(module)) - } - - override fun getGroupPath(description: ModuleDescription) = getGroupPathByModuleName(description.name) - - override fun getShortenedNameByFullModuleName(name: String) = StringUtil.getShortName(name) - - override fun getGroupPathByModuleName(name: String) = name.split('.').dropLast(1) - - override fun getModuleAsGroupPath(module: Module) = getModuleName(module).split('.') - - override fun getModuleAsGroupPath(description: ModuleDescription) = description.name.split('.') -} - -private class ExplicitModuleGrouper(project: Project, model: ModifiableModuleModel?): ModuleGrouperBase(project, model) { - override fun getGroupPath(module: Module): List { - val path = if (model != null) model.getModuleGroupPath(module) else ModuleManager.getInstance(project).getModuleGroupPath(module) - return if (path != null) Arrays.asList(*path) else emptyList() - } - - override fun getGroupPath(description: ModuleDescription) = when (description) { - is LoadedModuleDescription -> getGroupPath(description.module) - is UnloadedModuleDescription -> description.groupPath - else -> throw IllegalArgumentException(description.javaClass.name) - } - - override fun getShortenedNameByFullModuleName(name: String) = name - - override fun getGroupPathByModuleName(name: String): List = emptyList() - - override fun getModuleAsGroupPath(module: Module) = null - - override fun getModuleAsGroupPath(description: ModuleDescription) = null -} diff --git a/platform/projectModel-api/src/com/intellij/openapi/module/ModuleManager.java b/platform/projectModel-api/src/com/intellij/openapi/module/ModuleManager.java index 8a8028d91252..c6533504cccb 100644 --- a/platform/projectModel-api/src/com/intellij/openapi/module/ModuleManager.java +++ b/platform/projectModel-api/src/com/intellij/openapi/module/ModuleManager.java @@ -188,6 +188,9 @@ public abstract class ModuleManager extends SimpleModificationTracker { @Nullable public abstract UnloadedModuleDescription getUnloadedModuleDescription(@NotNull String moduleName); + @NotNull + public abstract ModuleGrouper getModuleGrouper(@Nullable ModifiableModuleModel model); + /** * Specify list of modules which will be unloaded from the project. * @see UnloadedModuleDescription diff --git a/platform/projectModel-impl/src/com/intellij/openapi/module/EmptyModuleManager.kt b/platform/projectModel-impl/src/com/intellij/openapi/module/EmptyModuleManager.kt index 7b41113790a3..18ed41bf8833 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/module/EmptyModuleManager.kt +++ b/platform/projectModel-impl/src/com/intellij/openapi/module/EmptyModuleManager.kt @@ -15,11 +15,12 @@ */ package com.intellij.openapi.module +import com.intellij.openapi.module.impl.createGrouper import com.intellij.openapi.project.Project import com.intellij.util.messages.MessageBus import org.jetbrains.annotations.NotNull -class EmptyModuleManager(project: Project, messageBus: MessageBus) : ModuleManager() { +class EmptyModuleManager(private val project: Project, messageBus: MessageBus) : ModuleManager() { override fun hasModuleGroups() = false override fun newModule(filePath: String, moduleTypeId: String) = throw UnsupportedOperationException() @@ -52,6 +53,10 @@ class EmptyModuleManager(project: Project, messageBus: MessageBus) : ModuleManag override fun setUnloadedModules(unloadedModuleNames: MutableList) { } + override fun getModuleGrouper(model: ModifiableModuleModel?): ModuleGrouper { + return createGrouper(project, model) + } + override fun getAllModuleDescriptions() = emptyList() override fun getUnloadedModuleDescriptions() = emptyList() diff --git a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java index b11c0147cad6..6dcbde1ccb7b 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java @@ -1056,6 +1056,12 @@ public abstract class ModuleManagerImpl extends ModuleManager implements Disposa return myUnloadedModules.get(moduleName); } + @NotNull + @Override + public ModuleGrouper getModuleGrouper(@Nullable ModifiableModuleModel model) { + return ModuleGroupersKt.createGrouper(myProject, model); + } + @Override public void setUnloadedModules(@NotNull List unloadedModuleNames) { if (myUnloadedModules.keySet().equals(new HashSet<>(unloadedModuleNames))) { diff --git a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/moduleGroupers.kt b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/moduleGroupers.kt new file mode 100644 index 000000000000..188e111a6155 --- /dev/null +++ b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/moduleGroupers.kt @@ -0,0 +1,63 @@ +// Copyright 2000-2018 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. +package com.intellij.openapi.module.impl + +import com.intellij.openapi.module.* +import com.intellij.openapi.project.Project +import com.intellij.openapi.util.text.StringUtil +import java.util.* + +/** + * @author nik + */ +internal fun createGrouper(project: Project, moduleModel: ModifiableModuleModel? = null): ModuleGrouper { + val hasGroups = moduleModel?.hasModuleGroups() ?: ModuleManager.getInstance(project).hasModuleGroups() + if (!isQualifiedModuleNamesEnabled(project) || hasGroups) { + return ExplicitModuleGrouper(project, moduleModel) + } + return QualifiedNameGrouper(project, moduleModel) +} + +private abstract class ModuleGrouperBase(protected val project: Project, protected val model: ModifiableModuleModel?) : ModuleGrouper() { + override fun getAllModules(): Array = model?.modules ?: ModuleManager.getInstance(project).modules + + protected fun getModuleName(module: Module) = model?.getNewName(module) ?: module.name + + override fun getShortenedName(module: Module) = getShortenedNameByFullModuleName(getModuleName(module)) +} + +private class QualifiedNameGrouper(project: Project, model: ModifiableModuleModel?) : ModuleGrouperBase(project, model) { + override fun getGroupPath(module: Module): List { + return getGroupPathByModuleName(getModuleName(module)) + } + + override fun getGroupPath(description: ModuleDescription) = getGroupPathByModuleName(description.name) + + override fun getShortenedNameByFullModuleName(name: String) = StringUtil.getShortName(name) + + override fun getGroupPathByModuleName(name: String) = name.split('.').dropLast(1) + + override fun getModuleAsGroupPath(module: Module) = getModuleName(module).split('.') + + override fun getModuleAsGroupPath(description: ModuleDescription) = description.name.split('.') +} + +private class ExplicitModuleGrouper(project: Project, model: ModifiableModuleModel?): ModuleGrouperBase(project, model) { + override fun getGroupPath(module: Module): List { + val path = if (model != null) model.getModuleGroupPath(module) else ModuleManager.getInstance(project).getModuleGroupPath(module) + return if (path != null) Arrays.asList(*path) else emptyList() + } + + override fun getGroupPath(description: ModuleDescription) = when (description) { + is LoadedModuleDescription -> getGroupPath(description.module) + is UnloadedModuleDescription -> description.groupPath + else -> throw IllegalArgumentException(description.javaClass.name) + } + + override fun getShortenedNameByFullModuleName(name: String) = name + + override fun getGroupPathByModuleName(name: String): List = emptyList() + + override fun getModuleAsGroupPath(module: Module) = null + + override fun getModuleAsGroupPath(description: ModuleDescription) = null +}