diff --git a/platform/core-api/src/com/intellij/psi/search/GlobalSearchScope.java b/platform/core-api/src/com/intellij/psi/search/GlobalSearchScope.java index fbb148a74de0..0b74f65ae63f 100644 --- a/platform/core-api/src/com/intellij/psi/search/GlobalSearchScope.java +++ b/platform/core-api/src/com/intellij/psi/search/GlobalSearchScope.java @@ -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 { + 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 iterator() { + return Collections.singletonList(myVirtualFile).iterator(); + } } - public static class FilesScope extends GlobalSearchScope { - private final Collection myFiles; + public static class FilesScope extends GlobalSearchScope implements Iterable { + private final Collection myFiles; // files can be out of project roots public FilesScope(final Project project, @NotNull Collection files) { super(project); @@ -666,5 +668,10 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw List files = myFiles.size() <= 20 ? new ArrayList(myFiles) : new ArrayList(myFiles).subList(0,20); return "Files: ("+ files +")"; } + + @Override + public Iterator iterator() { + return myFiles.iterator(); + } } } diff --git a/platform/lang-api/src/com/intellij/psi/search/GlobalSearchScopes.java b/platform/lang-api/src/com/intellij/psi/search/GlobalSearchScopes.java index bbeb3e888492..3acfe338d499 100644 --- a/platform/lang-api/src/com/intellij/psi/search/GlobalSearchScopes.java +++ b/platform/lang-api/src/com/intellij/psi/search/GlobalSearchScopes.java @@ -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 psiFiles = new ArrayList(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"); } } diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java index aa344c44be47..59adf1e62bd0 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java @@ -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)customScope) { + iterator.processFile(file); + } } else if (myPsiDirectory != null) { ApplicationManager.getApplication().runReadAction(new Runnable() {