unused declaration presentation: do not mark fixed (deleted & commented) elements...
authorDmitry Batkovich <dmitry.batkovich@jetbrains.com>
Thu, 11 Aug 2016 14:36:06 +0000 (17:36 +0300)
committerDmitry Batkovich <dmitry.batkovich@jetbrains.com>
Thu, 11 Aug 2016 14:36:34 +0000 (17:36 +0300)
java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationPresentation.java
platform/lang-impl/src/com/intellij/codeInspection/ex/InspectionRVContentProvider.java
platform/lang-impl/src/com/intellij/codeInspection/ex/QuickFixAction.java
platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionToolPresentation.java
platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionTreeCellRenderer.java
platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java
platform/lang-impl/src/com/intellij/codeInspection/ui/RefElementNode.java
platform/lang-impl/src/com/intellij/codeInspection/ui/SuppressableInspectionTreeNode.java

index d456587fbbb4a4d9aeb2c76d71ed40fcc27582f3..e51e6f9a411bb6753b01af0375011b4655eaa679 100644 (file)
@@ -48,12 +48,14 @@ import com.intellij.ui.HyperlinkAdapter;
 import com.intellij.ui.ScrollPaneFactory;
 import com.intellij.util.ArrayUtil;
 import com.intellij.util.IncorrectOperationException;
+import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.containers.HashMap;
 import com.intellij.util.containers.HashSet;
 import com.intellij.util.text.CharArrayUtil;
 import com.intellij.util.text.DateFormatUtil;
 import com.intellij.util.ui.JBUI;
 import com.intellij.util.ui.UIUtil;
+import gnu.trove.TObjectHashingStrategy;
 import org.jdom.Element;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
@@ -77,12 +79,28 @@ import java.util.function.Predicate;
 public class UnusedDeclarationPresentation extends DefaultInspectionToolPresentation {
   private final Map<String, Set<RefEntity>> myPackageContents = Collections.synchronizedMap(new HashMap<String, Set<RefEntity>>());
 
-  private final Set<RefEntity> myIgnoreElements = new HashSet<>();
+  private final Set<RefEntity> myIgnoreElements = ContainerUtil.newConcurrentSet(TObjectHashingStrategy.IDENTITY);
+  private final Map<RefEntity, UnusedDeclarationHint> myFixedElements = ContainerUtil.newConcurrentMap(TObjectHashingStrategy.IDENTITY);
+
   private WeakUnreferencedFilter myFilter;
   private DeadHTMLComposer myComposer;
   @NonNls private static final String DELETE = "delete";
   @NonNls private static final String COMMENT = "comment";
-  @NonNls private static final String [] HINTS = {COMMENT, DELETE};
+
+  private enum UnusedDeclarationHint {
+    COMMENT("Commented out"),
+    DELETE("Deleted"),;
+
+    private final String myDescription;
+
+    UnusedDeclarationHint(String description) {
+      myDescription = description;
+    }
+
+    public String getDescription() {
+      return myDescription;
+    }
+  }
 
   public UnusedDeclarationPresentation(@NotNull InspectionToolWrapper toolWrapper, @NotNull GlobalInspectionContextImpl context) {
     super(toolWrapper, context);
@@ -150,9 +168,9 @@ public class UnusedDeclarationPresentation extends DefaultInspectionToolPresenta
 
       @NonNls Element hintsElement = new Element("hints");
 
-      for (String hint : HINTS) {
+      for (UnusedDeclarationHint hint : UnusedDeclarationHint.values()) {
         @NonNls Element hintElement = new Element("hint");
-        hintElement.setAttribute("value", hint);
+        hintElement.setAttribute("value", hint.toString().toLowerCase());
         hintsElement.addContent(hintElement);
       }
       element.addContent(hintsElement);
@@ -206,7 +224,12 @@ public class UnusedDeclarationPresentation extends DefaultInspectionToolPresenta
         final Project project = getContext().getProject();
         if (isDisposed() || project.isDisposed()) return;
         SafeDeleteHandler.invoke(project, psiElements, false,
-                                 () -> removeElements(refElements, project, myToolWrapper));
+                                 () -> {
+                                   removeElements(refElements, project, myToolWrapper);
+                                   for (RefEntity ref : refElements) {
+                                     myFixedElements.put(ref, UnusedDeclarationHint.DELETE);
+                                   }
+                                 });
       });
 
       return false; //refresh after safe delete dialog is closed
@@ -278,6 +301,9 @@ public class UnusedDeclarationPresentation extends DefaultInspectionToolPresenta
         entryPointsManager.removeEntryPoint(refElement);
       }
 
+      for (RefElement ref : deletedRefs) {
+        myFixedElements.put(ref, UnusedDeclarationHint.COMMENT);
+      }
       return true;
     }
   }
@@ -375,6 +401,27 @@ public class UnusedDeclarationPresentation extends DefaultInspectionToolPresenta
     return entryPointsNode;
   }
 
