mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
hierarchy for anonymous in java file structure
This commit is contained in:
+6
-4
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user