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) }