(no message)

This commit is contained in:
Eugene Vigdorchik
2005-01-24 20:58:24 +03:00
parent 6393987542
commit 0364f5c4e7
13 changed files with 172 additions and 196 deletions
+2 -1
View File
@@ -12,6 +12,7 @@ import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.UserDataHolder;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.util.IncorrectOperationException;
public interface PsiElement extends UserDataHolder, Iconable {
@@ -114,5 +115,5 @@ public interface PsiElement extends UserDataHolder, Iconable {
boolean isPhysical();
GlobalSearchScope getResolveScope();
GlobalSearchScope getUseScope();
SearchScope getUseScope();
}
@@ -9,6 +9,7 @@ import com.intellij.aspects.psi.PsiPointcut;
import com.intellij.aspects.psi.PsiPointcutDef;
import com.intellij.psi.*;
import com.intellij.psi.jsp.JspDirective;
import com.intellij.openapi.fileTypes.FileType;
public interface PsiSearchHelper {
PsiReference[] findReferences(PsiElement element, SearchScope searchScope, boolean ignoreAccessScope);
@@ -50,7 +51,7 @@ public interface PsiSearchHelper {
PsiFile[] findFilesWithPlainTextWords(String word);
void processUsagesInNonJavaFiles(String qName, PsiNonJavaFileReferenceProcessor processor, GlobalSearchScope searchScope);
SearchScope getAccessScope(PsiElement element);
SearchScope getUseScope(PsiElement element);
PsiFile[] findFormsBoundToClass(String className);
@@ -15,160 +15,6 @@ import com.intellij.psi.util.PsiTreeUtil;
import java.util.HashMap;
public class PsiSearchScopeUtil {
public interface AccessScopeHandler {
SearchScope getAccessScope(PsiElement element);
}
private static HashMap<FileType,AccessScopeHandler> scopeHandlers = new HashMap<FileType, AccessScopeHandler>();
public static void registerAccessScopeHandler(FileType fileType, AccessScopeHandler accessScopeHandler) {
scopeHandlers.put(fileType, accessScopeHandler);
}
public static SearchScope getAccessScope(PsiElement element) {
if (element instanceof PsiPackage) {
return element.getUseScope();
}
else if (element instanceof PsiClass) {
if (element instanceof PsiAnonymousClass) {
return new LocalSearchScope(element);
}
PsiFile file = element.getContainingFile();
if (file instanceof JspFile) {
return new LocalSearchScope(file);
}
PsiClass aClass = (PsiClass)element;
if (aClass.hasModifierProperty(PsiModifier.PUBLIC)) {
return element.getUseScope();
}
else if (aClass.hasModifierProperty(PsiModifier.PROTECTED)) {
return element.getUseScope();
}
else if (aClass.hasModifierProperty(PsiModifier.PRIVATE)) {
PsiClass topClass = getTopLevelClass(aClass);
return topClass != null ? new LocalSearchScope(topClass) : new LocalSearchScope(aClass.getContainingFile());
}
else {
PsiPackage aPackage = null;
if (file instanceof PsiJavaFile) {
aPackage = element.getManager().findPackage(((PsiJavaFile)file).getPackageName());
}
if (aPackage == null) {
PsiDirectory dir = file.getContainingDirectory();
if (dir != null) {
aPackage = dir.getPackage();
}
}
if (aPackage != null) {
GlobalSearchScope scope = GlobalSearchScope.packageScope(aPackage, false);
scope = scope.intersectWith(element.getUseScope());
return scope;
}
return new LocalSearchScope(file);
}
}
else if (element instanceof PsiMethod) {
PsiFile file = element.getContainingFile();
if (file instanceof JspFile) {
return new LocalSearchScope(file);
}
PsiMethod method = (PsiMethod)element;
PsiClass aClass = method.getContainingClass();
if (aClass instanceof PsiAnonymousClass) {
//method from anonymous class can be called from outside the class
PsiElement methodCallExpr = PsiTreeUtil.getParentOfType(aClass, PsiMethodCallExpression.class);
return new LocalSearchScope(methodCallExpr != null ? methodCallExpr : aClass);
}
if (method.hasModifierProperty(PsiModifier.PUBLIC)) {
return element.getUseScope();
}
else if (method.hasModifierProperty(PsiModifier.PROTECTED)) {
return element.getUseScope();
}
else if (method.hasModifierProperty(PsiModifier.PRIVATE)) {
PsiClass topClass = getTopLevelClass(method);
return topClass != null ? new LocalSearchScope(topClass) : new LocalSearchScope(method.getContainingFile());
}
else {
PsiPackage aPackage = file.getContainingDirectory().getPackage();
if (aPackage != null) {
GlobalSearchScope scope = GlobalSearchScope.packageScope(aPackage, false);
scope = scope.intersectWith(element.getUseScope());
return scope;
}
else {
return new LocalSearchScope(file);
}
}
}
else if (element instanceof PsiField) {
PsiFile file = element.getContainingFile();
if (file instanceof JspFile) {
return new LocalSearchScope(file);
}
PsiField field = (PsiField)element;
if (field.hasModifierProperty(PsiModifier.PUBLIC)) {
return element.getUseScope();
}
else if (field.hasModifierProperty(PsiModifier.PROTECTED)) {
return element.getUseScope();
}
else if (field.hasModifierProperty(PsiModifier.PRIVATE)) {
PsiClass topClass = getTopLevelClass(field);
return topClass != null ? new LocalSearchScope(topClass) : new LocalSearchScope(field.getContainingFile());
}
else {
final PsiDirectory directory = file.getContainingDirectory();
PsiPackage aPackage = directory == null ? null : directory.getPackage();
if (aPackage != null) {
GlobalSearchScope scope = GlobalSearchScope.packageScope(aPackage, false);
scope = scope.intersectWith(element.getUseScope());
return scope;
}
else {
return new LocalSearchScope(file);
}
}
}
else if (element instanceof ImplicitVariable) {
return new LocalSearchScope(((ImplicitVariable)element).getDeclarationScope());
}
else if (element instanceof PsiLocalVariable) {
PsiElement parent = element.getParent();
if (parent instanceof PsiDeclarationStatement) {
return new LocalSearchScope(parent.getParent());
}
else {
return element.getUseScope();
}
}
else if (element instanceof PsiParameter) {
return new LocalSearchScope(((PsiParameter)element).getDeclarationScope());
}
else if (element instanceof PsiAntElement) {
return ((PsiAntElement)element).getSearchScope();
}
else {
AccessScopeHandler accessScopeHandler = scopeHandlers.get(element.getContainingFile().getFileType());
if (accessScopeHandler!=null) return accessScopeHandler.getAccessScope(element);
return new LocalSearchScope(element.getContainingFile());
}
}
private static PsiClass getTopLevelClass(PsiElement element) {
while (!(element.getParent() instanceof PsiFile)) {
element = element.getParent();
}
return element instanceof PsiClass ? (PsiClass)element : null;
}
//TODO: move to SearchScope itself
public static SearchScope scopesUnion(SearchScope scope1, SearchScope scope2) {
if (scope1 instanceof LocalSearchScope) {
@@ -80,7 +80,7 @@ public class UnusedParametersInspection extends FilteringInspectionTool {
found[0] = true;
return false;
}
}, psiParameter, helper.getAccessScope(psiParameter), false);
}, psiParameter, helper.getUseScope(psiParameter), false);
}
}
}
@@ -107,7 +107,7 @@ public abstract class FindUsagesDialog extends DialogWrapper{
}
protected boolean isInFileOnly() {
return !myIsShowInNewTabVisible || PsiSearchScopeUtil.getAccessScope(myPsiElement) instanceof LocalSearchScope;
return !myIsShowInNewTabVisible || myPsiElement.getManager().getSearchHelper().getUseScope(myPsiElement) instanceof LocalSearchScope;
}
protected JComponent createNorthPanel() {
@@ -13,6 +13,7 @@ import com.intellij.psi.PsiSubstitutor;
import com.intellij.psi.impl.source.resolve.ResolveUtil;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.util.IncorrectOperationException;
public abstract class PsiElementBase extends ElementBase implements PsiElement {
@@ -101,8 +102,8 @@ public abstract class PsiElementBase extends ElementBase implements PsiElement {
return ((PsiManagerImpl)getManager()).getFileManager().getResolveScope(this);
}
public GlobalSearchScope getUseScope() {
return ((PsiManagerImpl)getManager()).getFileManager().getUseScope(this);
public SearchScope getUseScope() {
return getManager().getSearchHelper().getUseScope(this);
}
public ItemPresentation getPresentation() {
@@ -36,10 +36,7 @@ import com.intellij.psi.jsp.*;
import com.intellij.psi.search.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.MethodSignature;
import com.intellij.psi.util.MethodSignatureUtil;
import com.intellij.psi.util.PropertyUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.psi.util.*;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTokenType;
@@ -65,6 +62,148 @@ public class PsiSearchHelperImpl implements PsiSearchHelper {
WordInfo.JSP_ATTRIBUTE_VALUE |
WordInfo.IN_COMMENTS;
public SearchScope getUseScope(PsiElement element) {
final GlobalSearchScope maximalUseScope = myManager.getFileManager().getUseScope(element);
if (element instanceof PsiPackage) {
return maximalUseScope;
}
else if (element instanceof PsiClass) {
if (element instanceof PsiAnonymousClass) {
return new LocalSearchScope(element);
}
PsiFile file = element.getContainingFile();
if (file instanceof JspFile) {
return new LocalSearchScope(file);
}
PsiClass aClass = (PsiClass)element;
if (aClass.hasModifierProperty(PsiModifier.PUBLIC)) {
return maximalUseScope;
}
else if (aClass.hasModifierProperty(PsiModifier.PROTECTED)) {
return maximalUseScope;
}
else if (aClass.hasModifierProperty(PsiModifier.PRIVATE)) {
PsiClass topClass = getTopLevelClass(aClass);
return topClass != null ? new LocalSearchScope(topClass) : new LocalSearchScope(aClass.getContainingFile());
}
else {
PsiPackage aPackage = null;
if (file instanceof PsiJavaFile) {
aPackage = element.getManager().findPackage(((PsiJavaFile)file).getPackageName());
}
if (aPackage == null) {
PsiDirectory dir = file.getContainingDirectory();
if (dir != null) {
aPackage = dir.getPackage();
}
}
if (aPackage != null) {
SearchScope scope = GlobalSearchScope.packageScope(aPackage, false);
scope = scope.intersectWith(maximalUseScope);
return scope;
}
return new LocalSearchScope(file);
}
}
else if (element instanceof PsiMethod) {
PsiFile file = element.getContainingFile();
if (file instanceof JspFile) {
return new LocalSearchScope(file);
}
PsiMethod method = (PsiMethod)element;
PsiClass aClass = method.getContainingClass();
if (aClass instanceof PsiAnonymousClass) {
//method from anonymous class can be called from outside the class
PsiElement methodCallExpr = PsiTreeUtil.getParentOfType(aClass, PsiMethodCallExpression.class);
return new LocalSearchScope(methodCallExpr != null ? methodCallExpr : aClass);
}
if (method.hasModifierProperty(PsiModifier.PUBLIC)) {
return maximalUseScope;
}
else if (method.hasModifierProperty(PsiModifier.PROTECTED)) {
return maximalUseScope;
}
else if (method.hasModifierProperty(PsiModifier.PRIVATE)) {
PsiClass topClass = getTopLevelClass(method);
return topClass != null ? new LocalSearchScope(topClass) : new LocalSearchScope(method.getContainingFile());
}
else {
PsiPackage aPackage = file.getContainingDirectory().getPackage();
if (aPackage != null) {
SearchScope scope = GlobalSearchScope.packageScope(aPackage, false);
scope = scope.intersectWith(maximalUseScope);
return scope;
}
else {
return new LocalSearchScope(file);
}
}
}
else if (element instanceof PsiField) {
PsiFile file = element.getContainingFile();
if (file instanceof JspFile) {
return new LocalSearchScope(file);
}
PsiField field = (PsiField)element;
if (field.hasModifierProperty(PsiModifier.PUBLIC)) {
return maximalUseScope;
}
else if (field.hasModifierProperty(PsiModifier.PROTECTED)) {
return maximalUseScope;
}
else if (field.hasModifierProperty(PsiModifier.PRIVATE)) {
PsiClass topClass = getTopLevelClass(field);
return topClass != null ? new LocalSearchScope(topClass) : new LocalSearchScope(field.getContainingFile());
}
else {
final PsiDirectory directory = file.getContainingDirectory();
PsiPackage aPackage = directory == null ? null : directory.getPackage();
if (aPackage != null) {
SearchScope scope = GlobalSearchScope.packageScope(aPackage, false);
scope = scope.intersectWith(maximalUseScope);
return scope;
}
else {
return new LocalSearchScope(file);
}
}
}
else if (element instanceof ImplicitVariable) {
return new LocalSearchScope(((ImplicitVariable)element).getDeclarationScope());
}
else if (element instanceof PsiLocalVariable) {
PsiElement parent = element.getParent();
if (parent instanceof PsiDeclarationStatement) {
return new LocalSearchScope(parent.getParent());
}
else {
return maximalUseScope;
}
}
else if (element instanceof PsiParameter) {
return new LocalSearchScope(((PsiParameter)element).getDeclarationScope());
}
else if (element instanceof PsiAntElement) {
return ((PsiAntElement)element).getSearchScope();
}
else {
return maximalUseScope;
}
}
private static PsiClass getTopLevelClass(PsiElement element) {
while (!(element.getParent() instanceof PsiFile)) {
element = element.getParent();
}
return element instanceof PsiClass ? (PsiClass)element : null;
}
public interface CustomSearchHelper {
short getOccurenceMask();
TokenSet getElementTokenSet();
@@ -264,7 +403,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper {
SearchScope searchScope;
if (!ignoreAccessScope) {
SearchScope accessScope = getAccessScope(refElement);
SearchScope accessScope = refElement.getUseScope();
searchScope = originalScope.intersectWith(accessScope);
if (searchScope == null) return true;
}
@@ -671,9 +810,9 @@ public class PsiSearchHelperImpl implements PsiSearchHelper {
final String text = method.getName();
final PsiMethod[] methods = isStrictSignatureSearch ? new PsiMethod[]{method} : getOverloadsMayBeOverriden(method);
SearchScope accessScope = getAccessScope(methods[0]);
SearchScope accessScope = methods[0].getUseScope();
for (int i = 0; i < methods.length; i++) {
SearchScope someScope = PsiSearchScopeUtil.scopesUnion(accessScope, getAccessScope(methods[i]));
SearchScope someScope = PsiSearchScopeUtil.scopesUnion(accessScope, methods[i].getUseScope());
accessScope = someScope == null ? accessScope : someScope;
}
@@ -822,7 +961,7 @@ public class PsiSearchHelperImpl implements PsiSearchHelper {
return true;
}
final SearchScope searchScope1 = searchScope.intersectWith(PsiSearchScopeUtil.getAccessScope(aClass));
final SearchScope searchScope1 = searchScope.intersectWith(aClass.getUseScope());
RepositoryIndex repositoryIndex = repositoryManager.getIndex();
VirtualFileFilter rootFilter;
@@ -1511,10 +1650,6 @@ public class PsiSearchHelperImpl implements PsiSearchHelper {
}
}
public SearchScope getAccessScope(PsiElement element) {
return PsiSearchScopeUtil.getAccessScope(element);
}
public PsiFile[] findFormsBoundToClass(String className) {
GlobalSearchScope projectScope = GlobalSearchScope.projectScope(myManager.getProject());
PsiFile[] files = myManager.getCacheManager().getFilesWithWord(className, WordInfo.GUI_FORM_CLASS_NAME,
@@ -16,6 +16,7 @@ import com.intellij.psi.impl.ElementBase;
import com.intellij.psi.impl.SharedPsiElementImplUtil;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.util.IncorrectOperationException;
/**
@@ -219,7 +220,7 @@ public class ASTWrapperPsiElement extends ElementBase implements PsiElement, Nav
throw new UnsupportedOperationException();
}
public GlobalSearchScope getUseScope() {
public SearchScope getUseScope() {
throw new UnsupportedOperationException();
}
@@ -19,6 +19,7 @@ import com.intellij.psi.impl.source.codeStyle.CodeEditUtil;
import com.intellij.psi.impl.source.resolve.ResolveUtil;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.IncorrectOperationException;
@@ -206,8 +207,8 @@ public abstract class CompositePsiElement extends CompositeElement implements Ps
return ((PsiManagerImpl)getManager()).getFileManager().getResolveScope(this);
}
public GlobalSearchScope getUseScope() {
return ((PsiManagerImpl)getManager()).getFileManager().getUseScope(this);
public SearchScope getUseScope() {
return getManager().getSearchHelper().getUseScope(this);
}
public ItemPresentation getPresentation() {
@@ -12,6 +12,7 @@ import com.intellij.psi.impl.source.SourceTreeToPsiMap;
import com.intellij.psi.impl.source.resolve.ResolveUtil;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.CharTable;
import com.intellij.util.IncorrectOperationException;
@@ -178,8 +179,8 @@ public class LeafPsiElement extends LeafElementImpl implements PsiElement {
return ((PsiManagerImpl)getManager()).getFileManager().getResolveScope(this);
}
public GlobalSearchScope getUseScope() {
return ((PsiManagerImpl)getManager()).getFileManager().getUseScope(this);
public SearchScope getUseScope() {
return getManager().getSearchHelper().getUseScope(this);
}
public Project getProject() {
@@ -108,7 +108,7 @@ public class SystemBuilder {
keyParameter = parameter;
}
final PsiMethod[] overriders = helper.findOverridingMethods(keyMethod, helper.getAccessScope(keyMethod), true);
final PsiMethod[] overriders = helper.findOverridingMethods(keyMethod, keyMethod.getUseScope(), true);
PsiMethod prev = keyMethod;
for (int i = 0; i < overriders.length; i++) {
@@ -694,7 +694,7 @@ public class SystemBuilder {
addUsage(system, element);
if (!(element instanceof PsiExpression)) {
PsiReference[] refs = helper.findReferences(element, helper.getAccessScope(element), true);
PsiReference[] refs = helper.findReferences(element, helper.getUseScope(element), true);
for (int k = 0; k < refs.length; k++) {
final PsiElement ref = refs[k].getElement();
@@ -133,7 +133,7 @@ public class RefactoringUtil {
UsageInfoFactory factory) {
PsiManager manager = element.getManager();
PsiSearchHelper helper = manager.getSearchHelper();
SearchScope scope = helper.getAccessScope(element);
SearchScope scope = element.getUseScope();
scope = scope.intersectWith(GlobalSearchScope.projectScope(manager.getProject()));
int index = stringToSearch.lastIndexOf('.');
String identifierToSearch = index >= 0 ? stringToSearch.substring(index + 1) : stringToSearch;
+5 -16
View File
@@ -3,28 +3,25 @@ package com.intellij.xml.util;
import com.intellij.codeInsight.completion.CompletionUtil;
import com.intellij.j2ee.openapi.ex.ExternalResourceManagerEx;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementFactory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.meta.PsiMetaData;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.filters.ClassFilter;
import com.intellij.psi.meta.PsiMetaData;
import com.intellij.psi.scope.processor.FilterElementProcessor;
import com.intellij.psi.search.PsiElementProcessor;
import com.intellij.psi.search.PsiSearchScopeUtil;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.xml.*;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.xml.XmlElementDescriptor;
import com.intellij.xml.impl.ant.AntPropertyDeclaration;
@@ -52,14 +49,6 @@ public class XmlUtil {
public static final String JSP_NAMESPACE = "http://java.sun.com/JSP/Page";
public static final String ALL_NAMESPACE = "http://www.intellij.net/ns/all";
static {
PsiSearchScopeUtil.registerAccessScopeHandler(StdFileTypes.DTD, new PsiSearchScopeUtil.AccessScopeHandler() {
public SearchScope getAccessScope(PsiElement element) {
return GlobalSearchScope.projectScope(element.getProject());
}
});
}
public static String getSchemaLocation(XmlTag tag, String namespace) {
final String uri = ExternalResourceManagerEx.getInstanceEx().getResourceLocation(namespace);
if (uri != null && !uri.equals(namespace)) return uri;