From 9de29699386e9136a35b7853c489924dbe0bcc7f Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 2 Jun 2017 20:40:37 +0200 Subject: [PATCH] module grouper: support grouping for ModuleDescription This is needed to show unloaded modules in a tree. --- .../openapi/module/ModuleDescription.kt | 6 +++++ .../intellij/openapi/module/ModuleGrouper.kt | 22 +++++++++++++++++++ ...tion.kt => LoadedModuleDescriptionImpl.kt} | 4 ++-- .../module/impl/ModuleManagerImpl.java | 6 ++--- .../impl/UnloadedModuleDescriptionImpl.kt | 3 +++ 5 files changed, 36 insertions(+), 5 deletions(-) rename platform/projectModel-impl/src/com/intellij/openapi/module/impl/{LoadedModuleDescription.kt => LoadedModuleDescriptionImpl.kt} (86%) diff --git a/platform/projectModel-api/src/com/intellij/openapi/module/ModuleDescription.kt b/platform/projectModel-api/src/com/intellij/openapi/module/ModuleDescription.kt index 4329f318c042..d2da9b365720 100644 --- a/platform/projectModel-api/src/com/intellij/openapi/module/ModuleDescription.kt +++ b/platform/projectModel-api/src/com/intellij/openapi/module/ModuleDescription.kt @@ -37,4 +37,10 @@ interface ModuleDescription { @ApiStatus.Experimental interface UnloadedModuleDescription : ModuleDescription { val contentRoots: List + val groupPath: List +} + +@ApiStatus.Experimental +interface LoadedModuleDescription : ModuleDescription { + val module: Module } \ No newline at end of file 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 a06a1280391e..357acd0f43a9 100644 --- a/platform/projectModel-api/src/com/intellij/openapi/module/ModuleGrouper.kt +++ b/platform/projectModel-api/src/com/intellij/openapi/module/ModuleGrouper.kt @@ -34,6 +34,11 @@ abstract class ModuleGrouper { */ abstract fun getGroupPath(module: Module): List + /** + * Returns names of parent groups for a module + */ + abstract fun getGroupPath(description: ModuleDescription): List + /** * Returns name which should be used for a module when it's shown under its group */ @@ -48,6 +53,11 @@ abstract class ModuleGrouper { */ abstract fun getModuleAsGroupPath(module: Module): List? + /** + * If [description] itself can be considered as a group, returns its groups. Otherwise returns null. + */ + abstract fun getModuleAsGroupPath(description: ModuleDescription): List? + abstract fun getAllModules(): Array companion object { @@ -78,11 +88,15 @@ private class QualifiedNameGrouper(project: Project, model: ModifiableModuleMode 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) { @@ -91,9 +105,17 @@ private class ExplicitModuleGrouper(project: Project, model: ModifiableModuleMod 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-impl/src/com/intellij/openapi/module/impl/LoadedModuleDescription.kt b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/LoadedModuleDescriptionImpl.kt similarity index 86% rename from platform/projectModel-impl/src/com/intellij/openapi/module/impl/LoadedModuleDescription.kt rename to platform/projectModel-impl/src/com/intellij/openapi/module/impl/LoadedModuleDescriptionImpl.kt index 25b8f5b1c55b..16a920338248 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/LoadedModuleDescription.kt +++ b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/LoadedModuleDescriptionImpl.kt @@ -15,14 +15,14 @@ */ package com.intellij.openapi.module.impl +import com.intellij.openapi.module.LoadedModuleDescription import com.intellij.openapi.module.Module -import com.intellij.openapi.module.ModuleDescription import com.intellij.openapi.roots.ModuleRootManager /** * @author nik */ -class LoadedModuleDescription(private val module: Module): ModuleDescription { +class LoadedModuleDescriptionImpl(override val module: Module): LoadedModuleDescription { override val name: String get() = module.name 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 50c375de5954..385d67fcec9c 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 @@ -81,7 +81,7 @@ public abstract class ModuleManagerImpl extends ModuleManager implements Disposa private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.module.impl.ModuleManagerImpl"); private static final Key DISPOSED_MODULE_NAME = Key.create("DisposedNeverAddedModuleName"); - private static final String MODULE_GROUP_SEPARATOR = "/"; + public static final String MODULE_GROUP_SEPARATOR = "/"; protected final Project myProject; protected final MessageBus myMessageBus; @@ -985,7 +985,7 @@ public abstract class ModuleManagerImpl extends ModuleManager implements Disposa Module[] modules = getModules(); List descriptions = new ArrayList<>(modules.length + myUnloadedModules.size()); for (Module module : modules) { - descriptions.add(new LoadedModuleDescription(module)); + descriptions.add(new LoadedModuleDescriptionImpl(module)); } descriptions.addAll(myUnloadedModules.values()); return descriptions; @@ -1014,7 +1014,7 @@ public abstract class ModuleManagerImpl extends ModuleManager implements Disposa else { Module module = findModuleByName(name); if (module != null) { - LoadedModuleDescription description = new LoadedModuleDescription(module); + LoadedModuleDescriptionImpl description = new LoadedModuleDescriptionImpl(module); ModuleSaveItem saveItem = new ModuleSaveItem(module); ModulePath modulePath = new ModulePath(saveItem.getModuleFilePath(), saveItem.getGroupPathString()); VirtualFilePointerManager pointerManager = VirtualFilePointerManager.getInstance(); diff --git a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/UnloadedModuleDescriptionImpl.kt b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/UnloadedModuleDescriptionImpl.kt index 9fbab89bd3ad..6256e1999341 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/UnloadedModuleDescriptionImpl.kt +++ b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/UnloadedModuleDescriptionImpl.kt @@ -32,6 +32,9 @@ import java.nio.file.Paths class UnloadedModuleDescriptionImpl(val modulePath: ModulePath, override val dependencyModuleNames: List, override val contentRoots: List) : UnloadedModuleDescription { + override val groupPath: List + get() = modulePath.group?.split(ModuleManagerImpl.MODULE_GROUP_SEPARATOR) ?: emptyList() + override val name: String get() = modulePath.moduleName