From 16269c5b8838b6b8d75677fd2b4e83d88610e466 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 29 Oct 2015 15:27:28 +0100 Subject: [PATCH] analysisScope: filter (IDEA-CR-6054) --- .../com/intellij/analysis/AnalysisScope.java | 30 ++++++++++++------- .../actions/FileFilterPanel.java | 3 +- .../actions/RunInspectionAction.java | 8 ++--- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/platform/analysis-api/src/com/intellij/analysis/AnalysisScope.java b/platform/analysis-api/src/com/intellij/analysis/AnalysisScope.java index 209a44c6be72..18b2ee06762d 100644 --- a/platform/analysis-api/src/com/intellij/analysis/AnalysisScope.java +++ b/platform/analysis-api/src/com/intellij/analysis/AnalysisScope.java @@ -70,7 +70,6 @@ public class AnalysisScope { public static final int CUSTOM = 8; public static final int VIRTUAL_FILES = 9; public static final int UNCOMMITTED_FILES = 10; - @MagicConstant(intValues = {PROJECT, DIRECTORY, FILE, MODULE, INVALID, MODULES, CUSTOM, VIRTUAL_FILES, UNCOMMITTED_FILES}) public @interface Type { } @@ -81,6 +80,7 @@ public class AnalysisScope { protected PsiElement myElement; private SearchScope myScope; private boolean mySearchInLibraries; + private GlobalSearchScope myFilter; @Type protected int myType; private final Set myVFiles; // initial files and directories the scope is configured on @@ -185,10 +185,8 @@ public class AnalysisScope { if (mySearchInLibraries || !(file instanceof PsiCompiledElement)) { final VirtualFile virtualFile = file.getVirtualFile(); if (virtualFile == null) return; - if (!myIncludeTestSource) { - if (fileIndex.isInTestSourceContent(virtualFile)) { - return; - } + if (isFiltered(virtualFile, fileIndex)) { + return; } if (!shouldHighlightFile(file)) return; myFilesSet.add(virtualFile); @@ -197,6 +195,13 @@ public class AnalysisScope { }; } + private boolean isFiltered(VirtualFile virtualFile, FileIndex fileIndex) { + if (myFilter != null && !myFilter.contains(virtualFile)) { + return true; + } + return !myIncludeTestSource && fileIndex.isInTestSourceContent(virtualFile); + } + @NotNull private FileIndex getFileIndex() { final FileIndex fileIndex; @@ -227,7 +232,7 @@ public class AnalysisScope { } if (myType == PROJECT) { //optimization final ProjectFileIndex index = ProjectRootManager.getInstance(myProject).getFileIndex(); - return index.isInContent(file) && (myIncludeTestSource || !index.isInTestSourceContent(file)); + return index.isInContent(file) && !isFiltered(file, index); } initFilesSet(); } @@ -282,7 +287,7 @@ public class AnalysisScope { public boolean process(VirtualFile file) { if (file.isDirectory()) return true; if (ProjectCoreUtil.isProjectOrWorkspaceFile(file)) return true; - if (fileIndex.isInContent(file) && (myIncludeTestSource || !fileIndex.isInTestSourceContent(file)) + if (fileIndex.isInContent(file) && !isFiltered(file, fileIndex) && !GeneratedSourcesFilter.isGeneratedSourceByAnyFilter(file, myProject)) { return processFile(file, visitor, psiManager, needReadAction, clearResolveCache); } @@ -296,7 +301,7 @@ public class AnalysisScope { if (myFilesSet == null) initFilesSet(); final FileIndex index = ProjectRootManager.getInstance(myProject).getFileIndex(); for (final VirtualFile file : myFilesSet) { - if (!myIncludeTestSource && index.isInTestSourceContent(file)) continue; + if (isFiltered(file, index)) continue; if (!processor.process(file)) return false; } return true; @@ -309,7 +314,7 @@ public class AnalysisScope { final boolean isInScope = ApplicationManager.getApplication().runReadAction(new Computable() { @Override public Boolean compute() { - if (!myIncludeTestSource && projectFileIndex.isInTestSourceContent(fileOrDir)) return false; + if (isFiltered(fileOrDir, projectFileIndex)) return false; if (GeneratedSourcesFilter.isGeneratedSourceByAnyFilter(fileOrDir, myProject)) return false; return ((GlobalSearchScope)myScope).contains(fileOrDir); } @@ -456,7 +461,7 @@ public class AnalysisScope { @Override @SuppressWarnings({"SimplifiableIfStatement"}) public boolean processFile(@NotNull final VirtualFile fileOrDir) { - if (!myIncludeTestSource && index.isInTestSourceContent(fileOrDir)) return true; + if (isFiltered(fileOrDir, index)) return true; if (!processGeneratedFiles && GeneratedSourcesFilter.isGeneratedSourceByAnyFilter(fileOrDir, project)) return true; if (!fileOrDir.isDirectory()) { return processor.process(fileOrDir); @@ -731,7 +736,6 @@ public class AnalysisScope { return new GlobalSearchScope() { @Override public boolean contains(@NotNull VirtualFile file) { - if (myFilesSet == null) initFilesSet(); return myFilesSet.contains(file); } @@ -783,4 +787,8 @@ public class AnalysisScope { public boolean isIncludeTestSource() { return myIncludeTestSource; } + + public void setFilter(GlobalSearchScope filter) { + myFilter = filter; + } } diff --git a/platform/lang-impl/src/com/intellij/codeInspection/actions/FileFilterPanel.java b/platform/lang-impl/src/com/intellij/codeInspection/actions/FileFilterPanel.java index 96fd1b03b9a7..47ab269f6836 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/actions/FileFilterPanel.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/actions/FileFilterPanel.java @@ -20,7 +20,6 @@ import com.intellij.find.impl.FindInProjectUtil; import com.intellij.openapi.module.Module; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.SearchScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -41,7 +40,7 @@ class FileFilterPanel { } @Nullable - SearchScope getSearchScope() { + GlobalSearchScope getSearchScope() { if (!myUseFileMask.isSelected()) return null; String text = (String)myFileMask.getSelectedItem(); if (text == null) return null; diff --git a/platform/lang-impl/src/com/intellij/codeInspection/actions/RunInspectionAction.java b/platform/lang-impl/src/com/intellij/codeInspection/actions/RunInspectionAction.java index afc1284415ba..336639250bb6 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/actions/RunInspectionAction.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/actions/RunInspectionAction.java @@ -39,7 +39,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.profile.codeInspection.InspectionProjectProfileManager; import com.intellij.psi.*; -import com.intellij.psi.search.SearchScope; +import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -137,12 +137,12 @@ public class RunInspectionAction extends GotoActionBase { @NotNull Project project, Module module) { final AnalysisScope scope = super.getScope(uiOptions, defaultScope, project, module); - final SearchScope filterScope = fileFilterPanel.getSearchScope(); + final GlobalSearchScope filterScope = fileFilterPanel.getSearchScope(); if (filterScope == null) { return scope; } - final SearchScope filteredScope = filterScope.intersectWith(scope.toSearchScope()); - return new AnalysisScope(filteredScope, project); + scope.setFilter(filterScope); + return scope; } };