From 62a68d49fa50f07e7190647c520db58ff27e9e47 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 19 Aug 2011 19:52:12 +0400 Subject: [PATCH] move scope constructors to GlobalSearchScopes --- .../intellij/images/index/ImageInfoIndex.java | 5 +- .../javaCompiler/BackendCompilerWrapper.java | 4 +- .../UnusedLibrariesInspection.java | 3 +- .../psi/impl/source/PsiJavaFileImpl.java | 3 +- .../typeMigration/ui/TypeMigrationDialog.java | 4 +- .../com/intellij/analysis/AnalysisScope.java | 7 +- .../psi/search/GlobalSearchScope.java | 264 +--------------- .../psi/search/GlobalSearchScopes.java | 288 ++++++++++++++++++ .../intellij/find/impl/FindInProjectUtil.java | 4 +- .../ide/hierarchy/HierarchyTreeStructure.java | 7 +- .../ide/util/PlatformPackageUtil.java | 5 +- .../util/scopeChooser/ScopeChooserCombo.java | 15 +- .../cache/impl/IndexCacheManagerImpl.java | 3 +- .../psi/impl/file/impl/FileManagerImpl.java | 3 +- .../src/com/intellij/psi/stubs/StubTree.java | 5 +- .../ObsoleteCollectionInspection.java | 4 +- .../GroovyConstructorUsagesSearcher.java | 5 +- .../execution/junit/TestDirectory.java | 6 +- .../DuplicatePropertyInspection.java | 3 +- 19 files changed, 341 insertions(+), 297 deletions(-) create mode 100644 platform/lang-api/src/com/intellij/psi/search/GlobalSearchScopes.java diff --git a/images/src/org/intellij/images/index/ImageInfoIndex.java b/images/src/org/intellij/images/index/ImageInfoIndex.java index 5413e4adfe54..94026bc8de64 100644 --- a/images/src/org/intellij/images/index/ImageInfoIndex.java +++ b/images/src/org/intellij/images/index/ImageInfoIndex.java @@ -19,7 +19,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.ex.temp.TempFileSystem; -import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopes; import com.intellij.util.indexing.*; import com.intellij.util.io.DataExternalizer; import org.intellij.images.fileTypes.ImageFileTypeManager; @@ -71,7 +71,8 @@ public class ImageInfoIndex extends SingleEntryFileBasedIndexExtension processor, Project project) { - FileBasedIndex.getInstance().processValues(INDEX_ID, Math.abs(FileBasedIndex.getFileId(virtualFile)), virtualFile, processor, GlobalSearchScope.fileScope(project, virtualFile)); + FileBasedIndex.getInstance().processValues(INDEX_ID, Math.abs(FileBasedIndex.getFileId(virtualFile)), virtualFile, processor, GlobalSearchScopes + .fileScope(project, virtualFile)); } public DataExternalizer getValueExternalizer() { diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/BackendCompilerWrapper.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/BackendCompilerWrapper.java index 033bec365cd4..c0a04a997893 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/BackendCompilerWrapper.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/BackendCompilerWrapper.java @@ -60,6 +60,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopes; import com.intellij.util.Chunk; import com.intellij.util.cls.ClsFormatException; import gnu.trove.THashMap; @@ -584,7 +585,8 @@ public class BackendCompilerWrapper { final String packagePrefix, final List filesToRefresh, final Map> results) throws CacheCorruptedException { final Ref exRef = new Ref(null); final ModuleFileIndex fileIndex = ModuleRootManager.getInstance(module).getFileIndex(); - final GlobalSearchScope srcRootScope = GlobalSearchScope.moduleScope(module).intersectWith(GlobalSearchScope.directoryScope(myProject, sourceRoot, true)); + final GlobalSearchScope srcRootScope = GlobalSearchScope.moduleScope(module).intersectWith( + GlobalSearchScopes.directoryScope(myProject, sourceRoot, true)); final ContentIterator contentIterator = new ContentIterator() { public boolean processFile(final VirtualFile child) { diff --git a/java/java-impl/src/com/intellij/codeInspection/unusedLibraries/UnusedLibrariesInspection.java b/java/java-impl/src/com/intellij/codeInspection/unusedLibraries/UnusedLibrariesInspection.java index 177b52540e65..27f8765d911d 100644 --- a/java/java-impl/src/com/intellij/codeInspection/unusedLibraries/UnusedLibrariesInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/unusedLibraries/UnusedLibrariesInspection.java @@ -48,6 +48,7 @@ import com.intellij.psi.PsiCompiledElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiRecursiveElementVisitor; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopes; import com.intellij.psi.search.scope.packageSet.NamedScope; import com.intellij.psi.search.scope.packageSet.PackageSetFactory; import com.intellij.psi.search.scope.packageSet.ParsingException; @@ -94,7 +95,7 @@ public class UnusedLibrariesInspection extends DescriptorProviderInspection { GlobalSearchScope searchScope; try { @NonNls final String libsName = "libs"; - searchScope = GlobalSearchScope.filterScope(project, new NamedScope(libsName, PackageSetFactory.getInstance().compile("lib:*..*"))); + searchScope = GlobalSearchScopes.filterScope(project, new NamedScope(libsName, PackageSetFactory.getInstance().compile("lib:*..*"))); } catch (ParsingException e) { //can't be diff --git a/java/java-impl/src/com/intellij/psi/impl/source/PsiJavaFileImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/PsiJavaFileImpl.java index 7dd47f61f9b0..f491e6407f9e 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/PsiJavaFileImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/PsiJavaFileImpl.java @@ -28,6 +28,7 @@ import com.intellij.psi.PsiElementFactory; import com.intellij.psi.PsiPackageStatement; import com.intellij.psi.impl.java.stubs.JavaStubElementTypes; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopes; import com.intellij.util.IncorrectOperationException; import com.intellij.testFramework.LightVirtualFile; import org.jetbrains.annotations.NotNull; @@ -52,7 +53,7 @@ public class PsiJavaFileImpl extends PsiJavaFileBaseImpl { if (file != null && !(file instanceof LightVirtualFile)) { final ProjectFileIndex index = ProjectRootManager.getInstance(getProject()).getFileIndex(); if (!index.isInSource(file) && !index.isInLibraryClasses(file)) { - return GlobalSearchScope.fileScope(this); + return GlobalSearchScopes.fileScope(this); } } return super.getResolveScope(); diff --git a/java/java-impl/src/com/intellij/refactoring/typeMigration/ui/TypeMigrationDialog.java b/java/java-impl/src/com/intellij/refactoring/typeMigration/ui/TypeMigrationDialog.java index 8ffdffd2c6a8..edbb70b0756c 100644 --- a/java/java-impl/src/com/intellij/refactoring/typeMigration/ui/TypeMigrationDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/typeMigration/ui/TypeMigrationDialog.java @@ -31,7 +31,7 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Disposer; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; -import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopes; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; @@ -145,7 +145,7 @@ public class TypeMigrationDialog extends RefactoringDialog { if (VisibilityUtil.compare(VisibilityUtil.getVisibilityModifier(modifierList), PsiModifier.PRIVATE) < 0) return null; } - for (PsiReference reference : ReferencesSearch.search(root, GlobalSearchScope.fileScope(root.getContainingFile()))) { + for (PsiReference reference : ReferencesSearch.search(root, GlobalSearchScopes.fileScope(root.getContainingFile()))) { final PsiElement element = reference.getElement(); final PsiExpression expr = PsiTreeUtil.getParentOfType(element, PsiExpression.class, false); if (expr != null) { diff --git a/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java b/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java index 0613ad7247d3..d26c90300257 100644 --- a/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java +++ b/platform/lang-api/src/com/intellij/analysis/AnalysisScope.java @@ -38,6 +38,7 @@ import com.intellij.openapi.vfs.VirtualFileFilter; import com.intellij.profile.ProjectProfileManager; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopes; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.util.ArrayUtil; @@ -637,14 +638,14 @@ public class AnalysisScope { case CUSTOM: return myScope; case DIRECTORY: - return GlobalSearchScope.directoryScope((PsiDirectory)myElement, true); + return GlobalSearchScopes.directoryScope((PsiDirectory)myElement, true); case FILE: return new LocalSearchScope(myElement); case INVALID: return LocalSearchScope.EMPTY; case MODULE: GlobalSearchScope moduleScope = GlobalSearchScope.moduleScope(myModule); - return myIncludeTestSource ? moduleScope : GlobalSearchScope.notScope(GlobalSearchScope.projectTestScope(myModule.getProject())).intersectWith(moduleScope); + return myIncludeTestSource ? moduleScope : GlobalSearchScope.notScope(GlobalSearchScopes.projectTestScope(myModule.getProject())).intersectWith(moduleScope); case MODULES: SearchScope scope = GlobalSearchScope.EMPTY_SCOPE; for (Module module : myModules) { @@ -652,7 +653,7 @@ public class AnalysisScope { } return scope; case PROJECT: - return myIncludeTestSource ? GlobalSearchScope.projectScope(myProject) : GlobalSearchScope.projectProductionScope(myProject); + return myIncludeTestSource ? GlobalSearchScope.projectScope(myProject) : GlobalSearchScopes.projectProductionScope(myProject); case VIRTUAL_FILES: return new GlobalSearchScope() { @Override diff --git a/platform/lang-api/src/com/intellij/psi/search/GlobalSearchScope.java b/platform/lang-api/src/com/intellij/psi/search/GlobalSearchScope.java index 7bde88aaab5a..46997bf6d60d 100644 --- a/platform/lang-api/src/com/intellij/psi/search/GlobalSearchScope.java +++ b/platform/lang-api/src/com/intellij/psi/search/GlobalSearchScope.java @@ -20,21 +20,15 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectFileIndex; -import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.*; -import com.intellij.psi.search.scope.packageSet.*; -import com.intellij.psi.util.PsiUtilBase; +import com.intellij.psi.PsiBundle; +import com.intellij.psi.PsiElement; import com.intellij.util.ArrayUtil; 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; public abstract class GlobalSearchScope extends SearchScope implements ProjectAwareFileFilter { @@ -109,7 +103,7 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw result.add(element2); } } - return new LocalSearchScope(PsiUtilBase.toPsiElementArray(result), null, localScope2.isIgnoreInjectedPsi()); + return new LocalSearchScope(result.toArray(new PsiElement[result.size()]), null, localScope2.isIgnoreInjectedPsi()); } @NotNull @@ -161,22 +155,6 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw return ProjectScope.getProjectScope(project); } - public static GlobalSearchScope projectProductionScope(@NotNull Project project) { - return new IntersectionScope(projectScope(project), - new ProductionScopeFilter(project), - PsiBundle.message("psi.search.scope.production.files")); - } - - public static GlobalSearchScope projectTestScope(@NotNull Project project) { - return new IntersectionScope(projectScope(project), - new TestScopeFilter(project), - PsiBundle.message("psi.search.scope.test.files")); - } - - public static GlobalSearchScope filterScope(@NotNull Project project, @NotNull NamedScope set) { - return new FilterScopeAdapter(project, set); - } - public static GlobalSearchScope notScope(@NotNull final GlobalSearchScope scope) { return new DelegatingGlobalSearchScope(scope) { public boolean contains(final VirtualFile file) { @@ -240,33 +218,12 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw return module.getModuleWithDependentsScope(); } - public static GlobalSearchScope directoryScope(@NotNull PsiDirectory directory, final boolean withSubdirectories) { - return new DirectoryScope(directory, withSubdirectories); - } - - public static GlobalSearchScope directoryScope(@NotNull Project project, @NotNull VirtualFile directory, final boolean withSubdirectories) { - return new DirectoryScope(project, directory, withSubdirectories); - } - - public static GlobalSearchScope fileScope(@NotNull PsiFile psiFile) { - return new FileScope(psiFile.getProject(), psiFile.getVirtualFile()); - } - - public static GlobalSearchScope fileScope(final Project project, final VirtualFile virtualFile) { - return new FileScope(project, virtualFile); - } - - public static GlobalSearchScope filesScope(final Project project, final Collection files) { - if (files.isEmpty()) return EMPTY_SCOPE; - return files.size() == 1? fileScope(project, files.iterator().next()) : new FilesScope(project, files); - } - - private static class IntersectionScope extends GlobalSearchScope { + static class IntersectionScope extends GlobalSearchScope { private final GlobalSearchScope myScope1; private final GlobalSearchScope myScope2; private final String myDisplayName; - private IntersectionScope(@NotNull GlobalSearchScope scope1, @NotNull GlobalSearchScope scope2, String displayName) { + IntersectionScope(@NotNull GlobalSearchScope scope1, @NotNull GlobalSearchScope scope2, String displayName) { super(scope1.getProject() == null ? scope2.getProject() : scope1.getProject()); myScope1 = scope1; myScope2 = scope2; @@ -414,217 +371,6 @@ public abstract class GlobalSearchScope extends SearchScope implements ProjectAw } } - private static class ProductionScopeFilter extends GlobalSearchScope { - private final ProjectFileIndex myFileIndex; - - private ProductionScopeFilter(@NotNull Project project) { - super(project); - myFileIndex = ProjectRootManager.getInstance(project).getFileIndex(); - } - - public boolean contains(VirtualFile file) { - return myFileIndex.isInSourceContent(file) && !myFileIndex.isInTestSourceContent(file); - } - - public int compare(VirtualFile file1, VirtualFile file2) { - return 0; - } - - public boolean isSearchInModuleContent(@NotNull Module aModule) { - return true; - } - - public boolean isSearchInModuleContent(@NotNull final Module aModule, final boolean testSources) { - return !testSources; - } - - public boolean isSearchInLibraries() { - return false; - } - } - - private static class TestScopeFilter extends GlobalSearchScope { - private final ProjectFileIndex myFileIndex; - - private TestScopeFilter(@NotNull Project project) { - super(project); - myFileIndex = ProjectRootManager.getInstance(project).getFileIndex(); - } - - public boolean contains(VirtualFile file) { - return myFileIndex.isInTestSourceContent(file); - } - - public int compare(VirtualFile file1, VirtualFile file2) { - return 0; - } - - public boolean isSearchInModuleContent(@NotNull Module aModule) { - return true; - } - - public boolean isSearchInModuleContent(@NotNull final Module aModule, final boolean testSources) { - return testSources; - } - - public boolean isSearchInLibraries() { - return false; - } - } - - private static class DirectoryScope extends GlobalSearchScope { - private final VirtualFile myDirectory; - private final boolean myWithSubdirectories; - - private DirectoryScope(@NotNull PsiDirectory directory, final boolean withSubdirectories) { - super(directory.getProject()); - myWithSubdirectories = withSubdirectories; - myDirectory = directory.getVirtualFile(); - } - - private DirectoryScope(@NotNull Project project, @NotNull VirtualFile directory, final boolean withSubdirectories) { - super(project); - myWithSubdirectories = withSubdirectories; - myDirectory = directory; - } - - public boolean contains(VirtualFile file) { - if (myWithSubdirectories) { - return VfsUtil.isAncestor(myDirectory, file, false); - } - else { - return myDirectory.equals(file.getParent()); - } - } - - public int compare(VirtualFile file1, VirtualFile file2) { - return 0; - } - - public boolean isSearchInModuleContent(@NotNull Module aModule) { - return true; - } - - public boolean isSearchInLibraries() { - return false; - } - - public String toString() { - //noinspection HardCodedStringLiteral - return "directory scope: " + myDirectory + "; withSubdirs:"+myWithSubdirectories; - } - } - - private static class FileScope extends GlobalSearchScope { - private final VirtualFile myVirtualFile; - private final Module myModule; - - private FileScope(final Project project, final VirtualFile virtualFile) { - super(project); - myVirtualFile = virtualFile; - ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); - myModule = myVirtualFile != null ? fileIndex.getModuleForFile(myVirtualFile) : null; - } - - public boolean contains(VirtualFile file) { - return Comparing.equal(myVirtualFile, file); - } - - public int compare(VirtualFile file1, VirtualFile file2) { - return 0; - } - - public boolean isSearchInModuleContent(@NotNull Module aModule) { - return aModule == myModule; - } - - public boolean isSearchInLibraries() { - return myModule == null; - } - } - - private static class FilesScope extends GlobalSearchScope { - private final Collection myFiles; - - public FilesScope(final Project project, final Collection files) { - super(project); - myFiles = files; - } - - @Override - public boolean contains(final VirtualFile file) { - return myFiles.contains(file); - } - - @Override - public int compare(final VirtualFile file1, final VirtualFile file2) { - return 0; - } - - @Override - public boolean isSearchInModuleContent(@NotNull Module aModule) { - return true; - } - - @Override - public boolean isSearchInLibraries() { - return false; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof FilesScope)) return false; - - return myFiles.equals(((FilesScope)o).myFiles); - } - - @Override - public int hashCode() { - return myFiles.hashCode(); - } - } - - private static class FilterScopeAdapter extends GlobalSearchScope { - private final NamedScope mySet; - private final PsiManager myManager; - - private FilterScopeAdapter(@NotNull Project project, @NotNull NamedScope set) { - super(project); - mySet = set; - myManager = PsiManager.getInstance(project); - } - - public boolean contains(VirtualFile file) { - NamedScopesHolder holder = NamedScopeManager.getInstance(getProject()); - final PackageSet packageSet = mySet.getValue(); - if (packageSet != null) { - if (packageSet instanceof PackageSetBase) return ((PackageSetBase)packageSet).contains(file, holder); - PsiFile psiFile = myManager.findFile(file); - if (psiFile == null) return false; - return packageSet.contains(psiFile, holder); - } - return false; - } - - public String getDisplayName() { - return mySet.getName(); - } - - public int compare(VirtualFile file1, VirtualFile file2) { - return 0; - - } - - public boolean isSearchInModuleContent(@NotNull Module aModule) { - return true; //TODO (optimization?) - } - - public boolean isSearchInLibraries() { - return true; //TODO (optimization?) - } - } - @NotNull public static GlobalSearchScope getScopeRestrictedByFileTypes (@NotNull GlobalSearchScope scope, final FileType... fileTypes) { LOG.assertTrue(fileTypes.length > 0); diff --git a/platform/lang-api/src/com/intellij/psi/search/GlobalSearchScopes.java b/platform/lang-api/src/com/intellij/psi/search/GlobalSearchScopes.java new file mode 100644 index 000000000000..e1e550aced24 --- /dev/null +++ b/platform/lang-api/src/com/intellij/psi/search/GlobalSearchScopes.java @@ -0,0 +1,288 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.psi.search; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiBundle; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.search.scope.packageSet.*; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +/** + * @author yole + */ +public class GlobalSearchScopes { + private GlobalSearchScopes() { + } + + public static GlobalSearchScope projectProductionScope(@NotNull Project project) { + return new GlobalSearchScope.IntersectionScope(GlobalSearchScope.projectScope(project), + new ProductionScopeFilter(project), + PsiBundle.message("psi.search.scope.production.files")); + } + + public static GlobalSearchScope projectTestScope(@NotNull Project project) { + return new GlobalSearchScope.IntersectionScope(GlobalSearchScope.projectScope(project), + new TestScopeFilter(project), + PsiBundle.message("psi.search.scope.test.files")); + } + + public static GlobalSearchScope directoryScope(@NotNull PsiDirectory directory, final boolean withSubdirectories) { + return new DirectoryScope(directory, withSubdirectories); + } + + public static GlobalSearchScope directoryScope(@NotNull Project project, @NotNull VirtualFile directory, final boolean withSubdirectories) { + return new DirectoryScope(project, directory, withSubdirectories); + } + + public static GlobalSearchScope fileScope(@NotNull PsiFile psiFile) { + return new FileScope(psiFile.getProject(), psiFile.getVirtualFile()); + } + + public static GlobalSearchScope fileScope(final Project project, final VirtualFile virtualFile) { + return new FileScope(project, virtualFile); + } + + public static GlobalSearchScope filesScope(final Project project, final Collection files) { + if (files.isEmpty()) return GlobalSearchScope.EMPTY_SCOPE; + return files.size() == 1? fileScope(project, files.iterator().next()) : new FilesScope(project, files); + } + + private static class FilterScopeAdapter extends GlobalSearchScope { + private final NamedScope mySet; + private final PsiManager myManager; + + private FilterScopeAdapter(@NotNull Project project, @NotNull NamedScope set) { + super(project); + mySet = set; + myManager = PsiManager.getInstance(project); + } + + public boolean contains(VirtualFile file) { + NamedScopesHolder holder = NamedScopeManager.getInstance(getProject()); + final PackageSet packageSet = mySet.getValue(); + if (packageSet != null) { + if (packageSet instanceof PackageSetBase) return ((PackageSetBase)packageSet).contains(file, holder); + PsiFile psiFile = myManager.findFile(file); + if (psiFile == null) return false; + return packageSet.contains(psiFile, holder); + } + return false; + } + + public String getDisplayName() { + return mySet.getName(); + } + + public int compare(VirtualFile file1, VirtualFile file2) { + return 0; + + } + + public boolean isSearchInModuleContent(@NotNull Module aModule) { + return true; //TODO (optimization?) + } + + public boolean isSearchInLibraries() { + return true; //TODO (optimization?) + } + } + + public static GlobalSearchScope filterScope(@NotNull Project project, @NotNull NamedScope set) { + return new FilterScopeAdapter(project, set); + } + + private static class ProductionScopeFilter extends GlobalSearchScope { + private final ProjectFileIndex myFileIndex; + + private ProductionScopeFilter(@NotNull Project project) { + super(project); + myFileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + } + + public boolean contains(VirtualFile file) { + return myFileIndex.isInSourceContent(file) && !myFileIndex.isInTestSourceContent(file); + } + + public int compare(VirtualFile file1, VirtualFile file2) { + return 0; + } + + public boolean isSearchInModuleContent(@NotNull Module aModule) { + return true; + } + + public boolean isSearchInModuleContent(@NotNull final Module aModule, final boolean testSources) { + return !testSources; + } + + public boolean isSearchInLibraries() { + return false; + } + } + + private static class TestScopeFilter extends GlobalSearchScope { + private final ProjectFileIndex myFileIndex; + + private TestScopeFilter(@NotNull Project project) { + super(project); + myFileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + } + + public boolean contains(VirtualFile file) { + return myFileIndex.isInTestSourceContent(file); + } + + public int compare(VirtualFile file1, VirtualFile file2) { + return 0; + } + + public boolean isSearchInModuleContent(@NotNull Module aModule) { + return true; + } + + public boolean isSearchInModuleContent(@NotNull final Module aModule, final boolean testSources) { + return testSources; + } + + public boolean isSearchInLibraries() { + return false; + } + } + + private static class DirectoryScope extends GlobalSearchScope { + private final VirtualFile myDirectory; + private final boolean myWithSubdirectories; + + private DirectoryScope(@NotNull PsiDirectory directory, final boolean withSubdirectories) { + super(directory.getProject()); + myWithSubdirectories = withSubdirectories; + myDirectory = directory.getVirtualFile(); + } + + private DirectoryScope(@NotNull Project project, @NotNull VirtualFile directory, final boolean withSubdirectories) { + super(project); + myWithSubdirectories = withSubdirectories; + myDirectory = directory; + } + + public boolean contains(VirtualFile file) { + if (myWithSubdirectories) { + return VfsUtil.isAncestor(myDirectory, file, false); + } + else { + return myDirectory.equals(file.getParent()); + } + } + + public int compare(VirtualFile file1, VirtualFile file2) { + return 0; + } + + public boolean isSearchInModuleContent(@NotNull Module aModule) { + return true; + } + + public boolean isSearchInLibraries() { + return false; + } + + public String toString() { + //noinspection HardCodedStringLiteral + return "directory scope: " + myDirectory + "; withSubdirs:"+myWithSubdirectories; + } + } + + private static class FileScope extends GlobalSearchScope { + private final VirtualFile myVirtualFile; + private final Module myModule; + + private FileScope(final Project project, final VirtualFile virtualFile) { + super(project); + myVirtualFile = virtualFile; + ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + myModule = myVirtualFile != null ? fileIndex.getModuleForFile(myVirtualFile) : null; + } + + public boolean contains(VirtualFile file) { + return Comparing.equal(myVirtualFile, file); + } + + public int compare(VirtualFile file1, VirtualFile file2) { + return 0; + } + + public boolean isSearchInModuleContent(@NotNull Module aModule) { + return aModule == myModule; + } + + public boolean isSearchInLibraries() { + return myModule == null; + } + } + + private static class FilesScope extends GlobalSearchScope { + private final Collection myFiles; + + public FilesScope(final Project project, final Collection files) { + super(project); + myFiles = files; + } + + @Override + public boolean contains(final VirtualFile file) { + return myFiles.contains(file); + } + + @Override + public int compare(final VirtualFile file1, final VirtualFile file2) { + return 0; + } + + @Override + public boolean isSearchInModuleContent(@NotNull Module aModule) { + return true; + } + + @Override + public boolean isSearchInLibraries() { + return false; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof FilesScope)) return false; + + return myFiles.equals(((FilesScope)o).myFiles); + } + + @Override + public int hashCode() { + return myFiles.hashCode(); + } + } +} 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 71a459a6c037..0383f854bc5d 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java @@ -447,7 +447,7 @@ public class FindInProjectUtil { CacheManager cacheManager = ((PsiManagerEx)pm).getCacheManager(); SearchScope customScope = findModel.getCustomScope(); @NotNull GlobalSearchScope scope = psiDirectory != null - ? GlobalSearchScope.directoryScope(psiDirectory, true) + ? GlobalSearchScopes.directoryScope(psiDirectory, true) : module != null ? moduleContentScope(module) : customScope instanceof GlobalSearchScope @@ -534,7 +534,7 @@ public class FindInProjectUtil { for (VirtualFile root : contentRoots) { PsiDirectory directory = psiManager.findDirectory(root); if (directory != null) { - GlobalSearchScope moduleContent = GlobalSearchScope.directoryScope(directory, true); + GlobalSearchScope moduleContent = GlobalSearchScopes.directoryScope(directory, true); result = result == null ? moduleContent : result.uniteWith(moduleContent); } } diff --git a/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyTreeStructure.java b/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyTreeStructure.java index 12ca4c836848..dc8d8709ce97 100644 --- a/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyTreeStructure.java +++ b/platform/lang-impl/src/com/intellij/ide/hierarchy/HierarchyTreeStructure.java @@ -25,6 +25,7 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopes; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.search.scope.packageSet.NamedScope; @@ -142,14 +143,14 @@ public abstract class HierarchyTreeStructure extends AbstractTreeStructure { searchScope = new LocalSearchScope(thisClass); } else if (HierarchyBrowserBaseEx.SCOPE_PROJECT.equals(scopeType)) { - searchScope = GlobalSearchScope.projectProductionScope(myProject); + searchScope = GlobalSearchScopes.projectProductionScope(myProject); } else if (HierarchyBrowserBaseEx.SCOPE_TEST.equals(scopeType)) { - searchScope = GlobalSearchScope.projectTestScope(myProject); + searchScope = GlobalSearchScopes.projectTestScope(myProject); } else { final NamedScope namedScope = NamedScopesHolder.getScope(myProject, scopeType); if (namedScope != null) { - searchScope = GlobalSearchScope.filterScope(myProject, namedScope); + searchScope = GlobalSearchScopes.filterScope(myProject, namedScope); } } return searchScope; diff --git a/platform/lang-impl/src/com/intellij/ide/util/PlatformPackageUtil.java b/platform/lang-impl/src/com/intellij/ide/util/PlatformPackageUtil.java index 62c13ef62938..4d152236e64a 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/PlatformPackageUtil.java +++ b/platform/lang-impl/src/com/intellij/ide/util/PlatformPackageUtil.java @@ -35,6 +35,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopes; import com.intellij.util.*; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -183,12 +184,12 @@ public class PlatformPackageUtil { final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(baseDir.getProject()).getFileIndex(); if (fileIndex.isInTestSourceContent(baseDir.getVirtualFile())) { if (skipSourceDirsForBaseTestDirectory) { - return scope.intersectWith(GlobalSearchScope.projectTestScope(baseDir.getProject())); + return scope.intersectWith(GlobalSearchScopes.projectTestScope(baseDir.getProject())); } } else { if (skipTestDirsForBaseSourceDirectory) { - return scope.intersectWith(GlobalSearchScope.projectProductionScope(baseDir.getProject())); + return scope.intersectWith(GlobalSearchScopes.projectProductionScope(baseDir.getProject())); } } } diff --git a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java index 7bc8fd2d72b3..de1fa0f00566 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java +++ b/platform/lang-impl/src/com/intellij/ide/util/scopeChooser/ScopeChooserCombo.java @@ -36,10 +36,7 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiWhiteSpace; -import com.intellij.psi.search.DelegatingGlobalSearchScope; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.LocalSearchScope; -import com.intellij.psi.search.SearchScope; +import com.intellij.psi.search.*; import com.intellij.psi.search.scope.packageSet.NamedScope; import com.intellij.psi.search.scope.packageSet.NamedScopeManager; import com.intellij.psi.search.scope.packageSet.NamedScopesHolder; @@ -165,13 +162,13 @@ public class ScopeChooserCombo extends ComboboxWithBrowseButton implements Dispo List changeLists = ChangeListsScopesProvider.getInstance(myProject).getCustomScopes(); for (NamedScope changeListScope : changeLists) { - model.addElement(new ScopeDescriptor(GlobalSearchScope.filterScope(myProject, changeListScope))); + model.addElement(new ScopeDescriptor(GlobalSearchScopes.filterScope(myProject, changeListScope))); } final NamedScopesHolder[] holders = NamedScopesHolder.getAllNamedScopeHolders(myProject); for (NamedScopesHolder holder : holders) { NamedScope[] scopes = holder.getEditableScopes(); //predefined scopes already included for (NamedScope scope : scopes) { - model.addElement(new ScopeDescriptor(GlobalSearchScope.filterScope(myProject, scope))); + model.addElement(new ScopeDescriptor(GlobalSearchScopes.filterScope(myProject, scope))); } } @@ -201,8 +198,8 @@ public class ScopeChooserCombo extends ComboboxWithBrowseButton implements Dispo if (suggestSearchInLibs) { result.add(GlobalSearchScope.allScope(project)); } - result.add(GlobalSearchScope.projectProductionScope(project)); - result.add(GlobalSearchScope.projectTestScope(project)); + result.add(GlobalSearchScopes.projectProductionScope(project)); + result.add(GlobalSearchScopes.projectTestScope(project)); if (dataContext != null) { PsiElement dataContextElement = getDataContextElement(dataContext); @@ -350,7 +347,7 @@ public class ScopeChooserCombo extends ComboboxWithBrowseButton implements Dispo final VirtualFile[] files = PlatformDataKeys.VIRTUAL_FILE_ARRAY.getData(dataContext); if (files != null) { final List openFiles = Arrays.asList(files); - result.add(new DelegatingGlobalSearchScope(GlobalSearchScope.filesScope(project, openFiles)){ + result.add(new DelegatingGlobalSearchScope(GlobalSearchScopes.filesScope(project, openFiles)){ @Override public String getDisplayName() { return "Selected files"; diff --git a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java index 07a62799ea0e..2d63018bfa56 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/cache/impl/IndexCacheManagerImpl.java @@ -36,6 +36,7 @@ import com.intellij.psi.impl.cache.impl.id.IdIndexEntry; import com.intellij.psi.impl.cache.impl.todo.TodoIndex; import com.intellij.psi.impl.cache.impl.todo.TodoIndexEntry; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopes; import com.intellij.psi.search.IndexPattern; import com.intellij.psi.search.IndexPatternProvider; import com.intellij.psi.util.PsiUtilBase; @@ -188,7 +189,7 @@ public class IndexCacheManagerImpl implements CacheManager{ count[0] += value.intValue(); return true; } - }, GlobalSearchScope.fileScope(myProject, file)); + }, GlobalSearchScopes.fileScope(myProject, file)); return count[0]; } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java index a1fb032c7a78..638553369d2d 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/file/impl/FileManagerImpl.java @@ -47,6 +47,7 @@ import com.intellij.psi.impl.smartPointers.SmartPointerManagerImpl; import com.intellij.psi.impl.source.PsiFileImpl; import com.intellij.psi.impl.source.resolve.FileContextUtil; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopes; import com.intellij.psi.search.SearchScope; import com.intellij.util.ConcurrencyUtil; import com.intellij.util.FileContentUtil; @@ -480,7 +481,7 @@ public class FileManagerImpl implements FileManager { final VirtualFile vf = f == null ? null : f.getVirtualFile(); return f == null || vf == null || vf.isDirectory() || allScope.contains(vf) - ? allScope : GlobalSearchScope.fileScope(f).uniteWith(allScope); + ? allScope : GlobalSearchScopes.fileScope(f).uniteWith(allScope); } } diff --git a/platform/lang-impl/src/com/intellij/psi/stubs/StubTree.java b/platform/lang-impl/src/com/intellij/psi/stubs/StubTree.java index 14a04b93b02d..b45f7df53397 100644 --- a/platform/lang-impl/src/com/intellij/psi/stubs/StubTree.java +++ b/platform/lang-impl/src/com/intellij/psi/stubs/StubTree.java @@ -27,7 +27,7 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopes; import com.intellij.util.indexing.FileBasedIndex; import com.intellij.util.indexing.FileContent; import com.intellij.util.indexing.FileContentImpl; @@ -133,7 +133,8 @@ public class StubTree { final int id = Math.abs(FileBasedIndex.getFileId(vFile)); if (id > 0) { - final List datas = FileBasedIndex.getInstance().getValues(StubUpdatingIndex.INDEX_ID, id, GlobalSearchScope.fileScope(project, vFile)); + final List datas = FileBasedIndex.getInstance().getValues(StubUpdatingIndex.INDEX_ID, id, GlobalSearchScopes + .fileScope(project, vFile)); final int size = datas.size(); if (size == 1) { diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/ObsoleteCollectionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/ObsoleteCollectionInspection.java index c99600adb7d4..4d6de46f0887 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/ObsoleteCollectionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/maturity/ObsoleteCollectionInspection.java @@ -16,7 +16,7 @@ package com.siyeh.ig.maturity; import com.intellij.psi.*; -import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.GlobalSearchScopes; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Query; @@ -150,7 +150,7 @@ public class ObsoleteCollectionInspection extends BaseInspection { final PsiFile containingFile = namedElement.getContainingFile(); final Query query = ReferencesSearch.search(namedElement, - GlobalSearchScope.fileScope(containingFile)); + GlobalSearchScopes.fileScope(containingFile)); for (PsiReference reference : query) { final PsiElement element = reference.getElement(); if (isRequiredObsoleteCollectionElement(element)) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearcher.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearcher.java index cdd8870a25df..425261b0e149 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearcher.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/findUsages/GroovyConstructorUsagesSearcher.java @@ -201,7 +201,8 @@ public class GroovyConstructorUsagesSearcher extends QueryExecutorBase