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