goto file: match against the path from top-level content root (IDEA-162244)

This commit is contained in:
peter
2016-11-21 18:11:28 +01:00
parent 221f557fde
commit 88e40b68b1
4 changed files with 36 additions and 36 deletions
@@ -64,6 +64,17 @@ class ChooseByNameHddTest extends JavaCodeInsightFixtureTestCase {
popup.close(false)
}
void "test paths relative to topmost module"() {
PsiTestUtil.addModule(project, StdModuleTypes.JAVA, 'm1', myFixture.tempDirFixture.findOrCreateDir("foo"))
PsiTestUtil.addModule(project, StdModuleTypes.JAVA, 'm2', myFixture.tempDirFixture.findOrCreateDir("foo/bar"))
def file = myFixture.addFileToProject('foo/bar/goo/doo.txt', '')
def popup = ReadAction.compute { ChooseByNamePopup.createPopup(project, new GotoFileModel(project), file) }
assert ChooseByNameTest.calcPopupElements(popup, "doo", false) == [file]
assert ChooseByNameTest.calcPopupElements(popup, "goo/doo", false) == [file]
assert ChooseByNameTest.calcPopupElements(popup, "bar/goo/doo", false) == [file]
assert ChooseByNameTest.calcPopupElements(popup, "foo/bar/goo/doo", false) == [file]
}
@Override
protected boolean runInDispatchThread() {
return false
@@ -17,14 +17,12 @@ package com.intellij.ide.actions;
import com.intellij.ide.util.PlatformModuleRendererFactory;
import com.intellij.ide.util.PsiElementListCellRenderer;
import com.intellij.ide.util.gotoByName.GotoFileCellRenderer;
import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.util.Iconable;
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.psi.PsiElement;
@@ -35,7 +33,6 @@ import com.intellij.ui.ColoredListCellRenderer;
import com.intellij.ui.JBColor;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.util.ui.FilePathSplittingPolicy;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
@@ -82,7 +79,7 @@ class SearchEverywherePsiRenderer extends PsiElementListCellRenderer<PsiElement>
final PsiDirectory psiDirectory = parent instanceof PsiDirectory ? (PsiDirectory)parent : null;
VirtualFile virtualFile = psiDirectory == null ? null : psiDirectory.getVirtualFile();
if (virtualFile == null) return null;
final String relativePath = getRelativePath(virtualFile, element.getProject());
String relativePath = GotoFileCellRenderer.getRelativePath(virtualFile, element.getProject());
if (relativePath == null) return "( " + File.separator + " )";
int width = myList.getWidth();
if (width == 0) width += 800;
@@ -124,30 +121,6 @@ class SearchEverywherePsiRenderer extends PsiElementListCellRenderer<PsiElement>
}
@Nullable
String getRelativePath(final VirtualFile virtualFile, final Project project) {
String url = virtualFile.getPresentableUrl();
if (project == null) {
return url;
}
VirtualFile root = ProjectFileIndex.SERVICE.getInstance(project).getContentRootForFile(virtualFile);
if (root != null) {
return root.getName() + File.separatorChar + VfsUtilCore.getRelativePath(virtualFile, root, File.separatorChar);
}
final VirtualFile baseDir = project.getBaseDir();
if (baseDir != null) {
//noinspection ConstantConditions
final String projectHomeUrl = baseDir.getPresentableUrl();
if (url.startsWith(projectHomeUrl)) {
final String cont = url.substring(projectHomeUrl.length());
if (cont.isEmpty()) return null;
url = "..." + cont;
}
}
return url;
}
@Override
protected boolean customizeNonPsiElementLeftRenderer(ColoredListCellRenderer renderer,
JList list,
@@ -33,6 +33,7 @@ import com.intellij.ui.ColoredListCellRenderer;
import com.intellij.ui.JBColor;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.util.ui.FilePathSplittingPolicy;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -76,19 +77,18 @@ public class GotoFileCellRenderer extends PsiElementListCellRenderer<PsiFileSyst
}
@Nullable
static String getRelativePath(final VirtualFile virtualFile, final Project project) {
String url = virtualFile.getPresentableUrl();
public static String getRelativePath(final VirtualFile virtualFile, final Project project) {
if (project == null) {
return url;
return virtualFile.getPresentableUrl();
}
VirtualFile root = ProjectFileIndex.SERVICE.getInstance(project).getContentRootForFile(virtualFile);
if (root != null) {
return root.getName() + File.separatorChar + VfsUtilCore.getRelativePath(virtualFile, root, File.separatorChar);
return getRelativePathFromRoot(virtualFile, root);
}
String url = virtualFile.getPresentableUrl();
final VirtualFile baseDir = project.getBaseDir();
if (baseDir != null) {
//noinspection ConstantConditions
final String projectHomeUrl = baseDir.getPresentableUrl();
if (url.startsWith(projectHomeUrl)) {
final String cont = url.substring(projectHomeUrl.length());
@@ -99,6 +99,11 @@ public class GotoFileCellRenderer extends PsiElementListCellRenderer<PsiFileSyst
return url;
}
@NotNull
static String getRelativePathFromRoot(@NotNull VirtualFile file, @NotNull VirtualFile root) {
return root.getName() + File.separatorChar + VfsUtilCore.getRelativePath(file, root, File.separatorChar);
}
@Override
protected boolean customizeNonPsiElementLeftRenderer(ColoredListCellRenderer renderer,
JList list,
@@ -27,11 +27,13 @@ import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.ex.WindowManagerEx;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileSystemItem;
import com.intellij.util.containers.JBIterable;
import com.intellij.util.indexing.FileBasedIndex;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -132,13 +134,22 @@ public class GotoFileModel extends FilteringGotoByModel<FileType> implements Dum
@Nullable
public String getFullName(final Object element) {
if (element instanceof PsiFileSystemItem) {
final VirtualFile virtualFile = ((PsiFileSystemItem)element).getVirtualFile();
return virtualFile != null ? GotoFileCellRenderer.getRelativePath(virtualFile, myProject) : null;
VirtualFile file = ((PsiFileSystemItem)element).getVirtualFile();
VirtualFile root = getTopLevelRoot(file);
return root != null ? GotoFileCellRenderer.getRelativePathFromRoot(file, root) : null;
}
return getElementName(element);
}
private VirtualFile getTopLevelRoot(VirtualFile file) {
return JBIterable.generate(getContentRoot(file), r -> getContentRoot(r.getParent())).last();
}
private VirtualFile getContentRoot(@Nullable VirtualFile file) {
return file == null ? null : ProjectFileIndex.SERVICE.getInstance(myProject).getContentRootForFile(file);
}
@Override
@NotNull
public String[] getSeparators() {