diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/ChangeModifierFix.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/ChangeModifierFix.java
index 2be78a48bca7..8e3bf7974154 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/ChangeModifierFix.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/fixes/ChangeModifierFix.java
@@ -31,9 +31,16 @@ import org.jetbrains.annotations.NotNull;
public class ChangeModifierFix extends InspectionGadgetsFix {
@PsiModifier.ModifierConstant private final String modifierText;
+ private final String[] incompatibleModifiers;
public ChangeModifierFix(@NonNls @PsiModifier.ModifierConstant String modifierText) {
this.modifierText = modifierText;
+ this.incompatibleModifiers = null;
+ }
+
+ public ChangeModifierFix(String modifierText, String... incompatibleModifiers) {
+ this.modifierText = modifierText;
+ this.incompatibleModifiers = incompatibleModifiers;
}
@Override
@@ -63,5 +70,10 @@ public class ChangeModifierFix extends InspectionGadgetsFix {
return;
}
modifiers.setModifierProperty(modifierText, true);
+ if (incompatibleModifiers != null) {
+ for (String modifier : incompatibleModifiers) {
+ modifiers.setModifierProperty(modifier, false);
+ }
+ }
}
}
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/performance/MethodMayBeStaticInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/performance/MethodMayBeStaticInspection.java
index 51c7c511d6c8..ab8934e0cce2 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/performance/MethodMayBeStaticInspection.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/performance/MethodMayBeStaticInspection.java
@@ -18,6 +18,7 @@ package com.siyeh.ig.performance;
import com.intellij.codeInspection.InspectionManager;
import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
import com.intellij.openapi.util.Condition;
+import com.intellij.openapi.util.WriteExternalException;
import com.intellij.psi.*;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
import com.intellij.util.Processor;
@@ -30,6 +31,7 @@ import com.siyeh.ig.fixes.ChangeModifierFix;
import com.siyeh.ig.psiutils.ClassUtils;
import com.siyeh.ig.psiutils.MethodUtils;
import com.siyeh.ig.psiutils.SerializationUtils;
+import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -37,6 +39,9 @@ import java.util.concurrent.atomic.AtomicInteger;
public class MethodMayBeStaticInspection extends BaseInspection {
+ private static final String IGNORE_DEFAULT_METHODS_ATTR_NAME = "m_ignoreDefaultMethods";
+ private static final String ONLY_PRIVATE_OR_FINAL_ATTR_NAME = "m_onlyPrivateOrFinal";
+ private static final String IGNORE_EMPTY_METHODS_ATTR_NAME = "m_ignoreEmptyMethods";
/**
* @noinspection PublicField
*/
@@ -45,6 +50,7 @@ public class MethodMayBeStaticInspection extends BaseInspection {
* @noinspection PublicField
*/
public boolean m_ignoreEmptyMethods = true;
+ public boolean m_ignoreDefaultMethods = true;
@Override
@NotNull
@@ -60,14 +66,15 @@ public class MethodMayBeStaticInspection extends BaseInspection {
@Override
protected InspectionGadgetsFix buildFix(Object... infos) {
- return new ChangeModifierFix(PsiModifier.STATIC);
+ return new ChangeModifierFix(PsiModifier.STATIC, PsiModifier.DEFAULT);
}
@Override
public JComponent createOptionsPanel() {
final MultipleCheckboxOptionsPanel optionsPanel = new MultipleCheckboxOptionsPanel(this);
- optionsPanel.addCheckbox(InspectionGadgetsBundle.message("method.may.be.static.only.option"), "m_onlyPrivateOrFinal");
- optionsPanel.addCheckbox(InspectionGadgetsBundle.message("method.may.be.static.empty.option"), "m_ignoreEmptyMethods");
+ optionsPanel.addCheckbox(InspectionGadgetsBundle.message("method.may.be.static.only.option"), ONLY_PRIVATE_OR_FINAL_ATTR_NAME);
+ optionsPanel.addCheckbox(InspectionGadgetsBundle.message("method.may.be.static.empty.option"), IGNORE_EMPTY_METHODS_ATTR_NAME);
+ optionsPanel.addCheckbox("Ignore default methods", IGNORE_DEFAULT_METHODS_ATTR_NAME);
return optionsPanel;
}
@@ -76,6 +83,16 @@ public class MethodMayBeStaticInspection extends BaseInspection {
return new MethodCanBeStaticVisitor();
}
+ @Override
+ public void writeSettings(@NotNull Element node) throws WriteExternalException {
+ node.addContent(new Element("option").setAttribute("name", ONLY_PRIVATE_OR_FINAL_ATTR_NAME).setAttribute("value", String.valueOf(m_onlyPrivateOrFinal)));
+ node.addContent(new Element("option").setAttribute("name", IGNORE_EMPTY_METHODS_ATTR_NAME).setAttribute("value", String.valueOf(
+ m_ignoreEmptyMethods)));
+ if (!m_ignoreDefaultMethods) {
+ node.addContent(new Element("option").setAttribute("name", IGNORE_DEFAULT_METHODS_ATTR_NAME).setAttribute("value", "false"));
+ }
+ }
+
private class MethodCanBeStaticVisitor extends BaseInspectionVisitor {
@Override
@@ -90,6 +107,9 @@ public class MethodMayBeStaticInspection extends BaseInspection {
if (method.isConstructor() || method.getNameIdentifier() == null) {
return;
}
+ if (m_ignoreDefaultMethods && method.hasModifierProperty(PsiModifier.DEFAULT)) {
+ return;
+ }
if (m_ignoreEmptyMethods && MethodUtils.isEmpty(method)) {
return;
}
@@ -104,7 +124,7 @@ public class MethodMayBeStaticInspection extends BaseInspection {
}
}
final PsiElement scope = containingClass.getScope();
- if (!(scope instanceof PsiJavaFile) && !containingClass.hasModifierProperty(PsiModifier.STATIC)) {
+ if (!(scope instanceof PsiJavaFile) && !containingClass.hasModifierProperty(PsiModifier.STATIC) && !containingClass.isInterface()) {
return;
}
if (m_onlyPrivateOrFinal && !method.hasModifierProperty(PsiModifier.FINAL) && !method.hasModifierProperty(PsiModifier.PRIVATE)) {
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/performance/method_may_be_static/A.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/performance/method_may_be_static/A.java
index 94bb4a36e7d2..d0417da116db 100644
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/performance/method_may_be_static/A.java
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/performance/method_may_be_static/A.java
@@ -36,4 +36,10 @@ class D extends C implements Surprise {
}
interface Surprise {
int getInt();
+}
+
+interface FromJava8 {
+ default void foo() {
+ System.out.println();
+ }
}
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/performance/method_may_be_static/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/performance/method_may_be_static/expected.xml
index bb2af8f97c9c..63fe5d9bb4b5 100644
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/performance/method_may_be_static/expected.xml
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/performance/method_may_be_static/expected.xml
@@ -6,5 +6,11 @@
Method may be 'static'
Method <code>g()</code> may be 'static' #loc
+
+ A.java
+ 42
+ Method may be 'static'
+ Method <code>foo()</code> may be 'static' #loc
+
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/performance/MethodMayBeStaticInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/performance/MethodMayBeStaticInspectionTest.java
index 7cc073820eb9..84cfdd796cff 100644
--- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/performance/MethodMayBeStaticInspectionTest.java
+++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/performance/MethodMayBeStaticInspectionTest.java
@@ -7,6 +7,7 @@ public class MethodMayBeStaticInspectionTest extends IGInspectionTestCase {
public void test() throws Exception {
final MethodMayBeStaticInspection tool = new MethodMayBeStaticInspection();
tool.m_ignoreEmptyMethods = false;
+ tool.m_ignoreDefaultMethods = false;
doTest("com/siyeh/igtest/performance/method_may_be_static", tool);
}
}
\ No newline at end of file