fix "IDEA-221944 Deadlock on opening second project" and support preloading for proje...
[idea/community.git] / java / java-impl / src / com / intellij / psi / NonClasspathResolveScopeEnlarger.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.psi;
3
4 import com.intellij.ide.highlighter.JavaFileType;
5 import com.intellij.openapi.project.Project;
6 import com.intellij.openapi.roots.ProjectFileIndex;
7 import com.intellij.openapi.vfs.VfsUtilCore;
8 import com.intellij.openapi.vfs.VirtualFile;
9 import com.intellij.psi.search.NonClasspathDirectoriesScope;
10 import com.intellij.psi.search.SearchScope;
11 import org.jetbrains.annotations.NotNull;
12
13 import java.util.List;
14
15 /**
16  * @author peter
17  */
18 public class NonClasspathResolveScopeEnlarger extends ResolveScopeEnlarger {
19   @Override
20   public SearchScope getAdditionalResolveScope(@NotNull VirtualFile file, Project project) {
21     if (project.isDefault()) {
22       return null;
23     }
24
25     ProjectFileIndex index = ProjectFileIndex.getInstance(project);
26     if (index.isInLibraryClasses(file) || index.isInContent(file)) {
27       return null;
28     }
29
30     String fileExtension = file.getExtension();
31     if ("class".equals(fileExtension) || JavaFileType.DEFAULT_EXTENSION.equals(fileExtension)) {
32       for (PsiElementFinder finder : PsiElementFinder.EP.getExtensions(project)) {
33         if (finder instanceof NonClasspathClassFinder) {
34           final List<VirtualFile> roots = ((NonClasspathClassFinder)finder).getClassRoots();
35           for (VirtualFile root : roots) {
36             if (VfsUtilCore.isAncestor(root, file, true)) {
37               return NonClasspathDirectoriesScope.compose(roots);
38             }
39           }
40         }
41       }
42     }
43     return null;
44   }
45 }