CoreJavaFileManager: check scope when searching for classes

This commit is contained in:
Pavel V. Talanov
2015-01-13 20:57:37 +03:00
parent 90e2339adf
commit d5bd063a5a
2 changed files with 16 additions and 3 deletions
@@ -84,7 +84,7 @@ public class CoreJavaFileManager implements JavaFileManager {
@Override
public PsiClass findClass(@NotNull String qName, @NotNull GlobalSearchScope scope) {
for (VirtualFile root : roots()) {
final PsiClass psiClass = findClassInClasspathRoot(qName, root, myPsiManager);
final PsiClass psiClass = findClassInClasspathRoot(qName, root, myPsiManager, scope);
if (psiClass != null) {
return psiClass;
}
@@ -93,7 +93,10 @@ public class CoreJavaFileManager implements JavaFileManager {
}
@Nullable
public static PsiClass findClassInClasspathRoot(String qName, VirtualFile root, PsiManager psiManager) {
public static PsiClass findClassInClasspathRoot(@NotNull String qName,
@NotNull VirtualFile root,
@NotNull PsiManager psiManager,
@NotNull GlobalSearchScope scope) {
String pathRest = qName;
VirtualFile cur = root;
@@ -122,6 +125,9 @@ public class CoreJavaFileManager implements JavaFileManager {
LOG.error("Invalid child of valid parent: " + vFile.getPath() + "; " + root.isValid() + " path=" + root.getPath());
return null;
}
if (!scope.contains(vFile)) {
return null;
}
final PsiFile file = psiManager.findFile(vFile);
if (!(file instanceof PsiClassOwner)) {
@@ -176,7 +182,7 @@ public class CoreJavaFileManager implements JavaFileManager {
public PsiClass[] findClasses(@NotNull String qName, @NotNull GlobalSearchScope scope) {
List<PsiClass> result = new ArrayList<PsiClass>();
for (VirtualFile file : roots()) {
final PsiClass psiClass = findClassInClasspathRoot(qName, file, myPsiManager);
final PsiClass psiClass = findClassInClasspathRoot(qName, file, myPsiManager, scope);
if (psiClass != null) {
result.add(psiClass);
}
@@ -174,6 +174,13 @@ public class CoreJavaFileManagerTest extends PsiTestCase {
assertCannotFind(manager, "foo.Three");
}
public void testScopeCheck() throws Exception {
CoreJavaFileManager manager = configureManager("package foo;\n\n" + "public class Test {}\n", "Test");
assertNotNull("Should find class in all scope", manager.findClass("foo.Test", GlobalSearchScope.allScope(getProject())));
assertNull("Should not find class in empty scope", manager.findClass("foo.Test", GlobalSearchScope.EMPTY_SCOPE));
}
@NotNull
private CoreJavaFileManager configureManager(@Language("JAVA") @NotNull String text, @NotNull String className) throws Exception {
VirtualFile root = PsiTestUtil.createTestProjectStructure(myProject, myModule, myFilesToDelete);