implementations view: show additional info about text in editor e.g. containing inner class if present (IDEA-65212 )

This commit is contained in:
anna
2011-08-22 17:56:07 +02:00
parent 36aa700987
commit ce5fb1fc79
2 changed files with 126 additions and 2 deletions
@@ -2,8 +2,16 @@ package com.intellij.codeInsight.daemon;
import com.intellij.codeInsight.TargetElementUtilBase;
import com.intellij.codeInsight.hint.ImplementationViewComponent;
import com.intellij.openapi.util.Disposer;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
import com.intellij.psi.search.searches.OverridingMethodsSearch;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import org.junit.Assert;
import java.util.*;
/**
* User: anna
@@ -72,4 +80,99 @@ public class ImplementationsViewTest extends LightCodeInsightFixtureTestCase {
" return \"text\";\n" +
" }", newText);
}
public void testInnerClasses() {
myFixture.configureByText("a.java", "abstract class AF<caret>oo{\n" +
" abstract boolean aaa();\n" +
" static class AFoo1 extends AFoo {\n" +
" @Override\n" +
" boolean aaa() {\n" +
" return false;\n" +
" }\n" +
" }\n" +
" static class AFoo3 extends AFoo {\n" +
" @Override\n" +
" boolean aaa() {\n" +
" return false;\n" +
" }\n" +
" }\n" +
" static class AFoo2 extends AFoo {\n" +
" @Override\n" +
" boolean aaa() {\n" +
" return false;\n" +
" }\n" +
" }\n" +
" \n" +
"}");
PsiClass psiClass =
(PsiClass)TargetElementUtilBase.findTargetElement(myFixture.getEditor(), TargetElementUtilBase.getInstance().getAllAccepted());
assert psiClass != null;
final Collection<PsiClass> classes = ClassInheritorsSearch.search(psiClass).findAll();
List<PsiClass> all = new ArrayList<PsiClass>();
all.add(psiClass);
all.addAll(classes);
final ImplementationViewComponent component =
new ImplementationViewComponent(all.toArray(new PsiElement[all.size()]), 0);
try {
final String[] visibleFiles = component.getVisibleFiles();
Assert.assertArrayEquals(Arrays.toString(visibleFiles),
new String[]{"a.java (AFoo)", "a.java (AFoo1 in AFoo)", "a.java (AFoo3 in AFoo)", "a.java (AFoo2 in AFoo)"}, visibleFiles);
}
finally {
component.removeNotify();
}
}
public void testMethodsInInnerClasses() {
myFixture.configureByText("a.java", "abstract class AFoo{\n" +
" abstract boolean a<caret>aa();\n" +
" static class AFoo1 extends AFoo {\n" +
" @Override\n" +
" boolean aaa() {\n" +
" return false;\n" +
" }\n" +
" }\n" +
" static class AFoo3 extends AFoo {\n" +
" @Override\n" +
" boolean aaa() {\n" +
" return false;\n" +
" }\n" +
" }\n" +
" static class AFoo2 extends AFoo {\n" +
" @Override\n" +
" boolean aaa() {\n" +
" return false;\n" +
" }\n" +
" }\n" +
" \n" +
"}");
PsiMethod psiMethod =
(PsiMethod)TargetElementUtilBase.findTargetElement(myFixture.getEditor(), TargetElementUtilBase.getInstance().getAllAccepted());
assert psiMethod != null;
final Collection<PsiMethod> methods = OverridingMethodsSearch.search(psiMethod).findAll();
List<PsiMethod> all = new ArrayList<PsiMethod>();
all.add(psiMethod);
all.addAll(methods);
//make sure they are in predefined order
Collections.sort(all, new Comparator<PsiMethod>() {
@Override
public int compare(PsiMethod o1, PsiMethod o2) {
return o1.getContainingClass().getQualifiedName()
.compareTo(o2.getContainingClass().getQualifiedName());
}
});
final ImplementationViewComponent component =
new ImplementationViewComponent(all.toArray(new PsiElement[all.size()]), 0);
try {
final String[] visibleFiles = component.getVisibleFiles();
Assert.assertArrayEquals(Arrays.toString(visibleFiles),
new String[]{"a.java (AFoo)", "a.java (AFoo1 in AFoo)", "a.java (AFoo2 in AFoo)", "a.java (AFoo3 in AFoo)"}, visibleFiles);
}
finally {
component.removeNotify();
}
}
}
@@ -38,6 +38,7 @@ import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.vcs.FileStatusManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.presentation.java.SymbolPresentationUtil;
import com.intellij.psi.util.PsiUtilBase;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.SideBorder;
@@ -49,6 +50,7 @@ import com.intellij.usages.UsageViewManager;
import com.intellij.usages.UsageViewPresentation;
import com.intellij.util.PairFunction;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.TestOnly;
import javax.swing.*;
import javax.swing.border.CompoundBorder;
@@ -57,7 +59,9 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ImplementationViewComponent extends JPanel {
@NonNls private static final String TEXT_PAGE_KEY = "Text";
@@ -96,7 +100,7 @@ public class ImplementationViewComponent extends JPanel {
public FileDescriptor(PsiFile file, PsiElement element) {
myFile = file;
myElementPresentation = element instanceof PsiNamedElement ? ((PsiNamedElement)element).getName() : null;
myElementPresentation = SymbolPresentationUtil.getSymbolPresentableText(element);
}
public String getPresentableName(VirtualFile vFile) {
@@ -237,6 +241,17 @@ public class ImplementationViewComponent extends JPanel {
});
}
@TestOnly
public String[] getVisibleFiles() {
final ComboBoxModel model = myFileChooser.getModel();
String[] result = new String[model.getSize()];
for (int i = 0; i < model.getSize(); i++) {
FileDescriptor o = (FileDescriptor)model.getElementAt(i);
result[i] = o.getPresentableName(o.myFile.getVirtualFile());
}
return result;
}
public void update(final PsiElement[] elements, final int index) {
update(elements, new PairFunction<PsiElement[], List<FileDescriptor>, Boolean>() {
@Override
@@ -296,11 +311,17 @@ public class ImplementationViewComponent extends JPanel {
private static void update(final PsiElement[] elements, final PairFunction<PsiElement[], List<FileDescriptor>, Boolean> fun) {
List<PsiElement> candidates = new ArrayList<PsiElement>(elements.length);
List<FileDescriptor> files = new ArrayList<FileDescriptor>(elements.length);
final Set<String> names = new HashSet<String>();
for (PsiElement element : elements) {
if (element instanceof PsiNamedElement) {
names.add(((PsiNamedElement)element).getName());
}
}
for (PsiElement element : elements) {
PsiFile file = getContainingFile(element);
if (file == null) continue;
final PsiElement parent = element.getParent();
files.add(new FileDescriptor(file, parent == file ? element : parent));
files.add(new FileDescriptor(file, names.size() > 1 || parent == file ? element : parent));
candidates.add(element.getNavigationElement());
}