another fix for IDEA-126598 Find in open files does not find occurrences in files outside of project

This commit is contained in:
Maxim.Mossienko
2014-06-26 18:03:04 +02:00
parent 6f5d5f7900
commit 8a4b15323a
3 changed files with 22 additions and 23 deletions
@@ -30,10 +30,7 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.*;
public abstract class GlobalSearchScope extends SearchScope implements ProjectAwareFileFilter {
private static final Logger LOG = Logger.getInstance("#com.intellij.psi.search.GlobalSearchScope");
@@ -586,8 +583,8 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
public static final GlobalSearchScope EMPTY_SCOPE = new EmptyScope();
private static class FileScope extends GlobalSearchScope {
private final VirtualFile myVirtualFile;
private static class FileScope extends GlobalSearchScope implements Iterable<VirtualFile> {
private final VirtualFile myVirtualFile; // files can be out of project roots
private final Module myModule;
private FileScope(@NotNull Project project, VirtualFile virtualFile) {
@@ -620,10 +617,15 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
public String toString() {
return "File :"+myVirtualFile;
}
@Override
public Iterator<VirtualFile> iterator() {
return Collections.singletonList(myVirtualFile).iterator();
}
}
public static class FilesScope extends GlobalSearchScope {
private final Collection<VirtualFile> myFiles;
public static class FilesScope extends GlobalSearchScope implements Iterable<VirtualFile> {
private final Collection<VirtualFile> myFiles; // files can be out of project roots
public FilesScope(final Project project, @NotNull Collection<VirtualFile> files) {
super(project);
@@ -666,5 +668,10 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw
List<VirtualFile> files = myFiles.size() <= 20 ? new ArrayList<VirtualFile>(myFiles) : new ArrayList<VirtualFile>(myFiles).subList(0,20);
return "Files: ("+ files +")";
}
@Override
public Iterator<VirtualFile> iterator() {
return myFiles.iterator();
}
}
}
@@ -18,13 +18,9 @@ package com.intellij.psi.search;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
/**
* @author yole
@@ -34,16 +30,8 @@ public class GlobalSearchScopes extends GlobalSearchScopesCore {
}
@NotNull
public static SearchScope openFilesScope(@NotNull Project project) {
public static GlobalSearchScope openFilesScope(@NotNull Project project) {
final VirtualFile[] files = FileEditorManager.getInstance(project).getOpenFiles();
// We can not use GlobalSearchScope as it is usually bound to project and used via filtering of project / library roots
// Open files can be out of project roots e.g. arbitrary open file so we go LocalSearchScope way, filling it with elements to process
List<PsiElement> psiFiles = new ArrayList<PsiElement>(files.length);
PsiManager psiManager = PsiManager.getInstance(project);
for(VirtualFile file:files) {
PsiFile psiFile = psiManager.findFile(file);
if (psiFile != null) psiFiles.add(psiFile);
}
return new LocalSearchScope(psiFiles.toArray(new PsiElement[psiFiles.size()]), "Open Files");
return GlobalSearchScope.filesScope(project, Arrays.asList(files), "Open Files");
}
}
@@ -290,6 +290,10 @@ class FindInProjectTask {
for (VirtualFile file : getLocalScopeFiles((LocalSearchScope)customScope)) {
iterator.processFile(file);
}
} else if (customScope instanceof Iterable) { // GlobalSearchScope can span files out of project roots e.g. FileScope / FilesScope
for (VirtualFile file : (Iterable<VirtualFile>)customScope) {
iterator.processFile(file);
}
}
else if (myPsiDirectory != null) {
ApplicationManager.getApplication().runReadAction(new Runnable() {