From e3284357e094b1984d2004bb7845d1d8f459bc4f Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Thu, 25 Feb 2016 15:28:40 +0300 Subject: [PATCH] IDEA-151982 The new Gradle import creates an unnecessary top-level groups --- .../GradleTreeStructureProvider.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/projectView/GradleTreeStructureProvider.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/projectView/GradleTreeStructureProvider.java index 9dac6d8e2be9..4ee1e5ea8a03 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/projectView/GradleTreeStructureProvider.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/projectView/GradleTreeStructureProvider.java @@ -21,6 +21,7 @@ import com.intellij.ide.projectView.ViewSettings; import com.intellij.ide.projectView.impl.ProjectRootsUtil; import com.intellij.ide.projectView.impl.nodes.ProjectViewModuleGroupNode; import com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode; +import com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode; import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; @@ -29,8 +30,10 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.ui.SimpleTextAttributes; @@ -54,6 +57,10 @@ public class GradleTreeStructureProvider implements TreeStructureProvider { Project project = parent.getProject(); if (project == null) return children; + if (parent instanceof ProjectViewProjectNode) { + return getProjectNodeChildren(project, children); + } + if (parent instanceof ProjectViewModuleGroupNode) { Collection modifiedChildren = ContainerUtil.newSmartList(); for (AbstractTreeNode child : children) { @@ -126,6 +133,52 @@ public class GradleTreeStructureProvider implements TreeStructureProvider { return true; } + @NotNull + private static Collection getProjectNodeChildren(@NotNull Project project, + @NotNull Collection children) { + Collection modifiedChildren = ContainerUtil.newSmartList(); + ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + for (AbstractTreeNode child : children) { + Pair parentNodePair = null; + if (child instanceof ProjectViewModuleGroupNode) { + final ProjectViewModuleGroupNode groupNode = (ProjectViewModuleGroupNode)child; + final Collection groupNodeChildren = groupNode.getChildren(); + for (final AbstractTreeNode node : groupNodeChildren) { + if (node instanceof PsiDirectoryNode) { + final PsiDirectoryNode psiDirectoryNode = (PsiDirectoryNode)node; + final PsiDirectory psiDirectory = psiDirectoryNode.getValue(); + if (psiDirectory == null) { + parentNodePair = null; + break; + } + + final VirtualFile virtualFile = psiDirectory.getVirtualFile(); + final Module module = fileIndex.getModuleForFile(virtualFile); + if (!ExternalSystemApiUtil.isExternalSystemAwareModule(GradleConstants.SYSTEM_ID, module)) { + parentNodePair = null; + break; + } + + if (parentNodePair == null || VfsUtilCore.isAncestor(virtualFile, parentNodePair.first, false)) { + parentNodePair = Pair.pair(virtualFile, psiDirectoryNode); + } + else if (!VfsUtilCore.isAncestor(parentNodePair.first, virtualFile, false)) { + parentNodePair = null; + break; + } + } + else { + parentNodePair = null; + break; + } + } + } + modifiedChildren.add(parentNodePair != null ? parentNodePair.second : child); + } + return modifiedChildren; + } + + @Nullable private static GradleProjectViewModuleNode getGradleSourceSetNode(@NotNull Project project, @NotNull ProjectViewModuleNode moduleNode,