IDEA-117362 Find/Replace in Path does not work for current file if current file isn't part of the project

This commit is contained in:
peter
2013-12-15 20:04:54 +01:00
parent 924e475d89
commit ea159c5ebf
2 changed files with 33 additions and 6 deletions
@@ -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 */";
@@ -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<PsiFile> myFiles = new ArrayList<PsiFile>(filesForFastWordSearch);
final Set<PsiFile> myFiles = new LinkedHashSet<PsiFile>(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<VirtualFile> getLocalScopeFiles(LocalSearchScope scope) {
Set<VirtualFile> files = new HashSet<VirtualFile>();
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