move fileScope and filesScope back from GlobalSearchScopes to GlobalSearchScope
[idea/community.git] / platform / lang-api / src / com / intellij / psi / search / GlobalSearchScopes.java
1 /*
2  * Copyright 2000-2011 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.psi.search;
17
18 import com.intellij.openapi.module.Module;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.roots.ProjectFileIndex;
21 import com.intellij.openapi.roots.ProjectRootManager;
22 import com.intellij.openapi.vfs.VfsUtilCore;
23 import com.intellij.openapi.vfs.VirtualFile;
24 import com.intellij.psi.PsiBundle;
25 import com.intellij.psi.PsiDirectory;
26 import com.intellij.psi.PsiFile;
27 import com.intellij.psi.PsiManager;
28 import com.intellij.psi.search.scope.packageSet.*;
29 import org.jetbrains.annotations.NotNull;
30
31 /**
32  * @author yole
33  */
34 public class GlobalSearchScopes {
35   private GlobalSearchScopes() {
36   }
37
38   public static GlobalSearchScope projectProductionScope(@NotNull Project project) {
39     return new GlobalSearchScope.IntersectionScope(GlobalSearchScope.projectScope(project),
40                                  new ProductionScopeFilter(project),
41                                  PsiBundle.message("psi.search.scope.production.files"));
42   }
43
44   public static GlobalSearchScope projectTestScope(@NotNull Project project) {
45     return new GlobalSearchScope.IntersectionScope(GlobalSearchScope.projectScope(project),
46                                  new TestScopeFilter(project),
47                                  PsiBundle.message("psi.search.scope.test.files"));
48   }
49
50   public static GlobalSearchScope directoryScope(@NotNull PsiDirectory directory, final boolean withSubdirectories) {
51     return new DirectoryScope(directory, withSubdirectories);
52   }
53
54   public static GlobalSearchScope directoryScope(@NotNull Project project, @NotNull VirtualFile directory, final boolean withSubdirectories) {
55     return new DirectoryScope(project, directory, withSubdirectories);
56   }
57
58   private static class FilterScopeAdapter extends GlobalSearchScope {
59     private final NamedScope mySet;
60     private final PsiManager myManager;
61
62     private FilterScopeAdapter(@NotNull Project project, @NotNull NamedScope set) {
63       super(project);
64       mySet = set;
65       myManager = PsiManager.getInstance(project);
66     }
67
68     public boolean contains(VirtualFile file) {
69       NamedScopesHolder holder = NamedScopeManager.getInstance(getProject());
70       final PackageSet packageSet = mySet.getValue();
71       if (packageSet != null) {
72         if (packageSet instanceof PackageSetBase) return ((PackageSetBase)packageSet).contains(file, holder);
73         PsiFile psiFile = myManager.findFile(file);
74         if (psiFile == null) return false;
75         return packageSet.contains(psiFile, holder);
76       }
77       return false;
78     }
79
80     public String getDisplayName() {
81       return mySet.getName();
82     }
83
84     public int compare(VirtualFile file1, VirtualFile file2) {
85       return 0;
86
87     }
88
89     public boolean isSearchInModuleContent(@NotNull Module aModule) {
90       return true; //TODO (optimization?)
91     }
92
93     public boolean isSearchInLibraries() {
94       return true; //TODO (optimization?)
95     }
96   }
97
98   public static GlobalSearchScope filterScope(@NotNull Project project, @NotNull NamedScope set) {
99     return new FilterScopeAdapter(project, set);
100   }
101
102   private static class ProductionScopeFilter extends GlobalSearchScope {
103     private final ProjectFileIndex myFileIndex;
104
105     private ProductionScopeFilter(@NotNull Project project) {
106       super(project);
107       myFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
108     }
109
110     public boolean contains(VirtualFile file) {
111       return myFileIndex.isInSourceContent(file) && !myFileIndex.isInTestSourceContent(file);
112     }
113
114     public int compare(VirtualFile file1, VirtualFile file2) {
115       return 0;
116     }
117
118     public boolean isSearchInModuleContent(@NotNull Module aModule) {
119       return true;
120     }
121
122     public boolean isSearchInModuleContent(@NotNull final Module aModule, final boolean testSources) {
123       return !testSources;
124     }
125
126     public boolean isSearchInLibraries() {
127       return false;
128     }
129   }
130
131   private static class TestScopeFilter extends GlobalSearchScope {
132     private final ProjectFileIndex myFileIndex;
133
134     private TestScopeFilter(@NotNull Project project) {
135       super(project);
136       myFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
137     }
138
139     public boolean contains(VirtualFile file) {
140       return myFileIndex.isInTestSourceContent(file);
141     }
142
143     public int compare(VirtualFile file1, VirtualFile file2) {
144       return 0;
145     }
146
147     public boolean isSearchInModuleContent(@NotNull Module aModule) {
148       return true;
149     }
150
151     public boolean isSearchInModuleContent(@NotNull final Module aModule, final boolean testSources) {
152       return testSources;
153     }
154
155     public boolean isSearchInLibraries() {
156       return false;
157     }
158   }
159
160   private static class DirectoryScope extends GlobalSearchScope {
161     private final VirtualFile myDirectory;
162     private final boolean myWithSubdirectories;
163
164     private DirectoryScope(@NotNull PsiDirectory directory, final boolean withSubdirectories) {
165       super(directory.getProject());
166       myWithSubdirectories = withSubdirectories;
167       myDirectory = directory.getVirtualFile();
168     }
169
170     private DirectoryScope(@NotNull Project project, @NotNull VirtualFile directory, final boolean withSubdirectories) {
171       super(project);
172       myWithSubdirectories = withSubdirectories;
173       myDirectory = directory;
174     }
175
176     public boolean contains(VirtualFile file) {
177       if (myWithSubdirectories) {
178         return VfsUtilCore.isAncestor(myDirectory, file, false);
179       }
180       else {
181         return myDirectory.equals(file.getParent());
182       }
183     }
184
185     public int compare(VirtualFile file1, VirtualFile file2) {
186       return 0;
187     }
188
189     public boolean isSearchInModuleContent(@NotNull Module aModule) {
190       return true;
191     }
192
193     public boolean isSearchInLibraries() {
194       return false;
195     }
196
197     public String toString() {
198       //noinspection HardCodedStringLiteral
199       return "directory scope: " + myDirectory + "; withSubdirs:"+myWithSubdirectories;
200     }
201   }
202 }