IDEA-166142: find archived file in project view if archive is located under a module group

This commit is contained in:
Sergey Malenkov
2018-09-06 19:38:17 +03:00
parent f1b5da3f92
commit f2d03e8848
3 changed files with 43 additions and 0 deletions
@@ -9,17 +9,23 @@ import com.intellij.ide.projectView.impl.ProjectViewPane;
import com.intellij.ide.projectView.impl.ProjectViewToolWindowFactory;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowId;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.psi.*;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.testFramework.PsiTestUtil;
import com.intellij.util.ui.UIUtil;
import javax.swing.*;
import java.io.IOException;
@SuppressWarnings({"HardCodedStringLiteral"})
public class NavigateFromSourceTest extends BaseProjectViewTestCase {
@@ -121,4 +127,36 @@ public class NavigateFromSourceTest extends BaseProjectViewTestCase {
PlatformTestUtil.waitWhileBusy(tree);
PlatformTestUtil.assertTreeEqual(tree, expected, true);
}
public void testSelectFileInArchiveUnderModuleGroup() throws IOException {
Project project = getProject();
VirtualFile root = getContentRoot();
// create grouped module on top level to create ModuleGroupNode
VirtualFile moduleRoot = WriteAction.computeAndWait(() -> root.getParent().createChildDirectory(project, "module"));
Module module = createModule("group.module");
PsiTestUtil.addContentRoot(module, moduleRoot);
// move archive from default module to the created one
VirtualFile archive = root.findChild("test.jar");
WriteAction.runAndWait(() -> archive.move(project, moduleRoot));
PsiTestUtil.addLibrary(module, archive.getPath()); // only libraries are expanded now
AbstractProjectViewPSIPane pane = myStructure.createPane();
// select archived file in the Project View
VirtualFile file = JarFileSystem.getInstance().getJarRootForLocalFile(archive).findChild("Main.class");
pane.select(PsiManager.getInstance(project).findFile(file), file, false);
PlatformTestUtil.waitWhileBusy(pane.getTree());
PlatformTestUtil.assertTreeEqual(pane.getTree(), "-Project\n" +
" -Group: group\n" +
" -PsiDirectory: module\n" +
" -test.jar\n" +
" PsiDirectory: META-INF\n" +
" [Main]\n" +
" PsiDirectory: selectFileInArchiveUnderModuleGroup\n" +
" group.module.iml\n" +
getRootFiles() +
" +External Libraries\n"
, true);
}
}
@@ -16,6 +16,7 @@ import com.intellij.openapi.module.ModuleGrouper;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.ArchiveFileSystem;
import com.intellij.psi.PsiFileSystemItem;
import com.intellij.util.PlatformIcons;
import com.intellij.util.containers.ContainerUtil;
@@ -79,6 +80,10 @@ public abstract class ModuleGroupNode extends ProjectViewNode<ModuleGroup> imple
@Override
public boolean contains(@NotNull VirtualFile file) {
List<Module> modules = getModulesByFile(file);
if (modules.isEmpty() && file.getFileSystem() instanceof ArchiveFileSystem) {
VirtualFile archiveFile = ((ArchiveFileSystem)file.getFileSystem()).getLocalByEntry(file);
if (archiveFile != null) modules = getModulesByFile(archiveFile);
}
List<String> thisGroupPath = getValue().getGroupPathList();
ModuleGrouper grouper = ModuleGrouper.instanceFor(getProject());
for (Module module : modules) {