global inspections: implement getAdditionalJobs to show progress correctly (IDEA-56275)

This commit is contained in:
anna
2010-07-07 12:37:48 +04:00
parent c0e2a0c3b0
commit fe5e4d0884
7 changed files with 61 additions and 4 deletions
@@ -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> T getExtension(Key<T> key);
void incrementJobDoneAmount(JobDescriptor job, String message);
}
@@ -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;
}
}
@@ -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<Annotator> 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);
}
@@ -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;
@@ -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
@@ -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);
}