fix "IDEA-221944 Deadlock on opening second project" and support preloading for proje...
[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.vfs.VirtualFile;
14 import org.jetbrains.annotations.NotNull;
15 import org.jetbrains.annotations.Nullable;
16
17 import java.util.Collection;
18
19 /**
20  * @author yole
21  */
22 public final class ProjectFileIndexFacade extends FileIndexFacade {
23   private final DirectoryIndex myDirectoryIndex;
24   private final ProjectFileIndex myFileIndex;
25
26   ProjectFileIndexFacade(@NotNull Project project) {
27     super(project);
28
29     myFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
30     myDirectoryIndex = DirectoryIndex.getInstance(project);
31   }
32
33   @Override
34   public boolean isInContent(@NotNull final VirtualFile file) {
35     return myFileIndex.isInContent(file);
36   }
37
38   @Override
39   public boolean isInSource(@NotNull VirtualFile file) {
40     return myFileIndex.isInSource(file);
41   }
42
43   @Override
44   public boolean isInSourceContent(@NotNull VirtualFile file) {
45     return myFileIndex.isInSourceContent(file);
46   }
47
48   @Override
49   public boolean isInLibraryClasses(@NotNull VirtualFile file) {
50     return myFileIndex.isInLibraryClasses(file);
51   }
52
53   @Override
54   public boolean isInLibrarySource(@NotNull VirtualFile file) {
55     return myFileIndex.isInLibrarySource(file);
56   }
57
58   @Override
59   public boolean isExcludedFile(@NotNull final VirtualFile file) {
60     return myFileIndex.isExcluded(file);
61   }
62
63   @Override
64   public boolean isUnderIgnored(@NotNull VirtualFile file) {
65     return myFileIndex.isUnderIgnored(file);
66   }
67
68   @Nullable
69   @Override
70   public Module getModuleForFile(@NotNull VirtualFile file) {
71     return myFileIndex.getModuleForFile(file);
72   }
73
74   @Override
75   public boolean isValidAncestor(@NotNull final VirtualFile baseDir, @NotNull VirtualFile childDir) {
76     if (!childDir.isDirectory()) {
77       childDir = childDir.getParent();
78     }
79     while (true) {
80       if (childDir == null) return false;
81       if (childDir.equals(baseDir)) return true;
82       if (!myDirectoryIndex.getInfoForFile(childDir).isInProject(childDir)) return false;
83       childDir = childDir.getParent();
84     }
85   }
86
87   @NotNull
88   @Override
89   public ModificationTracker getRootModificationTracker() {
90     return ProjectRootManager.getInstance(myProject);
91   }
92
93   @NotNull
94   @Override
95   public Collection<UnloadedModuleDescription> getUnloadedModuleDescriptions() {
96     return ModuleManager.getInstance(myProject).getUnloadedModuleDescriptions();
97   }
98
99   @Override
100   public boolean isInProjectScope(@NotNull VirtualFile file) {
101     // optimization: equivalent to the super method but has fewer getInfoForFile() calls
102     if (file instanceof VirtualFileWindow) return true;
103     DirectoryInfo info = myDirectoryIndex.getInfoForFile(file);
104     if (!info.isInProject(file)) return false;
105     if (info.hasLibraryClassRoot() && !info.isInModuleSource(file)) return false;
106     return info.getModule() != null;
107   }
108 }