diff --git a/java/java-tests/testData/find/libUnderProject/lib/B.java b/java/java-tests/testData/find/libUnderProject/lib/B.java new file mode 100644 index 000000000000..634b3185283e --- /dev/null +++ b/java/java-tests/testData/find/libUnderProject/lib/B.java @@ -0,0 +1 @@ +// TargetWord \ No newline at end of file diff --git a/java/java-tests/testData/find/libUnderProject/src/A.java b/java/java-tests/testData/find/libUnderProject/src/A.java new file mode 100644 index 000000000000..634b3185283e --- /dev/null +++ b/java/java-tests/testData/find/libUnderProject/src/A.java @@ -0,0 +1 @@ +// TargetWord \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java index e4f87ab46151..660ba9dcfe0c 100644 --- a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java +++ b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java @@ -20,8 +20,14 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; +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.usageView.UsageInfo; import com.intellij.usages.Usage; +import com.intellij.util.ArrayUtil; +import com.intellij.util.ThrowableRunnable; import com.intellij.util.WaitFor; import java.io.File; @@ -360,4 +366,63 @@ public class FindManagerTest extends DaemonAnalyzerTestCase { assertEquals(newText, getEditor().getDocument().getText()); } + public void testFindInFileUnderLibraryUnderProject() throws Exception { + initProject("libUnderProject", "src"); + PsiTestUtil.addLibrary(myModule, "lib", JavaTestUtil.getJavaTestDataPath() + "/find/libUnderProject/lib", new String[]{""}, ArrayUtil.EMPTY_STRING_ARRAY); + + FindModel findModel = new FindModel(); + findModel.setStringToFind("TargetWord"); + findModel.setFromCursor(false); + findModel.setGlobal(true); + findModel.setMultipleFiles(true); + + findModel.setWholeWordsOnly(false); + assertSize(2, findUsages(findModel)); + + /* todo + findModel.setWholeWordsOnly(true); + assertSize(2, findUsages(findModel)); + */ + } + + public void testLocalScopeSearchPerformance() throws Exception { + final int count = 3000; + TempDirTestFixture fixture = new LightTempDirTestFixtureImpl(); + fixture.setUp(); + + try { + String sampleText = StringUtil.repeat("zoo TargetWord foo bar goo\n", count); + for (int i = 0; i < count; i++) { + fixture.createFile("a" + i + ".txt", sampleText); + } + PsiTestUtil.addSourceContentToRoots(myModule, fixture.getFile("")); + + VirtualFile file = fixture.createFile("target.txt", sampleText); + PsiFile psiFile = PsiManager.getInstance(myProject).findFile(file); + final FindModel findModel = new FindModel(); + findModel.setStringToFind("TargetWord"); + findModel.setWholeWordsOnly(true); + findModel.setFromCursor(false); + findModel.setGlobal(true); + findModel.setMultipleFiles(true); + + ThrowableRunnable test = new ThrowableRunnable() { + @Override + public void run() throws Throwable { + assertSize(count, findUsages(findModel)); + } + }; + + findModel.setCustomScope(GlobalSearchScope.fileScope(psiFile)); + PlatformTestUtil.startPerformanceTest("slow", 500, test).attempts(1).cpuBound().usesAllCPUCores().assertTiming(); + + findModel.setCustomScope(new LocalSearchScope(psiFile)); + PlatformTestUtil.startPerformanceTest("slow", 500, test).attempts(1).cpuBound().usesAllCPUCores().assertTiming(); + } + finally { + fixture.tearDown(); + } + } + + } 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 e073957689ed..a9c2eb118461 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java @@ -393,7 +393,7 @@ public class FindInProjectUtil { public boolean processFile(@NotNull VirtualFile virtualFile) { if (!virtualFile.isDirectory() && (fileMaskRegExp == null || fileMaskRegExp.matcher(virtualFile.getName()).matches()) && - customScope.contains(virtualFile)) { + (customScope == null || customScope.contains(virtualFile))) { final PsiFile psiFile = psiManager.findFile(virtualFile); if (psiFile != null && !filesForFastWordSearch.contains(psiFile)) { myFiles.add(psiFile); @@ -411,7 +411,7 @@ public class FindInProjectUtil { if (psiDirectory == null) { boolean success = fileIndex.iterateContent(iterator); - if (success && customScope.isSearchInLibraries()) { + if (success && customScope != null && customScope.isSearchInLibraries()) { OrderEnumerator enumerator = module == null ? OrderEnumerator.orderEntries(project) : OrderEnumerator.orderEntries(module); final VirtualFile[] librarySources = enumerator.withoutModuleSourceEntries().withoutDepModules().getSourceRoots(); iterateAll(librarySources, customScope, iterator); @@ -451,14 +451,11 @@ public class FindInProjectUtil { return true; } - @NotNull + @Nullable private static GlobalSearchScope toGlobal(@NotNull Project project, @Nullable SearchScope scope) { - if (scope instanceof GlobalSearchScope) { + if (scope instanceof GlobalSearchScope || scope == null) { return (GlobalSearchScope)scope; } - if (scope == null) { - return projectContentScope(project); - } Set files = new HashSet(); for (PsiElement element : ((LocalSearchScope)scope).getScope()) { PsiFile file = element.getContainingFile(); @@ -471,8 +468,8 @@ public class FindInProjectUtil { @NotNull private static Pair> getFilesForFastWordSearch(@NotNull final FindModel findModel, @NotNull final Project project, - @Nullable final PsiDirectory psiDirectory, final Pattern fileMaskRegExp, - @Nullable final Module module) { + @Nullable final PsiDirectory psiDirectory, final Pattern fileMaskRegExp, + @Nullable final Module module) { if (DumbService.getInstance(project).isDumb()) { return new Pair>(false, Collections.emptyList()); } @@ -480,13 +477,16 @@ public class FindInProjectUtil { PsiManager pm = PsiManager.getInstance(project); CacheManager cacheManager = CacheManager.SERVICE.getInstance(project); SearchScope customScope = findModel.getCustomScope(); - @NotNull GlobalSearchScope scope = psiDirectory != null - ? GlobalSearchScopes.directoryScope(psiDirectory, true) - : module != null - ? moduleContentScope(module) - : customScope instanceof GlobalSearchScope - ? (GlobalSearchScope)customScope - : toGlobal(project, customScope); + GlobalSearchScope scope = psiDirectory != null + ? GlobalSearchScopes.directoryScope(psiDirectory, true) + : module != null + ? moduleContentScope(module) + : customScope instanceof GlobalSearchScope + ? (GlobalSearchScope)customScope + : toGlobal(project, customScope); + if (scope == null) { + scope = GlobalSearchScope.projectScope(project); + } Set keys = new THashSet(30); Set resultFiles = new THashSet(); @@ -554,16 +554,7 @@ public class FindInProjectUtil { return new Pair>(fast, resultFiles); } - private static GlobalSearchScope projectContentScope(final Project project) { - GlobalSearchScope result = null; - for (Module module : ModuleManager.getInstance(project).getModules()) { - GlobalSearchScope moduleContent = moduleContentScope(module); - result = result == null ? moduleContent : result.uniteWith(moduleContent); - } - return result == null ? GlobalSearchScope.EMPTY_SCOPE : result; - } - - @Nullable + @NotNull private static GlobalSearchScope moduleContentScope(@NotNull final Module module) { VirtualFile[] contentRoots = ModuleRootManager.getInstance(module).getContentRoots(); GlobalSearchScope result = null; diff --git a/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java b/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java index bb23a883e389..78f95bd52d1a 100644 --- a/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java +++ b/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java @@ -286,7 +286,7 @@ import java.util.Collection; ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { final ModifiableRootModel model = ModuleRootManager.getInstance(module).getModifiableModel(); - final String parentUrl = VirtualFileManager.constructUrl(JarFileSystem.PROTOCOL, libDir); + final String parentUrl = VirtualFileManager.constructUrl(classRoots[0].endsWith(".jar!/") ? JarFileSystem.PROTOCOL : LocalFileSystem.PROTOCOL, libDir); final Library library = model.getModuleLibraryTable().createLibrary(libName); final Library.ModifiableModel libModifiableModel = library.getModifiableModel(); for (String classRoot : classRoots) {