batch inspections: append local problems during progress

This commit is contained in:
anna
2011-07-11 09:40:42 +04:00
parent 972167979b
commit 9a34cd0ae9
8 changed files with 94 additions and 34 deletions
@@ -177,7 +177,7 @@ public class JavaChangeUtilSupport implements TreeGenerator, TreeCopyHandler {
element.rawAddChildren(keyword);
return element;
}
if (type instanceof PsiWildcardType) {
if (type instanceof PsiWildcardType || type instanceof PsiCapturedWildcardType || type instanceof PsiDisjunctionType) {
final String originalText = original.getText();
return createType(original.getProject(), originalText, null, generated);
}
@@ -185,10 +185,7 @@ public class JavaChangeUtilSupport implements TreeGenerator, TreeCopyHandler {
LightTypeElement te = new LightTypeElement(original.getManager(), ((PsiIntersectionType)type).getRepresentative());
return ChangeUtil.generateTreeElement(te, table, manager);
}
if (type instanceof PsiDisjunctionType) {
final String originalText = original.getText();
return createType(original.getProject(), originalText, null, generated);
}
PsiClassType classType = (PsiClassType)type;
String text = classType.getPresentableText();
@@ -184,7 +184,8 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G
}
public void addView(InspectionResultsView view, String title) {
public synchronized void addView(InspectionResultsView view, String title) {
if (myContent != null) return;
myContentManager.getValue().addContentManagerListener(new ContentManagerAdapter() {
public void contentRemoved(ContentManagerEvent event) {
if (event.getContent() == myContent){
@@ -207,7 +208,7 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G
ToolWindowManager.getInstance(myProject).getToolWindow(ToolWindowId.INSPECTION).activate(null);
}
private void addView(InspectionResultsView view) {
protected void addView(InspectionResultsView view) {
addView(view, view.getCurrentProfileName() == null
? InspectionsBundle.message("inspection.results.title")
: InspectionsBundle.message("inspection.results.for.profile.toolwindow.title", view.getCurrentProfileName()));
@@ -368,6 +369,10 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G
}
}
public InspectionResultsView getView() {
return myView;
}
private static void ignoreElementRecursively(final InspectionTool tool, final RefEntity refElement) {
if (refElement != null) {
tool.ignoreCurrentElement(refElement);
@@ -397,8 +402,9 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G
PsiDocumentManager.getInstance(myProject).commitAllDocuments();
LOG.info("Code inspection started");
ProgressManager.getInstance().run(new Task.Backgroundable(getProject(), InspectionsBundle.message("inspection.progress.title"), true, new PerformAnalysisInBackgroundOption(myProject)) {
myView = new InspectionResultsView(myProject, getCurrentProfile(), scope, this, new InspectionRVContentProviderImpl(myProject));
ProgressManager.getInstance().run(new Task.Backgroundable(getProject(), InspectionsBundle.message("inspection.progress.title"), true,
new PerformAnalysisInBackgroundOption(myProject)) {
public void run(@NotNull ProgressIndicator indicator) {
performInspectionsWithProgress(scope, manager);
}
@@ -409,16 +415,15 @@ public class GlobalInspectionContextImpl extends UserDataHolderBase implements G
public void run() {
LOG.info("Code inspection finished");
InspectionResultsView view = new InspectionResultsView(myProject, getCurrentProfile(),
scope, GlobalInspectionContextImpl.this,
new InspectionRVContentProviderImpl(myProject));
if (!view.update() && !getUIOptions().SHOW_ONLY_DIFF) {
Messages.showMessageDialog(myProject, InspectionsBundle.message("inspection.no.problems.message"),
InspectionsBundle.message("inspection.no.problems.dialog.title"), Messages.getInformationIcon());
close(true);
}
else {
addView(view);
if (myView != null) {
if (!myView.update() && !getUIOptions().SHOW_ONLY_DIFF) {
Messages.showMessageDialog(myProject, InspectionsBundle.message("inspection.no.problems.message"),
InspectionsBundle.message("inspection.no.problems.dialog.title"), Messages.getInformationIcon());
close(true);
}
else {
addView(myView);
}
}
}
});
@@ -20,6 +20,8 @@
*/
package com.intellij.codeInspection.ex;
import com.intellij.codeInspection.CommonProblemDescriptor;
import com.intellij.codeInspection.reference.RefEntity;
import com.intellij.codeInspection.ui.*;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
@@ -65,9 +67,20 @@ public abstract class InspectionRVContentProvider {
public abstract QuickFixAction[] getQuickFixes(final InspectionTool tool, final InspectionTree tree);
public void appendToolNodeContent(final InspectionNode toolNode,
final InspectionTreeNode parentNode,
final boolean showStructure) {
final InspectionTool tool = toolNode.getTool();
final Map<String, Set<RefEntity>> content = tool.getContent();
appendToolNodeContent(toolNode, parentNode, showStructure, content != null ? content : new HashMap<String, Set<RefEntity>>(),
tool instanceof DescriptorProviderInspection ? ((DescriptorProviderInspection)tool).getProblemElements() : null);
}
public abstract void appendToolNodeContent(final InspectionNode toolNode,
final InspectionTreeNode parentNode,
final boolean showStructure);
final boolean showStructure,
final Map<String, Set<RefEntity>> contents,
final Map<RefEntity, CommonProblemDescriptor[]> problems);
protected abstract void appendDescriptor(final InspectionTool tool,
final UserObjectContainer container,
@@ -54,19 +54,20 @@ public class InspectionRVContentProviderImpl extends InspectionRVContentProvider
return refEntities.length == 0 ? null : tool.getQuickFixes(refEntities);
}
public void appendToolNodeContent(final InspectionNode toolNode, final InspectionTreeNode parentNode, final boolean showStructure) {
public void appendToolNodeContent(final InspectionNode toolNode,
final InspectionTreeNode parentNode,
final boolean showStructure,
final Map<String, Set<RefEntity>> contents,
final Map<RefEntity, CommonProblemDescriptor[]> problems) {
final InspectionTool tool = toolNode.getTool();
final Map<RefEntity, CommonProblemDescriptor[]> problems =
tool instanceof DescriptorProviderInspection ? ((DescriptorProviderInspection)tool).getProblemElements() : null;
Function<RefEntity, UserObjectContainer<RefEntity>> computeContainer = new Function<RefEntity, UserObjectContainer<RefEntity>>() {
public UserObjectContainer<RefEntity> fun(final RefEntity refElement) {
return new RefElementContainer(refElement, problems != null ? problems.get(refElement) : null);
}
};
final Map<String, Set<RefEntity>> contents = tool.getContent();
final Set<RefModule> moduleProblems = tool.getModuleProblems();
if (moduleProblems != null && !moduleProblems.isEmpty()) {
Set<RefEntity> entities = contents.get("");
@@ -52,6 +52,7 @@ import java.util.Set;
public abstract class InspectionTool extends InspectionProfileEntry {
private GlobalInspectionContextImpl myContext;
protected static String ourOutputPath;
protected InspectionNode myToolNode;
public void initialize(@NotNull GlobalInspectionContextImpl context) {
myContext = context;
@@ -205,9 +206,9 @@ public abstract class InspectionTool extends InspectionProfileEntry {
}
public InspectionNode createToolNode(final InspectionRVContentProvider provider, final InspectionTreeNode parentNode, final boolean showStructure) {
final InspectionNode toolNode = new InspectionNode(this);
provider.appendToolNodeContent(toolNode, parentNode, showStructure);
return toolNode;
myToolNode = new InspectionNode(this);
provider.appendToolNodeContent(myToolNode, parentNode, showStructure);
return myToolNode;
}
@Nullable
@@ -20,7 +20,11 @@ import com.intellij.analysis.AnalysisScope;
import com.intellij.codeHighlighting.HighlightDisplayLevel;
import com.intellij.codeInspection.*;
import com.intellij.codeInspection.reference.RefElement;
import com.intellij.codeInspection.reference.RefEntity;
import com.intellij.codeInspection.reference.RefManagerImpl;
import com.intellij.codeInspection.ui.InspectionResultsView;
import com.intellij.codeInspection.ui.InspectionTreeNode;
import com.intellij.lang.annotation.HighlightSeverity;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
@@ -28,15 +32,16 @@ import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.psi.*;
import com.intellij.util.TripleFunction;
import com.intellij.util.containers.*;
import com.intellij.util.containers.HashSet;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import javax.swing.tree.DefaultTreeModel;
import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author max
@@ -100,6 +105,37 @@ public final class LocalInspectionToolWrapper extends DescriptorProviderInspecti
}
};
@Override
protected void addProblemElement(RefEntity refElement, boolean filterSuppressed, CommonProblemDescriptor... descriptions) {
super.addProblemElement(refElement, filterSuppressed, descriptions);
final InspectionResultsView view = getContext().getView();
if (view != null && refElement instanceof RefElement) {
if (myToolNode == null) {
final HighlightSeverity currentSeverity = getCurrentSeverity((RefElement)refElement);
view.addTool(this, HighlightDisplayLevel.find(currentSeverity), getContext().getUIOptions().GROUP_BY_SEVERITY);
}
final HashMap<RefEntity, CommonProblemDescriptor[]> problems = new HashMap<RefEntity, CommonProblemDescriptor[]>();
problems.put(refElement, descriptions);
final HashMap<String, Set<RefEntity>> contents = new HashMap<String, Set<RefEntity>>();
final String groupName = refElement.getRefManager().getGroupName((RefElement)refElement);
Set<RefEntity> content = contents.get(groupName);
if (content == null) {
content = new HashSet<RefEntity>();
contents.put(groupName, content);
}
content.add(refElement);
view.getProvider().appendToolNodeContent(myToolNode,
(InspectionTreeNode)myToolNode.getParent(), getContext().getUIOptions().SHOW_STRUCTURE,
contents, problems);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
getContext().addView(view);
((DefaultTreeModel)view.getTree().getModel()).reload(myToolNode);
}
});
}
}
public static void addProblemDescriptors(List<ProblemDescriptor> descriptors,
boolean filterSuppressed,
@NotNull GlobalInspectionContextImpl context,
@@ -106,7 +106,11 @@ public class OfflineInspectionRVContentProvider extends InspectionRVContentProvi
return false;
}
public void appendToolNodeContent(final InspectionNode toolNode, final InspectionTreeNode parentNode, final boolean showStructure) {
public void appendToolNodeContent(final InspectionNode toolNode,
final InspectionTreeNode parentNode,
final boolean showStructure,
final Map<String, Set<RefEntity>> contents,
final Map<RefEntity, CommonProblemDescriptor[]> problems) {
final InspectionTool tool = toolNode.getTool();
final Map<String, Set<OfflineProblemDescriptor>> filteredContent = getFilteredContent(tool);
if (filteredContent != null && !filteredContent.values().isEmpty()) {
@@ -425,7 +425,7 @@ public class InspectionResultsView extends JPanel implements Disposable, Occuren
setCursor(currentCursor);
}
private void addTool(InspectionTool tool, HighlightDisplayLevel errorLevel, boolean groupedBySeverity) {
public void addTool(InspectionTool tool, HighlightDisplayLevel errorLevel, boolean groupedBySeverity) {
final InspectionTreeNode parentNode = getToolParentNode(tool.getGroupDisplayName().length() > 0 ? tool.getGroupDisplayName() : InspectionProfileEntry.GENERAL_GROUP_NAME, errorLevel, groupedBySeverity);
tool.createToolNode(myProvider, parentNode, myGlobalInspectionContext.getUIOptions().SHOW_STRUCTURE);
registerActionShortcuts(tool);
@@ -492,10 +492,13 @@ public class InspectionResultsView extends JPanel implements Disposable, Occuren
return resultsFound;
}
private InspectionTreeNode getToolParentNode(String groupName, HighlightDisplayLevel errorLevel, boolean groupedBySeverity) {
public InspectionTreeNode getToolParentNode(String groupName, HighlightDisplayLevel errorLevel, boolean groupedBySeverity) {
if (groupName == null || groupName.length() == 0) {
return getRelativeRootNode(groupedBySeverity, errorLevel);
}
if (myGroups == null) {
myGroups = new HashMap<HighlightDisplayLevel, Map<String, InspectionGroupNode>>();
}
Map<String, InspectionGroupNode> map = myGroups.get(errorLevel);
if (map == null) {
map = new HashMap<String, InspectionGroupNode>();