+  @NotNull
+  @Override
+  public RefElementNode createRefNode(@NotNull RefEntity entity) {
+    return new RefElementNode(entity, this) {
+      @Nullable
+      @Override
+      public String getCustomizedTailText() {
+        final UnusedDeclarationHint hint = myFixedElements.get(getElement());
+        if (hint != null) {
+          return hint.getDescription();
+        }
+        return super.getCustomizedTailText();
+      }
+
+      @Override
+      public boolean isQuickFixAppliedFromView() {
+        return myFixedElements.containsKey(getElement());
+      }
+    };
+  }
+
   @Override
   public void updateContent() {
     getTool().checkForReachableRefs(getContext());
index 4f9b181adc5222fed4c49fd84c4b8c1d15de188e..35f2ca182bb85402d8b013f7893f1294e4760e85 100644 (file)
@@ -74,7 +74,7 @@ public abstract class InspectionRVContentProvider {
 
     @NotNull
     public RefElementNode createNode(@NotNull InspectionToolPresentation presentation) {
-      return ReadAction.compute(() -> new RefElementNode(myEntity, presentation));
+      return ReadAction.compute(() -> presentation.createRefNode(myEntity));
     }
 
     @Nullable
index f3ef73f636055c61785e32a6b6b4b59b33ef204d..1efc1db12d9c43eab7f3a3e533be940abe6b02e4 100644 (file)
@@ -271,7 +271,7 @@ public class QuickFixAction extends AnAction implements CustomComponentAction {
     }
   }
 
-  private static void refreshViews(@NotNull Project project, @NotNull RefEntity[] refElements, @NotNull InspectionToolWrapper toolWrapper) {
+  protected static void refreshViews(@NotNull Project project, @NotNull RefEntity[] refElements, @NotNull InspectionToolWrapper toolWrapper) {
     final Set<PsiElement> ignoredElements = new HashSet<>();
     for (RefEntity element : refElements) {
       final PsiElement psiElement = element instanceof RefElement ? ((RefElement)element).getElement() : null;
index 4c5244ac361c3659fb7beb4d28fb021515cea2e8..32712db5879306d958b8a774446dbd104264b990 100644 (file)
@@ -48,6 +48,12 @@ public interface InspectionToolPresentation extends ProblemDescriptionsProcessor
                                 @NotNull InspectionTreeNode parentNode,
                                 final boolean showStructure,
                                 final boolean groupBySeverity);
+
+  @NotNull
+  default RefElementNode createRefNode(@NotNull RefEntity entity) {
+    return new RefElementNode(entity, this);
+  }
+
   void updateContent();
 
   boolean hasReportedProblems();
index 907a726033d1c797d4d6e8b559615642cdf08bec..040f413da079c28664d710989a215ab4b92148b7 100644 (file)
@@ -69,7 +69,7 @@ class InspectionTreeCellRenderer extends ColoredTreeCellRenderer {
     if (node.isExcluded(myView.getExcludedManager())) {
       return attributes.derive(attributes.getStyle() | SimpleTextAttributes.STYLE_STRIKEOUT, null, null, null);
     }
-    if (node instanceof ProblemDescriptionNode && ((ProblemDescriptionNode)node).isQuickFixAppliedFromView()) {
+    if (node instanceof SuppressableInspectionTreeNode && ((SuppressableInspectionTreeNode)node).isQuickFixAppliedFromView()) {
       return attributes.derive(-1, SimpleTextAttributes.GRAYED_ATTRIBUTES.getFgColor(), null, null);
     }
     if (!node.isValid()) {
index a4d7bb6bdb1487ce5256c1afcd1435a11e2f1e7b..f431cd7c79a4106315c28351cb870c10e8d09b10 100644 (file)
@@ -169,6 +169,7 @@ public class ProblemDescriptionNode extends SuppressableInspectionTreeNode {
     return XmlStringUtil.stripHtml(ProblemDescriptorUtil.renderDescriptionMessage(descriptor, element, TRIM_AT_TREE_END));
   }
 
+  @Override
   public boolean isQuickFixAppliedFromView() {
     return (myDescriptor != null && myPresentation.isProblemResolved(getElement(), myDescriptor)) && !isAlreadySuppressedFromView();
   }
index 68a0d15c9479f36032f097efbba1711badaeabeb..a92de6a639e900bf1d761d71e14b88e57d36ccaf 100644 (file)
@@ -134,6 +134,11 @@ public class RefElementNode extends SuppressableInspectionTreeNode {
     super.visitProblemSeverities(counter);
   }
 
+  @Override
+  public boolean isQuickFixAppliedFromView() {
+    return false;
+  }
+
   @Nullable
   @Override
   public String getCustomizedTailText() {
index c8e6928a66914a7c0d42257c5b69908e6ccaf223..1c0110b9745d4d970816bd9fb1e73a6fe22ed4f5 100644 (file)
@@ -60,6 +60,8 @@ public abstract class SuppressableInspectionTreeNode extends CachedInspectionTre
     return usrObj != null && myView.getSuppressedNodes(myPresentation.getToolWrapper().getShortName()).contains(usrObj);
   }
 
+  public abstract boolean isQuickFixAppliedFromView();
+
   @Nullable
   @Override
   public String getCustomizedTailText() {