5053a3838b12fae602cbd804cb74aad0c30a11ae
[idea/community.git] / platform / lang-impl / src / com / intellij / psi / search / ProjectScopeBuilderImpl.java
1 // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.psi.search;
3
4 import com.intellij.core.CoreProjectScopeBuilder;
5 import com.intellij.ide.scratch.RootType;
6 import com.intellij.openapi.module.Module;
7 import com.intellij.openapi.module.UnloadedModuleDescription;
8 import com.intellij.openapi.project.Project;
9 import com.intellij.openapi.roots.FileIndexFacade;
10 import com.intellij.openapi.roots.ProjectRootManager;
11 import com.intellij.openapi.roots.impl.DirectoryInfo;
12 import com.intellij.openapi.roots.impl.ProjectFileIndexImpl;
13 import com.intellij.openapi.vfs.VirtualFile;
14 import com.intellij.psi.PsiBundle;
15 import org.jetbrains.annotations.NotNull;
16
17 import java.util.Collection;
18 import java.util.Collections;
19
20 /**
21  * @author yole
22  */
23 public class ProjectScopeBuilderImpl extends ProjectScopeBuilder {
24
25   protected final Project myProject;
26
27   public ProjectScopeBuilderImpl(@NotNull Project project) {
28     myProject = project;
29   }
30
31   @NotNull
32   @Override
33   public GlobalSearchScope buildEverythingScope() {
34     return new EverythingGlobalScope(myProject) {
35       @Override
36       public boolean contains(@NotNull VirtualFile file) {
37         RootType rootType = RootType.forFile(file);
38         if (rootType != null && (rootType.isHidden() || rootType.isIgnored(myProject, file))) return false;
39         return true;
40       }
41     };
42   }
43
44   @NotNull
45   @Override
46   public GlobalSearchScope buildLibrariesScope() {
47     ProjectAndLibrariesScope result = new ProjectAndLibrariesScope(myProject) {
48       @Override
49       public boolean contains(@NotNull VirtualFile file) {
50         return myProjectFileIndex.isInLibrary(file);
51       }
52
53       @Override
54       public boolean isSearchInModuleContent(@NotNull Module aModule) {
55         return false;
56       }
57
58       @NotNull
59       @Override
60       public Collection<UnloadedModuleDescription> getUnloadedModulesBelongingToScope() {
61         return Collections.emptySet();
62       }
63     };
64     result.setDisplayName(PsiBundle.message("psi.search.scope.libraries"));
65     return result;
66   }
67
68   @NotNull
69   @Override
70   public GlobalSearchScope buildAllScope() {
71     final ProjectRootManager projectRootManager = ProjectRootManager.getInstance(myProject);
72     if (projectRootManager == null) return new EverythingGlobalScope(myProject);
73
74     boolean searchOutsideRootModel = false;
75     for (SearchScopeEnlarger each : SearchScopeEnlarger.EXTENSION.getExtensionList()) {
76       searchOutsideRootModel = each.allScopeSearchesOutsideRootModel(myProject);
77       if (searchOutsideRootModel) break;
78     }
79
80     return new ProjectAndLibrariesScope(myProject, searchOutsideRootModel) {
81       @Override
82       public boolean contains(@NotNull VirtualFile file) {
83         DirectoryInfo info = ((ProjectFileIndexImpl)myProjectFileIndex).getInfoForFileOrDirectory(file);
84         return info.isInProject(file) &&
85                (info.getModule() != null || info.hasLibraryClassRoot() || info.isInLibrarySource(file));
86       }
87     };
88   }
89
90   @NotNull
91   @Override
92   public GlobalSearchScope buildProjectScope() {
93     final ProjectRootManager projectRootManager = ProjectRootManager.getInstance(myProject);
94     if (projectRootManager == null) {
95       return new EverythingGlobalScope(myProject) {
96         @Override
97         public boolean isSearchInLibraries() {
98           return false;
99         }
100       };
101     }
102     return new ProjectScopeImpl(myProject, FileIndexFacade.getInstance(myProject));
103   }
104
105   @NotNull
106   @Override
107   public GlobalSearchScope buildContentScope() {
108     return new CoreProjectScopeBuilder.ContentSearchScope(myProject, FileIndexFacade.getInstance(myProject));
109   }
110 }