More generic PyHierarchyNodeDescriptor instead of just PyTypeHierarchyNodeDescriptor

This commit is contained in:
Andrey Vlasovskikh
2014-09-04 17:21:57 +04:00
parent 7a5f31f0f6
commit a10706f597
5 changed files with 52 additions and 45 deletions
@@ -25,6 +25,7 @@ import com.intellij.openapi.util.Comparing;
import com.intellij.psi.NavigatablePsiElement;
import com.intellij.psi.PsiElement;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyFunction;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
@@ -35,14 +36,14 @@ import java.awt.*;
* Date: Jul 31, 2009
* Time: 6:26:37 PM
*/
public class PyTypeHierarchyNodeDescriptor extends HierarchyNodeDescriptor {
public PyTypeHierarchyNodeDescriptor(final NodeDescriptor parentDescriptor, @NotNull final PsiElement element, final boolean isBase) {
public class PyHierarchyNodeDescriptor extends HierarchyNodeDescriptor {
public PyHierarchyNodeDescriptor(final NodeDescriptor parentDescriptor, @NotNull final PsiElement element, final boolean isBase) {
super(element.getProject(), parentDescriptor, element, isBase);
}
public PyClass getClassElement() {
return (PyClass)myElement;
@NotNull
public PsiElement getPsiElement() {
return myElement;
}
public boolean isValid() {
@@ -71,10 +72,14 @@ public class PyTypeHierarchyNodeDescriptor extends HierarchyNodeDescriptor {
final ItemPresentation presentation = element.getPresentation();
if (presentation != null) {
final PyClass cl = getClassElement();
myHighlightedText.getEnding().addText(cl.getName(), classNameAttributes);
myHighlightedText.getEnding()
.addText(" (" + cl.getContainingFile().getName() + ")", HierarchyNodeDescriptor.getPackageNameAttributes());
if (element instanceof PyFunction) {
final PyClass cls = ((PyFunction)element).getContainingClass();
if (cls != null) {
myHighlightedText.getEnding().addText(cls.getName() + ".");
}
}
myHighlightedText.getEnding().addText(presentation.getPresentableText(), classNameAttributes);
myHighlightedText.getEnding().addText(" " + presentation.getLocationString(), HierarchyNodeDescriptor.getPackageNameAttributes());
}
myName = myHighlightedText.getText();
@@ -52,10 +52,10 @@ public class PyTypeHierarchyBrowser extends TypeHierarchyBrowserBase {
@Nullable
protected PsiElement getElementFromDescriptor(@NotNull HierarchyNodeDescriptor descriptor) {
if (!(descriptor instanceof PyTypeHierarchyNodeDescriptor)) {
if (!(descriptor instanceof PyHierarchyNodeDescriptor)) {
return null;
}
return ((PyTypeHierarchyNodeDescriptor)descriptor).getClassElement();
return ((PyHierarchyNodeDescriptor)descriptor).getPsiElement();
}
protected void createTrees(@NotNull Map<String, JTree> trees) {
@@ -18,9 +18,10 @@ package com.jetbrains.python.hierarchy.treestructures;
import com.intellij.ide.hierarchy.HierarchyNodeDescriptor;
import com.intellij.ide.hierarchy.HierarchyTreeStructure;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Query;
import com.jetbrains.python.hierarchy.PyTypeHierarchyNodeDescriptor;
import com.jetbrains.python.hierarchy.PyHierarchyNodeDescriptor;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.search.PyClassInheritorsSearch;
import org.jetbrains.annotations.NotNull;
@@ -40,17 +41,20 @@ public class PySubTypesHierarchyTreeStructure extends HierarchyTreeStructure {
}
public PySubTypesHierarchyTreeStructure(@NotNull final PyClass cl) {
super(cl.getProject(), new PyTypeHierarchyNodeDescriptor(null, cl, true));
super(cl.getProject(), new PyHierarchyNodeDescriptor(null, cl, true));
}
@NotNull
protected Object[] buildChildren(@NotNull HierarchyNodeDescriptor descriptor) {
final PyClass classElement = ((PyTypeHierarchyNodeDescriptor)descriptor).getClassElement();
Query<PyClass> subClasses = PyClassInheritorsSearch.search(classElement, false);
final List<PyHierarchyNodeDescriptor> res = new ArrayList<PyHierarchyNodeDescriptor>();
final PsiElement element = ((PyHierarchyNodeDescriptor)descriptor).getPsiElement();
if (element instanceof PyClass) {
final PyClass cls = (PyClass)element;
Query<PyClass> subClasses = PyClassInheritorsSearch.search(cls, false);
for (PyClass subClass : subClasses) {
res.add(new PyHierarchyNodeDescriptor(descriptor, subClass, false));
}
List<PyTypeHierarchyNodeDescriptor> res = new ArrayList<PyTypeHierarchyNodeDescriptor>();
for (PyClass cl : subClasses) {
res.add(new PyTypeHierarchyNodeDescriptor(descriptor, cl, false));
}
return ArrayUtil.toObjectArray(res);
@@ -17,8 +17,8 @@ package com.jetbrains.python.hierarchy.treestructures;
import com.intellij.ide.hierarchy.HierarchyNodeDescriptor;
import com.intellij.ide.hierarchy.HierarchyTreeStructure;
import com.intellij.openapi.project.Project;
import com.jetbrains.python.hierarchy.PyTypeHierarchyNodeDescriptor;
import com.intellij.psi.PsiElement;
import com.jetbrains.python.hierarchy.PyHierarchyNodeDescriptor;
import com.jetbrains.python.psi.PyClass;
import org.jetbrains.annotations.NotNull;
@@ -32,20 +32,23 @@ import java.util.List;
* Time: 7:04:07 PM
*/
public class PySuperTypesHierarchyTreeStructure extends HierarchyTreeStructure {
protected PySuperTypesHierarchyTreeStructure(final Project project, final HierarchyNodeDescriptor baseDescriptor) {
super(project, baseDescriptor);
}
public PySuperTypesHierarchyTreeStructure(@NotNull final PyClass cl) {
super(cl.getProject(), new PyTypeHierarchyNodeDescriptor(null, cl, true));
super(cl.getProject(), new PyHierarchyNodeDescriptor(null, cl, true));
}
@NotNull
protected Object[] buildChildren(@NotNull HierarchyNodeDescriptor descriptor) {
final PyClass[] superClasses = ((PyTypeHierarchyNodeDescriptor)descriptor).getClassElement().getSuperClasses();
List<PyTypeHierarchyNodeDescriptor> res = new ArrayList<PyTypeHierarchyNodeDescriptor>();
for (PyClass superClass : superClasses) {
res.add(new PyTypeHierarchyNodeDescriptor(descriptor, superClass, false));
final List<PyHierarchyNodeDescriptor> res = new ArrayList<PyHierarchyNodeDescriptor>();
if (descriptor instanceof PyHierarchyNodeDescriptor) {
final PyHierarchyNodeDescriptor pyDescriptor = (PyHierarchyNodeDescriptor)descriptor;
final PsiElement element = pyDescriptor.getPsiElement();
if (element instanceof PyClass) {
final PyClass cls = (PyClass)element;
final PyClass[] superClasses = cls.getSuperClasses();
for (PyClass superClass : superClasses) {
res.add(new PyHierarchyNodeDescriptor(descriptor, superClass, false));
}
}
}
return res.toArray();
}
@@ -16,8 +16,7 @@
package com.jetbrains.python.hierarchy.treestructures;
import com.intellij.ide.hierarchy.HierarchyNodeDescriptor;
import com.intellij.openapi.project.Project;
import com.jetbrains.python.hierarchy.PyTypeHierarchyNodeDescriptor;
import com.jetbrains.python.hierarchy.PyHierarchyNodeDescriptor;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyUtil;
import org.jetbrains.annotations.NotNull;
@@ -28,30 +27,26 @@ import java.util.List;
* @author Alexey.Ivanov
*/
public class PyTypeHierarchyTreeStructure extends PySubTypesHierarchyTreeStructure {
private static PyTypeHierarchyNodeDescriptor buildHierarchyElement(@NotNull final PyClass cl) {
PyTypeHierarchyNodeDescriptor descriptor = null;
public PyTypeHierarchyTreeStructure(@NotNull final PyClass cl) {
super(cl.getProject(), buildHierarchyElement(cl));
setBaseElement(myBaseDescriptor);
}
private static PyHierarchyNodeDescriptor buildHierarchyElement(@NotNull final PyClass cl) {
PyHierarchyNodeDescriptor descriptor = null;
List<PyClass> superClasses = PyUtil.getAllSuperClasses(cl);
for (int i = superClasses.size() - 1; i >= 0; --i) {
final PyClass superClass = superClasses.get(i);
final PyTypeHierarchyNodeDescriptor newDescriptor = new PyTypeHierarchyNodeDescriptor(descriptor, superClass, false);
final PyHierarchyNodeDescriptor newDescriptor = new PyHierarchyNodeDescriptor(descriptor, superClass, false);
if (descriptor != null) {
descriptor.setCachedChildren(new PyTypeHierarchyNodeDescriptor[]{newDescriptor});
descriptor.setCachedChildren(new PyHierarchyNodeDescriptor[]{newDescriptor});
}
descriptor = newDescriptor;
}
final PyTypeHierarchyNodeDescriptor newDescriptor = new PyTypeHierarchyNodeDescriptor(descriptor, cl, true);
final PyHierarchyNodeDescriptor newDescriptor = new PyHierarchyNodeDescriptor(descriptor, cl, true);
if (descriptor != null) {
descriptor.setCachedChildren(new HierarchyNodeDescriptor[]{newDescriptor});
}
return newDescriptor;
}
protected PyTypeHierarchyTreeStructure(final Project project, final HierarchyNodeDescriptor baseDescriptor) {
super(project, baseDescriptor);
}
public PyTypeHierarchyTreeStructure(@NotNull final PyClass cl) {
super(cl.getProject(), buildHierarchyElement(cl));
setBaseElement(myBaseDescriptor);
}
}