mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
global inspections: implement getAdditionalJobs to show progress correctly (IDEA-56275)
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
+8
-1
@@ -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
|
||||
|
||||
+16
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user