From fe947fc0a59d1afe78aa534dd5a360eb89d395c1 Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 21 Dec 2017 17:07:47 +0300 Subject: [PATCH] project view: do not create implicit module group nodes if they names duplicate module names Previously if there are modules 'foo' and 'foo.bar' in the project we will show two 'foo' nodes in 'Project View', one for 'foo' module and another as an implicit module group for 'foo.bar' module (IDEA-183205). --- .../projectView/ModulesInProjectViewTest.kt | 19 +++++++++++++++++++ .../ide/projectView/impl/ModuleGroup.java | 15 +++++++++++++-- .../GroupModulesByQualifiedNamesTest.kt | 14 ++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/projectView/ModulesInProjectViewTest.kt b/java/java-tests/testSrc/com/intellij/projectView/ModulesInProjectViewTest.kt index 21e5edb58147..e2fb0755cbbf 100644 --- a/java/java-tests/testSrc/com/intellij/projectView/ModulesInProjectViewTest.kt +++ b/java/java-tests/testSrc/com/intellij/projectView/ModulesInProjectViewTest.kt @@ -111,6 +111,25 @@ class ModulesInProjectViewTest : BaseProjectViewTestCase() { """.trimMargin()) } + fun `test do not show groups duplicating module names`() { + val root = directoryContent { + dir("foo") {} + dir("foo.bar") {} + }.generateInVirtualTempDir() + PsiTestUtil.addContentRoot(createModule("xxx.foo"), root.findChild("foo")) + PsiTestUtil.addContentRoot(createModule("xxx.foo.bar"), root.findChild("foo.bar")) + assertStructureEqual(""" + |Project + | Group: xxx + | foo + | foo.bar + | test do not show groups duplicating module names.iml + | xxx.foo.bar.iml + | xxx.foo.iml + | + """.trimMargin()) + } + fun `test modules with common parent group`() { val root = directoryContent { dir("module1") { diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ModuleGroup.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ModuleGroup.java index e5c99c5ca463..6867611e86bf 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ModuleGroup.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ModuleGroup.java @@ -65,21 +65,32 @@ public class ModuleGroup { @NotNull public Collection modulesInGroup(ModuleGrouper grouper, boolean recursively) { List result = new ArrayList<>(); + Set> moduleAsGroupsPaths = ContainerUtil.map2Set(grouper.getAllModules(), module -> grouper.getModuleAsGroupPath(module)); for (final Module module : grouper.getAllModules()) { List group = grouper.getGroupPath(module); - if (myGroupPath.equals(group) || (recursively && isChild(myGroupPath, group))) { + if (myGroupPath.equals(group) || isChild(myGroupPath, group) && (recursively || allIntermediatePathsAreFromSet(myGroupPath, group, moduleAsGroupsPaths))) { result.add(module); } } return result; } + private static boolean allIntermediatePathsAreFromSet(List parent, List descendant, Set> set) { + for (int i = parent.size() + 1; i < descendant.size() - 1; i++) { + if (!set.contains(descendant.subList(0, i))) { + return false; + } + } + return true; + } + @NotNull public Collection childGroups(ModuleGrouper grouper) { Set result = new THashSet<>(); + Set> moduleAsGroupsPaths = ContainerUtil.map2Set(grouper.getAllModules(), module -> grouper.getModuleAsGroupPath(module)); for (Module module : grouper.getAllModules()) { List group = grouper.getGroupPath(module); - if (isChild(myGroupPath, group)) { + if (!moduleAsGroupsPaths.contains(group) && isChild(myGroupPath, group)) { final List directChild = ContainerUtil.append(myGroupPath, group.get(myGroupPath.size())); result.add(new ModuleGroup(directChild)); } diff --git a/platform/platform-tests/testSrc/com/intellij/module/GroupModulesByQualifiedNamesTest.kt b/platform/platform-tests/testSrc/com/intellij/module/GroupModulesByQualifiedNamesTest.kt index 127d1bbc8231..6b4ed28aed56 100644 --- a/platform/platform-tests/testSrc/com/intellij/module/GroupModulesByQualifiedNamesTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/module/GroupModulesByQualifiedNamesTest.kt @@ -57,6 +57,20 @@ class GroupModulesByQualifiedNamesTest : PlatformTestCase() { assertEmpty(group.childGroups(grouper)) } + fun `test module as a group`() { + val module1 = createModule("a.foo") + val module2 = createModule("a.foo.bar") + + assertEquals("foo", grouper.getShortenedName(module1)) + assertEquals("bar", grouper.getShortenedName(module2)) + + val parentGroup = ModuleGroup(listOf("a")) + assertSameElements(parentGroup.modulesInGroup(grouper, false), module1, module2) + assertSameElements(parentGroup.modulesInGroup(grouper, true), module1, module2) + + assertEmpty(parentGroup.childGroups(grouper)) + } + private val grouper: ModuleGrouper get() = getQualifiedNameModuleGrouper(myProject) }