diff --git a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java index eada5939056b..166652f4b081 100644 --- a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java +++ b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java @@ -21,6 +21,7 @@ import com.intellij.find.impl.FindInProjectUtil; import com.intellij.find.replaceInProject.ReplaceInProjectManager; import com.intellij.lang.properties.IProperty; import com.intellij.lang.properties.psi.PropertiesFile; +import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ex.PathManagerEx; import com.intellij.openapi.command.CommandProcessor; @@ -40,6 +41,7 @@ import com.intellij.testFramework.PlatformTestUtil; import com.intellij.testFramework.PsiTestUtil; import com.intellij.testFramework.fixtures.TempDirTestFixture; import com.intellij.testFramework.fixtures.impl.LightTempDirTestFixtureImpl; +import com.intellij.testFramework.fixtures.impl.TempDirTestFixtureImpl; import com.intellij.usageView.UsageInfo; import com.intellij.usages.FindUsagesProcessPresentation; import com.intellij.usages.Usage; @@ -478,6 +480,21 @@ public class FindManagerTest extends DaemonAnalyzerTestCase { FindManagerTestUtils.runFindInCommentsAndLiterals(myFindManager, findModel, text); } + public void testFindInCurrentFileOutsideProject() throws Exception { + final TempDirTestFixture tempDirFixture = new TempDirTestFixtureImpl(); + tempDirFixture.setUp(); + try { + VirtualFile file = tempDirFixture.createFile("a.txt", "foo bar foo"); + FindModel findModel = FindManagerTestUtils.configureFindModel("foo"); + findModel.setWholeWordsOnly(true); + findModel.setCustomScope(new LocalSearchScope(PsiManager.getInstance(myProject).findFile(file))); + assertSize(2, findUsages(findModel)); + } + finally { + tempDirFixture.tearDown(); + } + } + public void testFindInJavaDocs() { FindModel findModel = FindManagerTestUtils.configureFindModel("done"); String text = "/** done done done */"; diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java index 45622f0532c6..fea12ee25b66 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java @@ -338,10 +338,11 @@ public class FindInProjectUtil { if (fastWords.getFirst() && canOptimizeForFastWordSearch(findModel)) return filesForFastWordSearch; - final GlobalSearchScope customScope = toGlobal(project, findModel.getCustomScope()); + SearchScope customScope = findModel.getCustomScope(); + final GlobalSearchScope globalCustomScope = toGlobal(project, customScope); class EnumContentIterator implements ContentIterator { - final List myFiles = new ArrayList(filesForFastWordSearch); + final Set myFiles = new LinkedHashSet(filesForFastWordSearch); final PsiManager psiManager = PsiManager.getInstance(project); @Override @@ -349,7 +350,7 @@ public class FindInProjectUtil { ProgressManager.checkCanceled(); if (!virtualFile.isDirectory() && (fileMaskRegExp == null || fileMaskRegExp.matcher(virtualFile.getName()).matches()) && - (customScope == null || customScope.contains(virtualFile))) { + (globalCustomScope == null || globalCustomScope.contains(virtualFile))) { final PsiFile psiFile = psiManager.findFile(virtualFile); if (psiFile != null && !filesForFastWordSearch.contains(psiFile)) { myFiles.add(psiFile); @@ -363,14 +364,19 @@ public class FindInProjectUtil { return myFiles; } } + EnumContentIterator iterator = new EnumContentIterator(); + for (VirtualFile file : getLocalScopeFiles((LocalSearchScope)customScope)) { + iterator.processFile(file); + } + if (psiDirectory == null) { boolean success = fileIndex.iterateContent(iterator); - if (success && customScope != null && customScope.isSearchInLibraries()) { + if (success && globalCustomScope != null && globalCustomScope.isSearchInLibraries()) { OrderEnumerator enumerator = module == null ? OrderEnumerator.orderEntries(project) : OrderEnumerator.orderEntries(module); final VirtualFile[] librarySources = enumerator.withoutModuleSourceEntries().withoutDepModules().getSourceRoots(); - iterateAll(librarySources, customScope, iterator); + iterateAll(librarySources, globalCustomScope, iterator); } } else { @@ -406,6 +412,10 @@ public class FindInProjectUtil { if (scope instanceof GlobalSearchScope || scope == null) { return (GlobalSearchScope)scope; } + return GlobalSearchScope.filesScope(project, getLocalScopeFiles((LocalSearchScope)scope)); + } + + private static Set getLocalScopeFiles(LocalSearchScope scope) { Set files = new HashSet(); for (PsiElement element : ((LocalSearchScope)scope).getScope()) { PsiFile file = element.getContainingFile(); @@ -413,7 +423,7 @@ public class FindInProjectUtil { ContainerUtil.addIfNotNull(files, file.getVirtualFile()); } } - return GlobalSearchScope.filesScope(project, files); + return files; } @NotNull