diff --git a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java index b0bc587fd406..4794d1a5c6ef 100644 --- a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java +++ b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java @@ -539,6 +539,22 @@ public class FindManagerTest extends DaemonAnalyzerTestCase { } } + public void testFindInDirectoryOutsideProject() throws Exception { + final TempDirTestFixture tempDirFixture = new TempDirTestFixtureImpl(); + tempDirFixture.setUp(); + try { + tempDirFixture.createFile("a.txt", "foo bar foo"); + FindModel findModel = FindManagerTestUtils.configureFindModel("foo"); + findModel.setWholeWordsOnly(true); + findModel.setProjectScope(false); + findModel.setDirectoryName(tempDirFixture.getFile("").getPath()); + 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/FindInProjectTask.java b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java index bb08d6f689ca..0f50eed31d3f 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectTask.java @@ -224,6 +224,8 @@ class FindInProjectTask { SearchScope customScope = myFindModel.getCustomScope(); final GlobalSearchScope globalCustomScope = toGlobal(customScope); + final ProjectFileIndex fileIndex = ProjectFileIndex.SERVICE.getInstance(myProject); + class EnumContentIterator implements ContentIterator { final Set myFiles = new LinkedHashSet(); @@ -238,7 +240,8 @@ class FindInProjectTask { return; } - if (skipIndexed && isCoveredByIdIndex(virtualFile)) { + if (skipIndexed && isCoveredByIdIndex(virtualFile) && + (fileIndex.isInContent(virtualFile) || fileIndex.isInLibraryClasses(virtualFile) || fileIndex.isInLibrarySource(virtualFile))) { return; } @@ -259,7 +262,7 @@ class FindInProjectTask { } } - EnumContentIterator iterator = new EnumContentIterator(); + final EnumContentIterator iterator = new EnumContentIterator(); if (customScope instanceof LocalSearchScope) { for (VirtualFile file : getLocalScopeFiles((LocalSearchScope)customScope)) { @@ -267,6 +270,15 @@ class FindInProjectTask { } } else if (myPsiDirectory != null) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + @Override + public void run() { + if (myPsiDirectory.isValid()) { + addFilesUnderDirectory(myPsiDirectory, iterator); + } + } + }); + myFileIndex.iterateContentUnderDirectory(myPsiDirectory.getVirtualFile(), iterator); } else { @@ -424,4 +436,17 @@ class FindInProjectTask { }); } + private void addFilesUnderDirectory(@NotNull PsiDirectory directory, @NotNull ContentIterator iterator) { + for (PsiElement child : directory.getChildren()) { + if (child instanceof PsiFile) { + VirtualFile virtualFile = ((PsiFile)child).getVirtualFile(); + if (virtualFile != null) { + iterator.processFile(virtualFile); + } + } + else if (myFindModel.isWithSubdirectories() && child instanceof PsiDirectory) { + addFilesUnderDirectory((PsiDirectory)child, iterator); + } + } + } }