add ProjectFileIndex#getSourceFolder to simplify clients (IDEA-CR-57371)
[idea/community.git] / platform / projectModel-impl / src / com / intellij / ide / projectView / impl / ProjectRootsUtil.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.ide.projectView.impl;
3
4 import com.intellij.openapi.module.Module;
5 import com.intellij.openapi.project.Project;
6 import com.intellij.openapi.roots.*;
7 import com.intellij.openapi.roots.impl.DirectoryIndex;
8 import com.intellij.openapi.roots.impl.DirectoryInfo;
9 import com.intellij.openapi.vfs.VirtualFile;
10 import com.intellij.psi.PsiCodeFragment;
11 import com.intellij.psi.PsiDirectory;
12 import com.intellij.psi.PsiFile;
13 import org.jetbrains.annotations.NotNull;
14 import org.jetbrains.annotations.Nullable;
15
16 /**
17  * @author anna
18  */
19 public class ProjectRootsUtil {
20   private ProjectRootsUtil() { }
21
22   public static boolean isSourceRoot(@NotNull PsiDirectory psiDirectory) {
23     return isSourceRoot(psiDirectory.getVirtualFile(), psiDirectory.getProject());
24   }
25
26   public static boolean isSourceRoot(@NotNull VirtualFile directoryFile, @NotNull Project project) {
27     final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex();
28     return directoryFile.equals(fileIndex.getSourceRootForFile(directoryFile));
29   }
30
31   public static boolean isInSource(@NotNull PsiDirectory directory) {
32     return isInSource(directory.getVirtualFile(), directory.getProject());
33   }
34
35   public static boolean isInSource(@NotNull VirtualFile directoryFile, @NotNull Project project) {
36     final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
37     return projectFileIndex.isInSourceContent(directoryFile);
38   }
39
40   public static boolean isInTestSource(@NotNull PsiFile file) {
41     VirtualFile vFile = file.getVirtualFile();
42     return vFile != null && isInTestSource(vFile, file.getProject());
43   }
44
45   public static boolean isInTestSource(@NotNull VirtualFile directoryFile, @NotNull Project project) {
46     final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
47     return projectFileIndex.isInTestSourceContent(directoryFile);
48   }
49
50   public static boolean isModuleSourceRoot(@NotNull VirtualFile virtualFile, @NotNull final Project project) {
51     return getModuleSourceRoot(virtualFile, project) != null;
52   }
53
54   @Nullable
55   public static SourceFolder getModuleSourceRoot(@NotNull VirtualFile root, @NotNull Project project) {
56     final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
57     final Module module = projectFileIndex.getModuleForFile(root);
58     return module != null && !module.isDisposed() ? findSourceFolder(module, root) : null;
59   }
60
61   public static boolean isLibraryRoot(@NotNull VirtualFile directoryFile, @NotNull Project project) {
62     final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
63     if (projectFileIndex.isInLibraryClasses(directoryFile)) {
64       final VirtualFile parent = directoryFile.getParent();
65       return parent == null || !projectFileIndex.isInLibraryClasses(parent);
66     }
67     return false;
68   }
69
70   public static boolean isModuleContentRoot(@NotNull PsiDirectory directory) {
71     return isModuleContentRoot(directory.getVirtualFile(), directory.getProject());
72   }
73
74   public static boolean isModuleContentRoot(@NotNull final VirtualFile directoryFile, @NotNull Project project) {
75     final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
76     final VirtualFile contentRootForFile = projectFileIndex.getContentRootForFile(directoryFile);
77     return directoryFile.equals(contentRootForFile);
78   }
79
80   public static String findUnloadedModuleByContentRoot(@NotNull final VirtualFile root, @NotNull Project project) {
81     if (project.isDefault()) return null;
82     final DirectoryInfo info = DirectoryIndex.getInstance(project).getInfoForFile(root);
83     if (info.isExcluded(root) && root.equals(info.getContentRoot()) && info.getUnloadedModuleName() != null) {
84       return info.getUnloadedModuleName();
85     }
86     return null;
87   }
88
89   public static String findUnloadedModuleByFile(@NotNull final VirtualFile file, @NotNull Project project) {
90     if (project.isDefault()) return null;
91     DirectoryInfo info = DirectoryIndex.getInstance(project).getInfoForFile(file);
92     VirtualFile contentRoot = info.getContentRoot();
93     if (info.isExcluded(file) && contentRoot != null) {
94       DirectoryInfo rootInfo = DirectoryIndex.getInstance(project).getInfoForFile(contentRoot);
95       return rootInfo.getUnloadedModuleName();
96     }
97     return null;
98   }
99
100   public static boolean isProjectHome(@NotNull PsiDirectory psiDirectory) {
101     return psiDirectory.getVirtualFile().equals(psiDirectory.getProject().getBaseDir());
102   }
103
104   public static boolean isOutsideSourceRoot(@NotNull PsiFile psiFile) {
105     if (psiFile instanceof PsiCodeFragment) return false;
106     final VirtualFile file = psiFile.getVirtualFile();
107     if (file == null) return false;
108     final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(psiFile.getProject()).getFileIndex();
109     return !projectFileIndex.isInSource(file) && !projectFileIndex.isInLibraryClasses(file);
110   }
111
112   @Nullable
113   public static SourceFolder findSourceFolder(@NotNull Module module, @NotNull VirtualFile root) {
114     ProjectFileIndex index = ProjectFileIndex.getInstance(module.getProject());
115     SourceFolder folder = index.getModuleForFile(root) == module ? index.getSourceFolder(root) : null;
116     return folder != null && root.equals(folder.getFile()) ? folder : null;
117   }
118
119   @Nullable
120   public static ExcludeFolder findExcludeFolder(@NotNull Module module, @NotNull VirtualFile root) {
121     for (ContentEntry entry : ModuleRootManager.getInstance(module).getContentEntries()) {
122       for (ExcludeFolder folder : entry.getExcludeFolders()) {
123         if (root.equals(folder.getFile())) {
124           return folder;
125         }
126       }
127     }
128     return null;
129   }
130 }