mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
implementations view: show additional info about text in editor e.g. containing inner class if present (IDEA-65212 )
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+23
-2
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user