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