Prevent PyUnresolvedReferenceInspection from scanning all __init__ files when generating quickfix

fixes according to review
This commit is contained in:
Kiryl Chetyrbak
2017-07-05 22:45:02 +03:00
committed by Andrey Vlasovskikh
parent 8e7fb07fb7
commit 49dcf80e43
@@ -23,11 +23,14 @@ import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.QualifiedName;
import com.intellij.util.Processor;
import com.intellij.util.indexing.FileBasedIndex;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.PyCodeInsightSettings;
import com.jetbrains.python.codeInsight.controlflow.ControlFlowCache;
@@ -234,20 +237,28 @@ public final class PythonImportUtils {
private static Collection<PsiElement> findImportableModules(PsiFile targetFile, String reftext, Project project, GlobalSearchScope scope) {
List<PsiElement> result = new ArrayList<>();
PsiFile[] files = FilenameIndex.getFilesByName(project, reftext + ".py", scope);
for (PsiFile file : files) {
if (isImportableModule(targetFile, file)) {
result.add(file);
//add packages
FilenameIndex.processFilesByName(reftext, true, file -> {
ProgressManager.checkCanceled();
if (!file.isDirectory() ){
return true;
}
}
// perhaps the module is a directory, not a file
PsiFile[] initFiles = FilenameIndex.getFilesByName(project, PyNames.INIT_DOT_PY, scope);
for (PsiFile initFile : initFiles) {
PsiDirectory parent = initFile.getParent();
if (parent != null && parent.getName().equals(reftext)) {
result.add(parent);
PsiDirectory candidatePackageDir = (PsiDirectory) file;
if (candidatePackageDir.findFile(PyNames.INIT_DOT_PY) == null){
return true;
}
}
result.add(candidatePackageDir);
return true;
}, scope, project, null);
//Add modules
FilenameIndex.processFilesByName(reftext + ".py", false, true, item -> {
ProgressManager.checkCanceled();
if (isImportableModule(targetFile, item)){
result.add(item);
}
return true;
}, scope, project, null);
return result;
}