correct inspection global progress

This commit is contained in:
Alexey Kudravtsev
2011-04-28 11:15:41 +04:00
parent 407e6bd944
commit 62e53bdc98
14 changed files with 72 additions and 84 deletions
@@ -16,6 +16,7 @@
package com.intellij.codeInspection.deadCode;
import com.intellij.analysis.AnalysisScope;
import com.intellij.codeInspection.GlobalInspectionContext;
import com.intellij.codeInspection.InspectionManager;
import com.intellij.codeInspection.InspectionsBundle;
import com.intellij.codeInspection.ex.*;
@@ -49,7 +50,7 @@ public class DummyEntryPointsTool extends FilteringInspectionTool {
public void exportResults(@NotNull Element parentNode) {}
@NotNull
public JobDescriptor[] getJobDescriptors() {
public JobDescriptor[] getJobDescriptors(GlobalInspectionContext globalInspectionContext) {
return new JobDescriptor[0];
}
@@ -687,8 +687,9 @@ public class UnusedDeclarationInspection extends FilteringInspectionTool {
}
@NotNull
public JobDescriptor[] getJobDescriptors() {
return new JobDescriptor[]{GlobalInspectionContextImpl.BUILD_GRAPH, GlobalInspectionContextImpl.FIND_EXTERNAL_USAGES};
@Override
public JobDescriptor[] getJobDescriptors(GlobalInspectionContext context) {
return new JobDescriptor[]{((GlobalInspectionContextImpl)context).BUILD_GRAPH, ((GlobalInspectionContextImpl)context).FIND_EXTERNAL_USAGES};
}
private static void commentOutDead(PsiElement psiElement) {
@@ -206,7 +206,7 @@ public class GlobalJavaInspectionContextImpl extends GlobalJavaInspectionContext
for (SmartPsiElementPointer sortedID : sortedIDs) {
final PsiClass psiClass = (PsiClass)dereferenceInReadAction(sortedID);
if (psiClass == null) continue;
context.incrementJobDoneAmount(GlobalInspectionContextImpl.FIND_EXTERNAL_USAGES, ApplicationManager.getApplication().runReadAction(
context.incrementJobDoneAmount(((GlobalInspectionContextImpl)context).FIND_EXTERNAL_USAGES, ApplicationManager.getApplication().runReadAction(
new Computable<String>() {
public String compute() {
return psiClass.getQualifiedName();
@@ -230,8 +230,7 @@ public class GlobalJavaInspectionContextImpl extends GlobalJavaInspectionContext
if (psiMethod == null) continue;
final RefMethod refMethod = (RefMethod)refManager.getReference(psiMethod);
context
.incrementJobDoneAmount(GlobalInspectionContextImpl.FIND_EXTERNAL_USAGES, refManager.getQualifiedName(refMethod));
context.incrementJobDoneAmount(((GlobalInspectionContextImpl)context).FIND_EXTERNAL_USAGES, refManager.getQualifiedName(refMethod));
final List<DerivedMethodsProcessor> processors = myDerivedMethodsRequests.get(sortedID);
LOG.assertTrue(processors != null, psiMethod.getClass().getName());
@@ -250,9 +249,7 @@ public class GlobalJavaInspectionContextImpl extends GlobalJavaInspectionContext
final List<UsagesProcessor> processors = myFieldUsagesRequests.get(sortedID);
LOG.assertTrue(processors != null, psiField.getClass().getName());
context
.incrementJobDoneAmount(GlobalInspectionContextImpl.FIND_EXTERNAL_USAGES,
refManager.getQualifiedName(refManager.getReference(psiField)));
context.incrementJobDoneAmount(((GlobalInspectionContextImpl)context).FIND_EXTERNAL_USAGES, refManager.getQualifiedName(refManager.getReference(psiField)));
ReferencesSearch.search(psiField, searchScope, false)
.forEach(new PsiReferenceProcessorAdapter(createReferenceProcessor(processors, context)));
@@ -269,7 +266,7 @@ public class GlobalJavaInspectionContextImpl extends GlobalJavaInspectionContext
final List<UsagesProcessor> processors = myClassUsagesRequests.get(sortedID);
LOG.assertTrue(processors != null, psiClass.getClass().getName());
context.incrementJobDoneAmount(GlobalInspectionContextImpl.FIND_EXTERNAL_USAGES, ApplicationManager.getApplication().runReadAction(
context.incrementJobDoneAmount(((GlobalInspectionContextImpl)context).FIND_EXTERNAL_USAGES, ApplicationManager.getApplication().runReadAction(
new Computable<String>() {
public String compute() {
return psiClass.getQualifiedName();
@@ -292,9 +289,7 @@ public class GlobalJavaInspectionContextImpl extends GlobalJavaInspectionContext
final List<UsagesProcessor> processors = myMethodUsagesRequests.get(sortedID);
LOG.assertTrue(processors != null, psiMethod.getClass().getName());
context
.incrementJobDoneAmount(GlobalInspectionContextImpl.FIND_EXTERNAL_USAGES,
refManager.getQualifiedName(refManager.getReference(psiMethod)));
context.incrementJobDoneAmount(((GlobalInspectionContextImpl)context).FIND_EXTERNAL_USAGES, refManager.getQualifiedName(refManager.getReference(psiMethod)));
MethodReferencesSearch.search(psiMethod, searchScope, true)
.forEach(new PsiReferenceProcessorAdapter(createReferenceProcessor(processors, context)));
@@ -414,7 +409,8 @@ public class GlobalJavaInspectionContextImpl extends GlobalJavaInspectionContext
public void performPostRunActivities(List<InspectionProfileEntry> needRepeatSearchRequest, final GlobalInspectionContext context) {
GlobalInspectionContextImpl.FIND_EXTERNAL_USAGES.setTotalAmount(getRequestCount() * 2);
JobDescriptor progress = ((GlobalInspectionContextImpl)context).FIND_EXTERNAL_USAGES;
progress.setTotalAmount(getRequestCount());
do {
processSearchRequests(context);
@@ -425,11 +421,11 @@ public class GlobalJavaInspectionContextImpl extends GlobalJavaInspectionContext
needRepeatSearchRequest.remove(requestor);
}
}
int oldSearchRequestCount = GlobalInspectionContextImpl.FIND_EXTERNAL_USAGES.getTotalAmount();
float proportion = GlobalInspectionContextImpl.FIND_EXTERNAL_USAGES.getProgress();
int totalAmount = oldSearchRequestCount + getRequestCount() * 2;
GlobalInspectionContextImpl.FIND_EXTERNAL_USAGES.setTotalAmount(totalAmount);
GlobalInspectionContextImpl.FIND_EXTERNAL_USAGES.setDoneAmount((int)(totalAmount * proportion));
int oldSearchRequestCount = progress.getTotalAmount();
int oldDoneAmount = progress.getDoneAmount();
int totalAmount = oldSearchRequestCount + getRequestCount();
progress.setTotalAmount(totalAmount);
progress.setDoneAmount(oldDoneAmount);
}
while (!needRepeatSearchRequest.isEmpty());
}
@@ -23,6 +23,7 @@ package com.intellij.codeInspection.inconsistentLanguageLevel;
import com.intellij.analysis.AnalysisScope;
import com.intellij.codeInsight.daemon.GroupNames;
import com.intellij.codeInspection.CommonProblemDescriptor;
import com.intellij.codeInspection.GlobalInspectionContext;
import com.intellij.codeInspection.InspectionManager;
import com.intellij.codeInspection.QuickFix;
import com.intellij.codeInspection.ex.DescriptorProviderInspection;
@@ -90,7 +91,7 @@ public class InconsistentLanguageLevelInspection extends DescriptorProviderInspe
}
@NotNull
public JobDescriptor[] getJobDescriptors() {
public JobDescriptor[] getJobDescriptors(GlobalInspectionContext globalInspectionContext) {
return JobDescriptor.EMPTY_ARRAY;
}
@@ -22,10 +22,7 @@ package com.intellij.codeInspection.unusedLibraries;
import com.intellij.analysis.AnalysisScope;
import com.intellij.codeInsight.daemon.GroupNames;
import com.intellij.codeInspection.CommonProblemDescriptor;
import com.intellij.codeInspection.InspectionManager;
import com.intellij.codeInspection.InspectionsBundle;
import com.intellij.codeInspection.QuickFix;
import com.intellij.codeInspection.*;
import com.intellij.codeInspection.ex.DescriptorProviderInspection;
import com.intellij.codeInspection.ex.JobDescriptor;
import com.intellij.codeInspection.reference.RefManager;
@@ -64,7 +61,7 @@ import java.util.*;
public class UnusedLibrariesInspection extends DescriptorProviderInspection {
private static final Logger LOG = Logger.getInstance("#" + UnusedLibrariesInspection.class.getName());
private static final JobDescriptor BACKWARD_ANALYSIS = new JobDescriptor(InspectionsBundle.message("unused.library.backward.analysis.job.description"));
private final JobDescriptor BACKWARD_ANALYSIS = new JobDescriptor(InspectionsBundle.message("unused.library.backward.analysis.job.description"));
public void runInspection(@NotNull final AnalysisScope scope, @NotNull final InspectionManager manager) {
final Project project = getContext().getProject();
@@ -118,14 +115,18 @@ public class UnusedLibrariesInspection extends DescriptorProviderInspection {
}, new ProgressIndicatorBase() {
public void setFraction(final double fraction) {
super.setFraction(fraction);
BACKWARD_ANALYSIS.setDoneAmount((int)fraction * BACKWARD_ANALYSIS.getTotalAmount());
getContext().incrementJobDoneAmount(BACKWARD_ANALYSIS, getText2());
int nextAmount = (int)(fraction * BACKWARD_ANALYSIS.getTotalAmount());
if (nextAmount > BACKWARD_ANALYSIS.getDoneAmount() && nextAmount < BACKWARD_ANALYSIS.getTotalAmount()) {
BACKWARD_ANALYSIS.setDoneAmount(nextAmount);
getContext().incrementJobDoneAmount(BACKWARD_ANALYSIS, getText2());
}
}
public boolean isCanceled() {
return progressIndicator != null && progressIndicator.isCanceled() || super.isCanceled();
}
});
BACKWARD_ANALYSIS.setDoneAmount(BACKWARD_ANALYSIS.getTotalAmount());
final Map<PsiFile, Set<PsiFile>> dependencies = builder.getDependencies();
for (PsiFile file : dependencies.keySet()) {
final VirtualFile virtualFile = file.getVirtualFile();
@@ -175,7 +176,7 @@ public class UnusedLibrariesInspection extends DescriptorProviderInspection {
}
@NotNull
public JobDescriptor[] getJobDescriptors() {
public JobDescriptor[] getJobDescriptors(GlobalInspectionContext globalInspectionContext) {
return new JobDescriptor[] {BACKWARD_ANALYSIS};
}
@@ -39,6 +39,7 @@ public class JobDescriptor {
public void setTotalAmount(int totalAmount) {
myTotalAmount = totalAmount;
myDoneAmount = 0;
}
public int getDoneAmount() {
@@ -46,16 +47,23 @@ public class JobDescriptor {
}
public void setDoneAmount(int doneAmount) {
if (doneAmount > getTotalAmount()) {
int i = 0;
}
if (doneAmount < getDoneAmount()) {
int i = 0;
}
myDoneAmount = doneAmount;
}
public float getProgress() {
float localProgress = getDoneAmount();
if (getTotalAmount() != 0) {
localProgress /= getTotalAmount();
} else {
float localProgress;
if (getTotalAmount() == 0) {
localProgress = 0;
}
else {
localProgress = 1.0f * getDoneAmount() / getTotalAmount();
}
return localProgress;
}
@@ -19,12 +19,10 @@ package com.intellij.codeInspection;
import com.intellij.codeHighlighting.HighlightDisplayLevel;
import com.intellij.codeInsight.daemon.impl.*;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightInfoHolder;
import com.intellij.codeInspection.ex.JobDescriptor;
import com.intellij.lang.annotation.HighlightSeverity;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectUtil;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDocumentManager;
@@ -36,7 +34,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public abstract class DefaultHighlightVisitorBasedInspection extends GlobalSimpleInspectionTool {
private static final JobDescriptor ANNOTATOR = new JobDescriptor(InspectionsBundle.message("inspection.processing.job.descriptor2"));
private final boolean highlightErrorElements;
private final boolean runAnnotators;
@@ -81,11 +78,6 @@ public abstract class DefaultHighlightVisitorBasedInspection extends GlobalSimpl
}
}
@Override
public JobDescriptor[] getAdditionalJobs() {
return new JobDescriptor[]{ANNOTATOR};
}
@NotNull
@Override
public HighlightDisplayLevel getDefaultLevel() {
@@ -134,7 +126,6 @@ public abstract class DefaultHighlightVisitorBasedInspection extends GlobalSimpl
if (virtualFile == null) {
return;
}
myGlobalContext.incrementJobDoneAmount(ANNOTATOR, ProjectUtil.calcRelativeToProjectPath(virtualFile, file.getProject()));
final Project project = file.getProject();
Document document = PsiDocumentManager.getInstance(project).getDocument(file);
@@ -88,14 +88,11 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G
private ProgressIndicator myProgressIndicator;
public static final JobDescriptor BUILD_GRAPH = new JobDescriptor(InspectionsBundle.message("inspection.processing.job.descriptor"));
public static final JobDescriptor[] BUILD_GRAPH_ONLY = {BUILD_GRAPH};
public static final JobDescriptor FIND_EXTERNAL_USAGES =
new JobDescriptor(InspectionsBundle.message("inspection.processing.job.descriptor1"));
private static final JobDescriptor LOCAL_ANALYSIS = new JobDescriptor(InspectionsBundle.message("inspection.processing.job.descriptor2"));
public static final JobDescriptor[] LOCAL_ANALYSIS_ARRAY = {LOCAL_ANALYSIS};
public final JobDescriptor BUILD_GRAPH = new JobDescriptor(InspectionsBundle.message("inspection.processing.job.descriptor"));
public final JobDescriptor[] BUILD_GRAPH_ONLY = {BUILD_GRAPH};
public final JobDescriptor FIND_EXTERNAL_USAGES = new JobDescriptor(InspectionsBundle.message("inspection.processing.job.descriptor1"));
private final JobDescriptor LOCAL_ANALYSIS = new JobDescriptor(InspectionsBundle.message("inspection.processing.job.descriptor2"));
public final JobDescriptor[] LOCAL_ANALYSIS_ARRAY = {LOCAL_ANALYSIS};
private InspectionProfile myExternalProfile = null;
@@ -436,6 +433,7 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G
refManager.inspectionReadActionStarted();
BUILD_GRAPH.setTotalAmount(scope.getFileCount());
LOCAL_ANALYSIS.setTotalAmount(scope.getFileCount());
FIND_EXTERNAL_USAGES.setTotalAmount(0);
//to override current progress in order to hide useless messages/%
((ProgressManagerImpl)ProgressManager.getInstance()).executeProcessUnderProgress(new Runnable() {
public void run() {
@@ -514,6 +512,7 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G
GlobalSimpleInspectionTool tool = (GlobalSimpleInspectionTool)toolWrapper.getTool();
tool.inspectionStarted(manager, this, toolWrapper);
}
scope.accept(new PsiElementVisitor() {
@Override
public void visitFile(final PsiFile file) {
@@ -590,7 +589,9 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G
};
public void initializeTools(@NotNull List<Tools> outGlobalTools, @NotNull List<Tools> outLocalTools, @NotNull List<Tools> outGlobalSimpleTools) {
public void initializeTools(@NotNull List<Tools> outGlobalTools,
@NotNull List<Tools> outLocalTools,
@NotNull List<Tools> outGlobalSimpleTools) {
myJobDescriptors = new ArrayList<JobDescriptor>();
final List<ToolsImpl> usedTools = getUsedTools();
for (Tools currentTools : usedTools) {
@@ -627,7 +628,7 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G
else {
outGlobalTools.add(currentTools);
}
JobDescriptor[] jobDescriptors = tool.getJobDescriptors();
JobDescriptor[] jobDescriptors = tool.getJobDescriptors(this);
for (JobDescriptor jobDescriptor : jobDescriptors) {
appendJobDescriptor(jobDescriptor);
}
@@ -637,7 +638,7 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G
return myTools;
}
private void appendJobDescriptor(JobDescriptor job) {
private void appendJobDescriptor(@NotNull JobDescriptor job) {
if (!myJobDescriptors.contains(job)) {
myJobDescriptors.add(job);
job.setDoneAmount(0);
@@ -683,18 +684,23 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G
int old = job.getDoneAmount();
job.setDoneAmount(old + 1);
int jobCount = myJobDescriptors.size();
float totalProgress = 0;
for (JobDescriptor jobDescriptor : myJobDescriptors) {
totalProgress += jobDescriptor.getProgress();
}
totalProgress /= jobCount;
float totalProgress = getTotalProgress();
myProgressIndicator.setFraction(totalProgress);
myProgressIndicator.setText(job.getDisplayName() + " " + message);
}
private float getTotalProgress() {
float totalProgress = 0;
int liveDescriptors = 0;
for (JobDescriptor jobDescriptor : myJobDescriptors) {
totalProgress += jobDescriptor.getProgress();
liveDescriptors += jobDescriptor.getTotalAmount() == 0 ? 0 : 1;
}
return totalProgress / liveDescriptors;
}
public void setExternalProfile(InspectionProfile profile) {
myExternalProfile = profile;
}
@@ -50,13 +50,13 @@ public class GlobalInspectionToolWrapper extends DescriptorProviderInspection {
}
@NotNull
public JobDescriptor[] getJobDescriptors() {
public JobDescriptor[] getJobDescriptors(GlobalInspectionContext context) {
final JobDescriptor[] additionalJobs = myTool.getAdditionalJobs();
if (additionalJobs == null) {
return isGraphNeeded() ? GlobalInspectionContextImpl.BUILD_GRAPH_ONLY : JobDescriptor.EMPTY_ARRAY;
return isGraphNeeded() ? ((GlobalInspectionContextImpl)context).BUILD_GRAPH_ONLY : JobDescriptor.EMPTY_ARRAY;
}
else {
return isGraphNeeded() ? ArrayUtil.append(additionalJobs, GlobalInspectionContextImpl.BUILD_GRAPH) : additionalJobs;
return isGraphNeeded() ? ArrayUtil.append(additionalJobs, ((GlobalInspectionContextImpl)context).BUILD_GRAPH) : additionalJobs;
}
}
@@ -77,7 +77,7 @@ public abstract class InspectionTool extends InspectionProfileEntry {
}
@NotNull
public abstract JobDescriptor[] getJobDescriptors();
public abstract JobDescriptor[] getJobDescriptors(GlobalInspectionContext globalInspectionContext);
public boolean queryExternalUsagesRequests(final InspectionManager manager) {
return false;
@@ -80,8 +80,8 @@ public final class LocalInspectionToolWrapper extends DescriptorProviderInspecti
}
@NotNull
public JobDescriptor[] getJobDescriptors() {
return GlobalInspectionContextImpl.LOCAL_ANALYSIS_ARRAY;
public JobDescriptor[] getJobDescriptors(GlobalInspectionContext context) {
return ((GlobalInspectionContextImpl)context).LOCAL_ANALYSIS_ARRAY;
}
public void addProblemDescriptors(List<ProblemDescriptor> descriptors, final boolean filterSuppressed) {
@@ -364,8 +364,7 @@ public class RefManagerImpl extends RefManager {
public void visitFile(PsiFile file) {
final VirtualFile virtualFile = file.getVirtualFile();
if (virtualFile != null) {
myContext
.incrementJobDoneAmount(GlobalInspectionContextImpl.BUILD_GRAPH, ProjectUtil.calcRelativeToProjectPath(virtualFile, myProject));
myContext.incrementJobDoneAmount(myContext.BUILD_GRAPH, ProjectUtil.calcRelativeToProjectPath(virtualFile, myProject));
}
final FileViewProvider viewProvider = file.getViewProvider();
final Set<Language> relevantLanguages = viewProvider.getLanguages();
@@ -82,6 +82,7 @@ public class BackwardDependenciesBuilder extends DependenciesBuilder {
final PsiManager psiManager = PsiManager.getInstance(getProject());
psiManager.startBatchFilesProcessingMode();
try {
final int fileCount = getScope().getFileCount();
getScope().accept(new PsiRecursiveElementVisitor() {
@Override public void visitFile(final PsiFile file) {
ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator();
@@ -94,7 +95,6 @@ public class BackwardDependenciesBuilder extends DependenciesBuilder {
if (virtualFile != null) {
indicator.setText2(ProjectUtil.calcRelativeToProjectPath(virtualFile, getProject()));
}
final int fileCount = getScope().getFileCount();
if (fileCount > 0) {
indicator.setFraction(((double)++myFileCount) / myTotalFileCount);
}
@@ -19,10 +19,7 @@ import com.intellij.codeHighlighting.HighlightDisplayLevel;
import com.intellij.codeInsight.daemon.impl.HighlightInfo;
import com.intellij.codeInsight.daemon.impl.HighlightInfoFilter;
import com.intellij.codeInspection.*;
import com.intellij.codeInspection.ex.JobDescriptor;
import com.intellij.openapi.project.ProjectUtil;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.XmlRecursiveElementVisitor;
@@ -34,27 +31,18 @@ import org.jetbrains.annotations.Nullable;
* @author yole
*/
public class XmlHighlightVisitorBasedInspection extends GlobalSimpleInspectionTool {
private static final JobDescriptor XML_HIGHLIGHTER =
new JobDescriptor(InspectionsBundle.message("inspection.processing.job.descriptor2"));
@NotNull
@Override
public HighlightDisplayLevel getDefaultLevel() {
return HighlightDisplayLevel.ERROR;
}
@Override
public JobDescriptor[] getAdditionalJobs() {
return new JobDescriptor[]{XML_HIGHLIGHTER};
}
@Override
public void checkFile(@NotNull PsiFile file,
@NotNull final InspectionManager manager,
@NotNull ProblemsHolder problemsHolder,
@NotNull final GlobalInspectionContext globalContext,
@NotNull final ProblemDescriptionsProcessor problemDescriptionsProcessor) {
//XML_HIGHLIGHTER.setTotalAmount(scope.getFileCount());
file.accept(new XmlRecursiveElementVisitor() {
final XmlHighlightVisitor highlightVisitor = new XmlHighlightVisitor();
@@ -80,10 +68,6 @@ public class XmlHighlightVisitorBasedInspection extends GlobalSimpleInspectionTo
return true;
}
};
final VirtualFile virtualFile = file.getVirtualFile();
if (virtualFile != null) {
globalContext.incrementJobDoneAmount(XML_HIGHLIGHTER, ProjectUtil.calcRelativeToProjectPath(virtualFile, file.getProject()));
}
super.visitFile(file);
}