From fe5e4d088430c2a0491a364549ca5f07e2034144 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 6 Jul 2010 17:44:24 +0400 Subject: [PATCH] global inspections: implement getAdditionalJobs to show progress correctly (IDEA-56275) --- .../GlobalInspectionContext.java | 3 +++ .../codeInspection/GlobalInspectionTool.java | 11 +++++++++ .../codeInspection/ex/JobDescriptor.java | 0 .../AnnotatorBasedInspection.java | 24 ++++++++++++++++--- .../ex/GlobalInspectionContextImpl.java | 2 ++ .../ex/GlobalInspectionToolWrapper.java | 9 ++++++- .../XmlHighlightVisitorBasedInspection.java | 16 +++++++++++++ 7 files changed, 61 insertions(+), 4 deletions(-) rename platform/{lang-impl => lang-api}/src/com/intellij/codeInspection/ex/JobDescriptor.java (100%) diff --git a/platform/lang-api/src/com/intellij/codeInspection/GlobalInspectionContext.java b/platform/lang-api/src/com/intellij/codeInspection/GlobalInspectionContext.java index 302b2a2a0c58..b26ab828e328 100644 --- a/platform/lang-api/src/com/intellij/codeInspection/GlobalInspectionContext.java +++ b/platform/lang-api/src/com/intellij/codeInspection/GlobalInspectionContext.java @@ -16,6 +16,7 @@ package com.intellij.codeInspection; +import com.intellij.codeInspection.ex.JobDescriptor; import com.intellij.codeInspection.reference.RefEntity; import com.intellij.codeInspection.reference.RefManager; import com.intellij.openapi.project.Project; @@ -73,4 +74,6 @@ public interface GlobalInspectionContext { Project getProject(); T getExtension(Key key); + + void incrementJobDoneAmount(JobDescriptor job, String message); } diff --git a/platform/lang-api/src/com/intellij/codeInspection/GlobalInspectionTool.java b/platform/lang-api/src/com/intellij/codeInspection/GlobalInspectionTool.java index ecb6b959713a..4cb88fb66b27 100644 --- a/platform/lang-api/src/com/intellij/codeInspection/GlobalInspectionTool.java +++ b/platform/lang-api/src/com/intellij/codeInspection/GlobalInspectionTool.java @@ -16,6 +16,7 @@ package com.intellij.codeInspection; import com.intellij.analysis.AnalysisScope; +import com.intellij.codeInspection.ex.JobDescriptor; import com.intellij.codeInspection.reference.RefEntity; import com.intellij.codeInspection.reference.RefGraphAnnotator; import com.intellij.codeInspection.reference.RefManager; @@ -174,4 +175,14 @@ public abstract class GlobalInspectionTool extends InspectionProfileEntry { */ public void compose(StringBuffer buf, RefEntity refEntity, HTMLComposer composer) { } + + /** + * @return JobDescriptors array to show inspection progress correctly. TotalAmount should be set (e.g. in + * {@link #runInspection(com.intellij.analysis.AnalysisScope, InspectionManager, GlobalInspectionContext, ProblemDescriptionsProcessor)}) + * ProgressIndicator should progress with {@link com.intellij.codeInspection.GlobalInspectionContext#incrementJobDoneAmount(com.intellij.codeInspection.ex.JobDescriptor, String)} + */ + @Nullable + public JobDescriptor[] getAdditionalJobs() { + return null; + } } diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/JobDescriptor.java b/platform/lang-api/src/com/intellij/codeInspection/ex/JobDescriptor.java similarity index 100% rename from platform/lang-impl/src/com/intellij/codeInspection/ex/JobDescriptor.java rename to platform/lang-api/src/com/intellij/codeInspection/ex/JobDescriptor.java diff --git a/platform/lang-impl/src/com/intellij/codeInspection/AnnotatorBasedInspection.java b/platform/lang-impl/src/com/intellij/codeInspection/AnnotatorBasedInspection.java index b1381e7e0092..23b1d4d631a9 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/AnnotatorBasedInspection.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/AnnotatorBasedInspection.java @@ -20,13 +20,17 @@ import com.intellij.analysis.AnalysisScope; import com.intellij.codeHighlighting.HighlightDisplayLevel; import com.intellij.codeInsight.daemon.impl.AnnotationHolderImpl; import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInspection.ex.DescriptorProviderInspection; +import com.intellij.codeInspection.ex.JobDescriptor; import com.intellij.lang.ASTNode; import com.intellij.lang.LanguageAnnotators; import com.intellij.lang.annotation.Annotation; import com.intellij.lang.annotation.AnnotationHolder; import com.intellij.lang.annotation.Annotator; import com.intellij.lang.annotation.HighlightSeverity; +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.PsiLanguageInjectionHost; @@ -37,11 +41,18 @@ import org.jetbrains.annotations.NotNull; import java.util.List; public class AnnotatorBasedInspection extends GlobalInspectionTool { + private static final JobDescriptor ANNOTATOR = new JobDescriptor(InspectionsBundle.message("inspection.processing.job.descriptor2")); + @Override public boolean isGraphNeeded() { return false; } + @Override + public JobDescriptor[] getAdditionalJobs() { + return new JobDescriptor[]{ANNOTATOR}; + } + @NotNull @Override public HighlightDisplayLevel getDefaultLevel() { @@ -50,9 +61,10 @@ public class AnnotatorBasedInspection extends GlobalInspectionTool { @Override public void runInspection(AnalysisScope scope, - final InspectionManager manager, - final GlobalInspectionContext globalContext, - final ProblemDescriptionsProcessor problemDescriptionsProcessor) { + InspectionManager manager, + GlobalInspectionContext globalContext, + ProblemDescriptionsProcessor problemDescriptionsProcessor) { + ANNOTATOR.setTotalAmount(scope.getFileCount()); scope.accept(new MyPsiRecursiveElementVisitor(manager, globalContext, problemDescriptionsProcessor)); } @@ -81,10 +93,12 @@ public class AnnotatorBasedInspection extends GlobalInspectionTool { private final AnnotationHolder myHolder; private List annotators; private PsiFile myFile; + private final GlobalInspectionContext myGlobalContext; public MyPsiRecursiveElementVisitor(final InspectionManager manager, final GlobalInspectionContext globalContext, final ProblemDescriptionsProcessor problemDescriptionsProcessor) { + myGlobalContext = globalContext; myHolder = new AnnotationHolderImpl() { @Override public Annotation createErrorAnnotation(@NotNull PsiElement elt, String message) { @@ -150,6 +164,10 @@ public class AnnotatorBasedInspection extends GlobalInspectionTool { @Override public void visitFile(PsiFile file) { myFile = file; + final VirtualFile virtualFile = myFile.getVirtualFile(); + if (virtualFile != null) { + myGlobalContext.incrementJobDoneAmount(ANNOTATOR, ProjectUtil.calcRelativeToProjectPath(virtualFile, myFile.getProject())); + } super.visitFile(file); } diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java b/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java index 4e3256258f1a..8da57fa38b60 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionContextImpl.java @@ -81,6 +81,7 @@ public class GlobalInspectionContextImpl implements GlobalInspectionContext { private ProgressIndicator myProgressIndicator; public static final JobDescriptor BUILD_GRAPH = new JobDescriptor(InspectionsBundle.message("inspection.processing.job.descriptor")); + public static final JobDescriptor[] BUILD_GRAPH_ONLY = new JobDescriptor[]{BUILD_GRAPH}; public static final JobDescriptor FIND_EXTERNAL_USAGES = new JobDescriptor(InspectionsBundle.message("inspection.processing.job.descriptor1")); @@ -609,6 +610,7 @@ public class GlobalInspectionContextImpl implements GlobalInspectionContext { } } + @Override public void incrementJobDoneAmount(JobDescriptor job, String message) { if (myProgressIndicator == null) return; diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionToolWrapper.java b/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionToolWrapper.java index 8a1113e73c15..870447573efb 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionToolWrapper.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ex/GlobalInspectionToolWrapper.java @@ -16,6 +16,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; import com.intellij.psi.PsiFile; +import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import org.jdom.Element; import org.jetbrains.annotations.NonNls; @@ -53,7 +54,13 @@ public class GlobalInspectionToolWrapper extends DescriptorProviderInspection { @NotNull public JobDescriptor[] getJobDescriptors() { - return isGraphNeeded() ? new JobDescriptor[]{GlobalInspectionContextImpl.BUILD_GRAPH}: JobDescriptor.EMPTY_ARRAY; + final JobDescriptor[] additionalJobs = myTool.getAdditionalJobs(); + if (additionalJobs == null) { + return isGraphNeeded() ? GlobalInspectionContextImpl.BUILD_GRAPH_ONLY : JobDescriptor.EMPTY_ARRAY; + } + else { + return isGraphNeeded() ? ArrayUtil.append(additionalJobs, GlobalInspectionContextImpl.BUILD_GRAPH) : additionalJobs; + } } @NotNull diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitorBasedInspection.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitorBasedInspection.java index 6bba6ffb293d..2dc587292868 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitorBasedInspection.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitorBasedInspection.java @@ -20,7 +20,10 @@ 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; @@ -32,6 +35,9 @@ import org.jetbrains.annotations.Nullable; * @author yole */ public class XmlHighlightVisitorBasedInspection extends GlobalInspectionTool { + private static final JobDescriptor XML_HIGHLIGHTER = + new JobDescriptor(InspectionsBundle.message("inspection.processing.job.descriptor2")); + @Override public boolean isGraphNeeded() { return false; @@ -43,11 +49,17 @@ public class XmlHighlightVisitorBasedInspection extends GlobalInspectionTool { return HighlightDisplayLevel.ERROR; } + @Override + public JobDescriptor[] getAdditionalJobs() { + return new JobDescriptor[]{XML_HIGHLIGHTER}; + } + @Override public void runInspection(AnalysisScope scope, final InspectionManager manager, final GlobalInspectionContext globalContext, final ProblemDescriptionsProcessor problemDescriptionsProcessor) { + XML_HIGHLIGHTER.setTotalAmount(scope.getFileCount()); scope.accept(new XmlRecursiveElementVisitor() { final XmlHighlightVisitor highlightVisitor = new XmlHighlightVisitor(); @@ -73,6 +85,10 @@ public class XmlHighlightVisitorBasedInspection extends GlobalInspectionTool { return true; } }; + final VirtualFile virtualFile = file.getVirtualFile(); + if (virtualFile != null) { + globalContext.incrementJobDoneAmount(XML_HIGHLIGHTER, ProjectUtil.calcRelativeToProjectPath(virtualFile, file.getProject())); + } super.visitFile(file); }