properties: make available to suppress any inspection for properties files IDEA...
authorDmitry Batkovich <dmitry.batkovich@jetbrains.com>
Wed, 14 Sep 2016 09:21:37 +0000 (12:21 +0300)
committerDmitry Batkovich <dmitry.batkovich@jetbrains.com>
Wed, 14 Sep 2016 09:22:02 +0000 (12:22 +0300)
plugins/java-i18n/src/com/intellij/lang/properties/UnusedMessageFormatParameterInspection.java
plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/PropertiesInspectionSuppressor.java [moved from plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertySuppressableInspectionBase.java with 65% similarity]
plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/TrailingSpacesInPropertyInspection.java
plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/WrongPropertyKeyValueDelimiterInspection.java
plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/unused/UnusedPropertyInspection.java
plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertiesInspectionBase.java [new file with mode: 0644]
plugins/properties/src/META-INF/plugin.xml

index b0210dc1be0a83d20a25b2ffe0f1b7374db51ade..500d9e892f1aa3a652fbf2b916d9370f618b7210 100644 (file)
@@ -20,7 +20,6 @@ import com.intellij.codeInspection.InspectionManager;
 import com.intellij.codeInspection.LocalQuickFix;
 import com.intellij.codeInspection.ProblemDescriptor;
 import com.intellij.codeInspection.ProblemHighlightType;
-import com.intellij.codeInspection.ex.BaseLocalInspectionTool;
 import com.intellij.lang.ASTNode;
 import com.intellij.lang.properties.psi.PropertiesFile;
 import com.intellij.lang.properties.psi.Property;
@@ -39,7 +38,7 @@ import java.util.Set;
  * User: anna
  * Date: 07-Sep-2005
  */
