2450358eb1bd772f708d75db111038cb9c1ba602
[idea/community.git] / platform / projectModel-impl / src / com / intellij / openapi / roots / impl / ProjectFileIndexFacade.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.impl;
3
4 import com.intellij.injected.editor.VirtualFileWindow;
5 import com.intellij.openapi.module.Module;
6 import com.intellij.openapi.module.ModuleManager;
7 import com.intellij.openapi.module.UnloadedModuleDescription;
8 import com.intellij.openapi.project.Project;
9 import com.intellij.openapi.roots.FileIndexFacade;
10 import com.intellij.openapi.roots.ProjectFileIndex;
11 import com.intellij.openapi.roots.ProjectRootManager;
12 import com.intellij.openapi.util.ModificationTracker;
13 import com.intellij.openapi.util.NotNullLazyValue;
14 import com.intellij.openapi.vfs.VirtualFile;
15 import org.jetbrains.annotations.NotNull;
16 import org.jetbrains.annotations.Nullable;
17
18 import java.util.Collection;
19
20 /**
21  * @author yole
22  */
23 public final class ProjectFileIndexFacade extends FileIndexFacade {
24   // PsiManagerImpl is created for default project, but DirectoryIndex must be not created for default project.
25   private final NotNullLazyValue<DirectoryIndex> myDirectoryIndex = NotNullLazyValue.createValue(() -> DirectoryIndex.getInstance(myProject));
26   private final ProjectFileIndex myFileIndex;
27
28   ProjectFileIndexFacade(@NotNull Project project) {
29     super(project);
30
31     myFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
32   }
33
34   @Override
35   public boolean isInContent(@NotNull final VirtualFile file) {
36     return myFileIndex.isInContent(file);
37   }
38
39   @Override
40   public boolean isInSource(@NotNull VirtualFile file) {
41     return myFileIndex.isInSource(file);
42   }
43
44   @Override
45   public boolean isInSourceContent(@NotNull VirtualFile file) {
46     return myFileIndex.isInSourceContent(file);
47   }
48
49   @Override
50   public boolean isInLibraryClasses(@NotNull VirtualFile file) {
51     return myFileIndex.isInLibraryClasses(file);
52   }
53
54   @Override
55   public boolean isInLibrarySource(@NotNull VirtualFile file) {
56     return myFileIndex.isInLibrarySource(file);
57   }
58
59   @Override
60   public boolean isExcludedFile(@NotNull final VirtualFile file) {
61     return myFileIndex.isExcluded(file);
62   }
63
64   @Override
65   public boolean isUnderIgnored(@NotNull VirtualFile file) {
66     return myFileIndex.isUnderIgnored(file);
67   }
68
69   @Nullable
70   @Override
71   public Module getModuleForFile(@NotNull VirtualFile file) {
72     return myFileIndex.getModuleForFile(file);
73   }
74
75   @Override
76   public boolean isValidAncestor(@NotNull final VirtualFile baseDir, @NotNull VirtualFile childDir) {
77     if (!childDir.isDirectory()) {
78       childDir = childDir.getParent();
79     }
80     while (true) {
81       if (childDir == null) return false;
82       if (childDir.equals(baseDir)) return true;
83       if (!myDirectoryIndex.getValue().getInfoForFile(childDir).isInProject(childDir)) return false;
84       childDir = childDir.getParent();
85     }
86   }
87
88   @NotNull
89   @Override
90   public ModificationTracker getRootModificationTracker() {
91     return ProjectRootManager.getInstance(myProject);
92   }
93
94   @NotNull
95   @Override
96   public Collection<UnloadedModuleDescription> getUnloadedModuleDescriptions() {
97     return ModuleManager.getInstance(myProject).getUnloadedModuleDescriptions();
98   }
99
100   @Override
101   public boolean isInProjectScope(@NotNull VirtualFile file) {
102     // optimization: equivalent to the super method but has fewer getInfoForFile() calls
103     if (file instanceof VirtualFileWindow) return true;
104     DirectoryInfo info = myDirectoryIndex.getValue().getInfoForFile(file);
105     if (!info.isInProject(file)) return false;
106     if (info.hasLibraryClassRoot() && !info.isInModuleSource(file)) return false;
107     return info.getModule() != null;
108   }
109 }