hierarchy for anonymous in java file structure

This commit is contained in:
Konstantin Bulenkov
2012-01-23 13:32:19 +01:00
parent c0808a1823
commit 5f4f77a159
3 changed files with 27 additions and 9 deletions
@@ -15,6 +15,7 @@
*/
package com.intellij.ide.structureView.impl.java;
import com.intellij.ide.structureView.impl.common.PsiTreeElementBase;
import com.intellij.ide.util.FileStructureNodeProvider;
import com.intellij.ide.util.treeView.smartTree.ActionPresentation;
import com.intellij.ide.util.treeView.smartTree.ActionPresentationData;
@@ -29,6 +30,7 @@ import com.intellij.psi.PsiAnonymousClass;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.util.PlatformIcons;
import com.intellij.util.containers.hash.HashSet;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -44,14 +46,14 @@ public class JavaAnonymousClassesNodeProvider implements FileStructureNodeProvid
@Override
public Collection<JavaAnonymousClassTreeElement> provideNodes(TreeElement node) {
if (node instanceof JavaClassTreeElement) {
final PsiClass cls = ((JavaClassTreeElement)node).getElement();
if (node instanceof PsiMethodTreeElement || node instanceof PsiFieldTreeElement || node instanceof ClassInitializerTreeElement) {
final PsiElement el = ((PsiTreeElementBase)node).getElement();
for (AnonymousElementProvider provider : Extensions.getExtensions(AnonymousElementProvider.EP_NAME)) {
final PsiElement[] elements = provider.getAnonymousElements(cls);
final PsiElement[] elements = provider.getAnonymousElements(el);
if (elements != null && elements.length > 0) {
List<JavaAnonymousClassTreeElement> result = new ArrayList<JavaAnonymousClassTreeElement>(elements.length);
for (PsiElement element : elements) {
result.add(new JavaAnonymousClassTreeElement((PsiAnonymousClass)element, ((JavaClassTreeElement)node).getParents()));
result.add(new JavaAnonymousClassTreeElement((PsiAnonymousClass)element, new HashSet<PsiClass>()));
}
return result;
}
@@ -95,7 +95,8 @@ public class JavaFileTreeModel extends TextEditorBasedStructureViewModel impleme
if (element instanceof PsiMethod) {
PsiMethod method = (PsiMethod)element;
PsiClass parent = method.getContainingClass();
return parent != null && parent.getQualifiedName() != null;
return parent != null
&& (parent.getQualifiedName() != null || parent instanceof PsiAnonymousClass);
}
if (element instanceof PsiField) {
@@ -27,18 +27,26 @@ import java.util.List;
public class JavaAnonymousClassesProvider implements AnonymousElementProvider {
@Override
public PsiElement[] getAnonymousElements(PsiElement parent) {
if (parent instanceof PsiClass) {
if (suite(parent)) {
if (parent instanceof PsiCompiledElement) {
parent = parent.getNavigationElement();
}
if (parent instanceof PsiClass && !(parent instanceof PsiCompiledElement)) {
if (suite(parent) && !(parent instanceof PsiCompiledElement)) {
final List<PsiElement> elements = new ArrayList<PsiElement>();
new JavaRecursiveElementWalkingVisitor() {
final PsiElement element = parent;
element.accept(new JavaRecursiveElementWalkingVisitor() {
@Override
public void visitAnonymousClass(PsiAnonymousClass aClass) {
elements.add(aClass);
}
}.visitElement(parent);
@Override
public void visitClass(PsiClass aClass) {
if (aClass == element) {
super.visitClass(aClass);
}
}
});
if (! elements.isEmpty()) {
return elements.toArray(new PsiElement[elements.size()]);
@@ -47,4 +55,11 @@ public class JavaAnonymousClassesProvider implements AnonymousElementProvider {
}
return PsiElement.EMPTY_ARRAY;
}
private static boolean suite(PsiElement element) {
return element instanceof PsiClass
|| element instanceof PsiMethod
|| element instanceof PsiField
|| element instanceof PsiClassInitializer;
}
}