-public class UnusedMessageFormatParameterInspection extends PropertySuppressableInspectionBase {
+public class UnusedMessageFormatParameterInspection extends PropertiesInspectionBase {
   public static final String REGEXP = "regexp";
   @NotNull
   public String getGroupDisplayName() {
similarity index 65%
rename from plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertySuppressableInspectionBase.java
rename to plugins/properties/properties-psi-impl/src/com/intellij/codeInspection/PropertiesInspectionSuppressor.java
index d49666924553bc086a4f18933119cc0d2e7b3ee1..7a3c60511e39c541c046d3cee64278c752b261bd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2015 JetBrains s.r.o.
+ * Copyright 2000-2016 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.intellij.lang.properties;
+package com.intellij.codeInspection;
 
 import com.intellij.codeInsight.FileModificationService;
-import com.intellij.codeInspection.CustomSuppressableInspectionTool;
-import com.intellij.codeInspection.LocalInspectionTool;
-import com.intellij.codeInspection.SuppressIntentionAction;
+import com.intellij.lang.properties.PropertiesBundle;
 import com.intellij.lang.properties.psi.PropertiesFile;
 import com.intellij.lang.properties.psi.PropertiesList;
 import com.intellij.lang.properties.psi.Property;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.editor.Document;
-import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.project.Project;
 import com.intellij.psi.*;
 import com.intellij.psi.util.PsiTreeUtil;
-import com.intellij.util.IncorrectOperationException;
+import org.jetbrains.annotations.Nls;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
 
-/**
- * User: cdr
- */
-public abstract class PropertySuppressableInspectionBase extends LocalInspectionTool implements CustomSuppressableInspectionTool {
-  private static final Logger LOG = Logger.getInstance("#com.intellij.lang.properties.PropertySuppressableInspectionBase");
-  @Override
-  @NotNull
-  public String getGroupDisplayName() {
-    return PropertiesBundle.message("properties.files.inspection.group.display.name");
-  }
+public class PropertiesInspectionSuppressor implements InspectionSuppressor {
+  private final static Logger LOG = Logger.getInstance(PropertiesInspectionSuppressor.class);
 
   @Override
   @NotNull
-  public SuppressIntentionAction[] getSuppressActions(final PsiElement element) {
-    return new SuppressIntentionAction[] {new SuppressSinglePropertyFix(getShortName()), new SuppressForFile(getShortName())};
+  public SuppressQuickFix[] getSuppressActions(final PsiElement element, @NotNull final String toolId) {
+    return new SuppressQuickFix[] {new SuppressSinglePropertyFix(toolId), new SuppressForFile(toolId)};
   }
 
   @Override
-  public boolean isSuppressedFor(@NotNull PsiElement element) {
+  public boolean isSuppressedFor(@NotNull PsiElement element, @NotNull String toolId) {
     Property property = PsiTreeUtil.getParentOfType(element, Property.class, false);
     PropertiesFile file;
     if (property == null) {
@@ -67,7 +56,7 @@ public abstract class PropertySuppressableInspectionBase extends LocalInspection
       while (prev instanceof PsiWhiteSpace || prev instanceof PsiComment) {
         if (prev instanceof PsiComment) {
           @NonNls String text = prev.getText();
-          if (text.contains("suppress") && text.contains("\"" + getShortName() + "\"")) return true;
+          if (text.contains("suppress") && text.contains("\"" + toolId + "\"")) return true;
         }
         prev = prev.getPrevSibling();
       }
@@ -78,13 +67,13 @@ public abstract class PropertySuppressableInspectionBase extends LocalInspection
 
     while (leaf instanceof PsiComment) {
       @NonNls String text = leaf.getText();
-      if (text.contains("suppress") && text.contains("\"" + getShortName() + "\"") && text.contains("file")) {
+      if (text.contains("suppress") && text.contains("\"" + toolId + "\"") && text.contains("file")) {
         return true;
       }
       leaf = leaf.getNextSibling();
       if (leaf instanceof PsiWhiteSpace) leaf = leaf.getNextSibling();
       // comment before first property get bound to the file, not property
-      if (leaf instanceof PropertiesList && leaf.getFirstChild() == property && text.contains("suppress") && text.contains("\"" + getShortName() + "\"")) {
+      if (leaf instanceof PropertiesList && leaf.getFirstChild() == property && text.contains("suppress") && text.contains("\"" + toolId + "\"")) {
         return true;
       }
     }
@@ -92,17 +81,18 @@ public abstract class PropertySuppressableInspectionBase extends LocalInspection
     return false;
   }
 
-  private static class SuppressSinglePropertyFix extends SuppressIntentionAction {
+  private static class SuppressSinglePropertyFix implements SuppressQuickFix {
     private final String shortName;
 
     private SuppressSinglePropertyFix(String shortName) {
       this.shortName = shortName;
     }
 
-    @Override
+    @Nls
     @NotNull
-    public String getText() {
-      return PropertiesBundle.message("unused.property.suppress.for.property");
+    @Override
+    public String getName() {
+      return getFamilyName();
     }
 
     @Override
@@ -112,13 +102,8 @@ public abstract class PropertySuppressableInspectionBase extends LocalInspection
     }
 
     @Override
-    public boolean isAvailable(@NotNull final Project project, final Editor editor, @NotNull final PsiElement element) {
-      final Property property = PsiTreeUtil.getParentOfType(element, Property.class);
-      return property != null && property.isValid();
-    }
-
-    @Override
-    public void invoke(@NotNull final Project project, final Editor editor, @NotNull final PsiElement element) throws IncorrectOperationException {
+    public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
+      final PsiElement element = descriptor.getStartElement();
       final PsiFile file = element.getContainingFile();
       if (!FileModificationService.getInstance().prepareFileForWrite(file)) return;
 
@@ -134,19 +119,32 @@ public abstract class PropertySuppressableInspectionBase extends LocalInspection
       doc.insertString(lineStart, "# suppress inspection \"" + shortName +
                                   "\"\n");
     }
+
+    @Override
+    public boolean isAvailable(@NotNull Project project, @NotNull PsiElement context) {
+      final Property property = PsiTreeUtil.getParentOfType(context, Property.class);
+      return property != null && property.isValid();
+    }
+
+    @Override
+    public boolean isSuppressAll() {
+      return false;
+    }
   }
 
-  private static class SuppressForFile extends SuppressIntentionAction {
+
+
+  private static class SuppressForFile implements SuppressQuickFix {
     private final String shortName;
 
     private SuppressForFile(String shortName) {
       this.shortName = shortName;
     }
-
-    @Override
+    @Nls
     @NotNull
-    public String getText() {
-      return PropertiesBundle.message("unused.property.suppress.for.file");
+    @Override
+    public String getName() {
+      return getFamilyName();
     }
 
     @Override
@@ -156,12 +154,8 @@ public abstract class PropertySuppressableInspectionBase extends LocalInspection
     }
 
     @Override
-    public boolean isAvailable(@NotNull final Project project, final Editor editor, @NotNull final PsiElement element) {
-      return element.isValid() && element.getContainingFile() instanceof PropertiesFile;
-    }
-
-    @Override
-    public void invoke(@NotNull final Project project, final Editor editor, @NotNull final PsiElement element) throws IncorrectOperationException {
+    public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
+      final PsiElement element = descriptor.getStartElement();
       final PsiFile file = element.getContainingFile();
       if (!FileModificationService.getInstance().prepareFileForWrite(file)) return;
 
@@ -172,5 +166,20 @@ public abstract class PropertySuppressableInspectionBase extends LocalInspection
                           shortName +
                           "\" for whole file\n");
     }
+
+    @Override
+    public boolean isAvailable(@NotNull Project project, @NotNull PsiElement context) {
+      return context.isValid() && context.getContainingFile() instanceof PropertiesFile;
+    }
+
+    @Override
+    public boolean isSuppressAll() {
+      return false;
+    }
+
+    @Override
+    public boolean startInWriteAction() {
+      return true;
+    }
   }
 }
index 45bb5185328fceaaa85d645434be2b5271cdb801..fe1c9e39473b67967ec29e0a0cad278e580c64cc 100644 (file)
@@ -19,7 +19,7 @@ import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel;
 import com.intellij.lang.ASTNode;
 import com.intellij.lang.properties.IProperty;
 import com.intellij.lang.properties.PropertiesBundle;
-import com.intellij.lang.properties.PropertySuppressableInspectionBase;
+import com.intellij.lang.properties.PropertiesInspectionBase;
 import com.intellij.lang.properties.psi.PropertiesFile;
 import com.intellij.lang.properties.psi.impl.PropertyImpl;
 import com.intellij.openapi.editor.Document;
@@ -43,7 +43,7 @@ import java.util.List;
 /**
  * @author cdr
  */
-public class TrailingSpacesInPropertyInspection extends PropertySuppressableInspectionBase {
+public class TrailingSpacesInPropertyInspection extends PropertiesInspectionBase {
   public boolean myIgnoreVisibleSpaces;
 
   @NotNull
index d842c25561ea7dba09c51f38bcb56675e4643c65..48dfffb9c5db6d1ea342530250fdf5e02040206c 100644 (file)
@@ -17,7 +17,7 @@ package com.intellij.codeInspection;
 
 import com.intellij.codeInsight.intention.HighPriorityAction;
 import com.intellij.lang.properties.PropertiesBundle;
-import com.intellij.lang.properties.PropertySuppressableInspectionBase;
+import com.intellij.lang.properties.PropertiesInspectionBase;
 import com.intellij.lang.properties.psi.codeStyle.PropertiesCodeStyleSettings;
 import com.intellij.lang.properties.psi.impl.PropertiesFileImpl;
 import com.intellij.lang.properties.psi.impl.PropertyImpl;
@@ -30,7 +30,7 @@ import org.jetbrains.annotations.NotNull;
 /**
  * @author Dmitry Batkovich
  */
-public class WrongPropertyKeyValueDelimiterInspection extends PropertySuppressableInspectionBase implements CleanupLocalInspectionTool {
+public class WrongPropertyKeyValueDelimiterInspection extends PropertiesInspectionBase implements CleanupLocalInspectionTool {
 
   @NotNull
   @Override
index 5bc2fac93db9018c2842361b39b57dc8c94bab69..f8bb3d992e311b013ddd6b4e8cff0c3885710363 100644 (file)
@@ -49,7 +49,7 @@ import java.util.function.Function;
 /**
  * @author cdr
  */
-public class UnusedPropertyInspection extends PropertySuppressableInspectionBase implements ResourceBundleEditorInspection {
+public class UnusedPropertyInspection extends PropertiesInspectionBase implements ResourceBundleEditorInspection {
   private static final Logger LOG = Logger.getInstance(UnusedPropertyInspection.class);
 
   @Override
diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertiesInspectionBase.java b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertiesInspectionBase.java
new file mode 100644 (file)
index 0000000..70bf77c
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2000-2015 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.lang.properties;
+
+import com.intellij.codeInspection.LocalInspectionTool;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * User: cdr
+ */
+public abstract class PropertiesInspectionBase extends LocalInspectionTool {
+  @Override
+  @NotNull
+  public String getGroupDisplayName() {
+    return PropertiesBundle.message("properties.files.inspection.group.display.name");
+  }
+}
index e2fda174227bb05b081bbe63471e2d44ef359ab2..2fc00e59a77052f7b8f239a4019e37cd0a9ee948 100644 (file)
     <properties.implicitPropertyUsageProvider implementation="com.intellij.codeInspection.unused.LoggerConfigPropertyUsageProvider"/>
 
     <stripTrailingSpacesFilterFactory implementation="com.intellij.lang.properties.formatting.PropertiesStripTrailingSpacesFilterFactory"/>
+
+    <lang.inspectionSuppressor language="Properties" implementationClass="com.intellij.codeInspection.PropertiesInspectionSuppressor"/>
   </extensions>
 
   <project-components>