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