From ce5fb1fc794c167faebd23a3d51b20c877f8a088 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 22 Aug 2011 17:08:58 +0200 Subject: [PATCH] implementations view: show additional info about text in editor e.g. containing inner class if present (IDEA-65212 ) --- .../daemon/ImplementationsViewTest.java | 103 ++++++++++++++++++ .../hint/ImplementationViewComponent.java | 25 ++++- 2 files changed, 126 insertions(+), 2 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java index 3dc1bfa4dd54..9533a9e78cca 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java @@ -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 AFoo{\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 classes = ClassInheritorsSearch.search(psiClass).findAll(); + List all = new ArrayList(); + 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 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" + + "}"); + PsiMethod psiMethod = + (PsiMethod)TargetElementUtilBase.findTargetElement(myFixture.getEditor(), TargetElementUtilBase.getInstance().getAllAccepted()); + + assert psiMethod != null; + final Collection methods = OverridingMethodsSearch.search(psiMethod).findAll(); + List all = new ArrayList(); + all.add(psiMethod); + all.addAll(methods); + + //make sure they are in predefined order + Collections.sort(all, new Comparator() { + @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(); + } + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hint/ImplementationViewComponent.java b/platform/lang-impl/src/com/intellij/codeInsight/hint/ImplementationViewComponent.java index 17a108f1e1df..8ee54bd6b9f1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hint/ImplementationViewComponent.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/hint/ImplementationViewComponent.java @@ -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, Boolean>() { @Override @@ -296,11 +311,17 @@ public class ImplementationViewComponent extends JPanel { private static void update(final PsiElement[] elements, final PairFunction, Boolean> fun) { List candidates = new ArrayList(elements.length); List files = new ArrayList(elements.length); + final Set names = new HashSet(); + 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()); }