add ProjectFileIndex.getInstance(Project) to simplify clients
[idea/community.git] / platform / projectModel-api / src / com / intellij / openapi / roots / ProjectFileIndex.java
1 /*
2  * Copyright 2000-2016 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.openapi.roots;
17
18 import com.intellij.openapi.components.ServiceManager;
19 import com.intellij.openapi.fileTypes.FileTypeRegistry;
20 import com.intellij.openapi.module.Module;
21 import com.intellij.openapi.project.Project;
22 import com.intellij.openapi.vfs.VirtualFile;
23 import org.jetbrains.annotations.NotNull;
24 import org.jetbrains.annotations.Nullable;
25
26 import java.util.List;
27
28 /**
29  * Provides information about files contained in a project.
30  *
31  * @see ProjectRootManager#getFileIndex()
32  */
33 public interface ProjectFileIndex extends FileIndex {
34   class SERVICE {
35     private SERVICE() { }
36
37     /**
38      * @deprecated use {@link ProjectFileIndex#getInstance(Project)} instead
39      */
40     public static ProjectFileIndex getInstance(Project project) {
41       return ProjectFileIndex.getInstance(project);
42     }
43   }
44
45   @NotNull
46   static ProjectFileIndex getInstance(@NotNull Project project) {
47     return ServiceManager.getService(project, ProjectFileIndex.class);
48   }
49
50   /**
51    * Returns module to which content the specified file belongs or null if the file does not belong to content of any module.
52    */
53   @Nullable
54   Module getModuleForFile(@NotNull VirtualFile file);
55
56   /**
57    * Returns module to which content the specified file belongs or null if the file does not belong to content of any module.
58    *
59    * @param honorExclusion if {@code false} the containing module will be returned even if the file is located under a folder marked as excluded
60    */
61   @Nullable
62   Module getModuleForFile(@NotNull VirtualFile file, boolean honorExclusion);
63
64   /**
65    * Returns the order entries which contain the specified file (either in CLASSES or SOURCES).
66    */
67   @NotNull
68   List<OrderEntry> getOrderEntriesForFile(@NotNull VirtualFile file);
69
70   /**
71    * Returns a classpath entry to which the specified file or directory belongs.
72    *
73    * @return the file for the classpath entry, or null if the file is not a compiled
74    *         class file or directory belonging to a library.
75    */
76   @Nullable
77   VirtualFile getClassRootForFile(@NotNull VirtualFile file);
78
79   /**
80    * Returns the module source root or library source root to which the specified file or directory belongs.
81    *
82    * @return the file for the source root, or null if the file is not located under any of the source roots for the module.
83    */
84   @Nullable
85   VirtualFile getSourceRootForFile(@NotNull VirtualFile file);
86
87   /**
88    * Returns the module content root to which the specified file or directory belongs or null if the file does not belong to content of any module.
89    */
90   @Nullable
91   VirtualFile getContentRootForFile(@NotNull VirtualFile file);
92
93   /**
94    * Returns the module content root to which the specified file or directory belongs or null if the file does not belong to content of any module.
95    *
96    * @param honorExclusion if {@code false} the containing content root will be returned even if the file is located under a folder marked as excluded
97    */
98   @Nullable
99   VirtualFile getContentRootForFile(@NotNull VirtualFile file, final boolean honorExclusion);
100
101   /**
102    * Returns the name of the package corresponding to the specified directory.
103    *
104    * @return the package name, or null if the directory does not correspond to any package.
105    */
106   @Nullable
107   String getPackageNameByDirectory(@NotNull VirtualFile dir); //Q: move to FileIndex?
108
109   /**
110    * Returns true if <code>file</code> is a file which belongs to the classes (not sources) of some library which is included into dependencies
111    * of some module.
112    */
113   boolean isLibraryClassFile(@NotNull VirtualFile file);
114
115   /**
116    * Returns true if <code>fileOrDir</code> is a file or directory from production/test sources of some module or sources of some library which is included into dependencies
117    * of some module.
118    */
119   boolean isInSource(@NotNull VirtualFile fileOrDir);
120
121   /**
122    * Returns true if <code>fileOrDir</code> belongs to classes of some library which is included into dependencies of some module.
123    */
124   boolean isInLibraryClasses(@NotNull VirtualFile fileOrDir);
125
126   /**
127    * @return true if the file belongs to the classes or sources of a library added to dependencies of the project,
128    *         false otherwise
129    */
130   boolean isInLibrary(@NotNull VirtualFile fileOrDir);
131
132   /**
133    * Returns true if <code>fileOrDir</code> is a file or directory from sources of some library which is included into dependencies
134    * of some module.
135    */
136   boolean isInLibrarySource(@NotNull VirtualFile fileOrDir);
137
138   /**
139    * @deprecated name of this method may be confusing. If you want to check if the file is excluded or ignored use {@link #isExcluded(VirtualFile)}.
140    * If you want to check if the file is ignored use {@link FileTypeRegistry#isFileIgnored(VirtualFile)}.
141    * If you want to check if the file or one of its parents is ignored use {@link #isUnderIgnored(VirtualFile)}.
142    */
143   @Deprecated
144   boolean isIgnored(@NotNull VirtualFile file);
145
146   /**
147    * Checks if the specified file or directory is located under project roots but the file itself or one of its parent directories is
148    * either excluded from the project or ignored by {@link FileTypeRegistry#isFileIgnored(VirtualFile)}).
149    *
150    * @return true if <code>file</code> is excluded or ignored, false otherwise.
151    */
152   boolean isExcluded(@NotNull VirtualFile file);
153
154   /**
155    * Checks if the specified file or directory is located under project roots but the file itself or one of its parent directories is ignored
156    * by {@link FileTypeRegistry#isFileIgnored(VirtualFile)}).
157    *
158    * @return true if <code>file</code> is ignored, false otherwise.
159    */
160   boolean isUnderIgnored(@NotNull VirtualFile file);
161 }