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