scopes: Production, Tests, All available for subtypes hierarchy

This commit is contained in:
anna
2009-11-10 17:38:42 +03:00
parent 6c27119290
commit f9e3d47897
8 changed files with 114 additions and 111 deletions
@@ -32,7 +32,6 @@ import com.intellij.ui.PopupHandler;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import java.util.Comparator;
import java.util.Map;
@@ -77,13 +76,6 @@ public final class CallHierarchyBrowser extends CallHierarchyBrowserBase {
return null;
}
protected PsiElement getEnclosingElementFromNode(final DefaultMutableTreeNode node) {
if (node == null) return null;
final Object userObject = node.getUserObject();
if (!(userObject instanceof CallHierarchyNodeDescriptor)) return null;
return ((CallHierarchyNodeDescriptor)userObject).getEnclosingElement();
}
protected boolean isApplicableElement(@NotNull final PsiElement element) {
return element instanceof PsiMethod;
}
@@ -19,8 +19,6 @@ import com.intellij.ide.hierarchy.HierarchyNodeDescriptor;
import com.intellij.ide.hierarchy.HierarchyTreeStructure;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.search.searches.MethodReferencesSearch;
import com.intellij.psi.util.PsiUtil;
@@ -51,19 +49,8 @@ public final class CallerMethodsTreeStructure extends HierarchyTreeStructure {
return ArrayUtil.EMPTY_OBJECT_ARRAY;
}
final PsiMethod method = (PsiMethod)enclosingElement;
SearchScope searchScope = GlobalSearchScope.allScope(myProject);
if (CallHierarchyBrowser.SCOPE_CLASS.equals(myScopeType)) {
final PsiMethod baseMethod = (PsiMethod)((CallHierarchyNodeDescriptor)getBaseDescriptor()).getTargetElement();
final PsiClass containingClass = baseMethod.getContainingClass();
searchScope = new LocalSearchScope(containingClass);
}
else if (CallHierarchyBrowser.SCOPE_PROJECT.equals(myScopeType)) {
searchScope = GlobalSearchScope.projectProductionScope(myProject);
}
else if (CallHierarchyBrowser.SCOPE_TEST.equals(myScopeType)) {
searchScope = GlobalSearchScope.projectTestScope(myProject);
}
final PsiMethod baseMethod = (PsiMethod)((CallHierarchyNodeDescriptor)getBaseDescriptor()).getTargetElement();
final SearchScope searchScope = getSearchScope(myScopeType, baseMethod.getContainingClass());
final PsiClass originalClass = method.getContainingClass();
assert originalClass != null;
@@ -29,13 +29,16 @@ import java.util.ArrayList;
import java.util.List;
public class SubtypesHierarchyTreeStructure extends HierarchyTreeStructure {
private final String myCurrentScopeType;
protected SubtypesHierarchyTreeStructure(final Project project, final HierarchyNodeDescriptor descriptor) {
protected SubtypesHierarchyTreeStructure(final Project project, final HierarchyNodeDescriptor descriptor, String currentScopeType) {
super(project, descriptor);
myCurrentScopeType = currentScopeType;
}
public SubtypesHierarchyTreeStructure(final Project project, final PsiClass psiClass) {
public SubtypesHierarchyTreeStructure(Project project, PsiClass psiClass, String currentScopeType) {
super(project, new TypeHierarchyNodeDescriptor(project, null, psiClass, true));
myCurrentScopeType = currentScopeType;
}
protected final Object[] buildChildren(final HierarchyNodeDescriptor descriptor) {
@@ -45,7 +48,7 @@ public class SubtypesHierarchyTreeStructure extends HierarchyTreeStructure {
}
if (psiClass instanceof PsiAnonymousClass) return ArrayUtil.EMPTY_OBJECT_ARRAY;
if (psiClass.hasModifierProperty(PsiModifier.FINAL)) return ArrayUtil.EMPTY_OBJECT_ARRAY;
final List<PsiClass> classes = new ArrayList<PsiClass>(ClassInheritorsSearch.search(psiClass, psiClass.getUseScope(), false).findAll());
final List<PsiClass> classes = new ArrayList<PsiClass>(ClassInheritorsSearch.search(psiClass, psiClass.getUseScope().intersectWith(getSearchScope(myCurrentScopeType, psiClass)), false).findAll());
final HierarchyNodeDescriptor[] descriptors = new HierarchyNodeDescriptor[classes.size()];
for (int i = 0; i < classes.size(); i++) {
descriptors[i] = new TypeHierarchyNodeDescriptor(myProject, descriptor, classes.get(i), false);
@@ -20,12 +20,10 @@ import com.intellij.ide.hierarchy.HierarchyTreeStructure;
import com.intellij.ide.hierarchy.JavaHierarchyUtil;
import com.intellij.ide.hierarchy.TypeHierarchyBrowserBase;
import com.intellij.ide.util.treeView.NodeDescriptor;
import com.intellij.openapi.actionSystem.ActionGroup;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.ActionPlaces;
import com.intellij.openapi.actionSystem.IdeActions;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.psi.PsiAnonymousClass;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
@@ -73,6 +71,14 @@ public final class TypeHierarchyBrowser extends TypeHierarchyBrowserBase {
trees.put(SUBTYPES_HIERARCHY_TYPE, tree3);
}
protected void prependActions(DefaultActionGroup actionGroup) {
super.prependActions(actionGroup);
actionGroup.add(new ChangeScopeAction() {
protected boolean isEnabled() {
return !Comparing.strEqual(myCurrentViewType, SUPERTYPES_HIERARCHY_TYPE);
}
});
}
@Override
protected String getContentDisplayName(@NotNull String typeName, @NotNull PsiElement element) {
@@ -102,10 +108,10 @@ public final class TypeHierarchyBrowser extends TypeHierarchyBrowserBase {
return new SupertypesHierarchyTreeStructure(myProject, (PsiClass)psiElement);
}
else if (SUBTYPES_HIERARCHY_TYPE.equals(typeName)) {
return new SubtypesHierarchyTreeStructure(myProject, (PsiClass)psiElement);
return new SubtypesHierarchyTreeStructure(myProject, (PsiClass)psiElement, getCurrentScopeType());
}
else if (TYPE_HIERARCHY_TYPE.equals(typeName)) {
return new TypeHierarchyTreeStructure(myProject, (PsiClass)psiElement);
return new TypeHierarchyTreeStructure(myProject, (PsiClass)psiElement, getCurrentScopeType());
}
else {
LOG.error("unexpected type: " + typeName);
@@ -23,8 +23,8 @@ import java.util.ArrayList;
public final class TypeHierarchyTreeStructure extends SubtypesHierarchyTreeStructure {
public TypeHierarchyTreeStructure(final Project project, final PsiClass aClass) {
super(project, buildHierarchyElement(project, aClass));
public TypeHierarchyTreeStructure(final Project project, final PsiClass aClass, String currentScopeType) {
super(project, buildHierarchyElement(project, aClass), currentScopeType);
setBaseElement(myBaseDescriptor); //to set myRoot
}