From 67edbe515fb84a27e3caaa99f7816ca0fbc97f94 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 16 Dec 2013 18:19:12 +0400 Subject: [PATCH] method may be static: process default methods (IDEA-118272) --- .../com/siyeh/ig/fixes/ChangeModifierFix.java | 12 ++++++++ .../MethodMayBeStaticInspection.java | 28 ++++++++++++++++--- .../performance/method_may_be_static/A.java | 6 ++++ .../method_may_be_static/expected.xml | 6 ++++ .../MethodMayBeStaticInspectionTest.java | 1 + 5 files changed, 49 insertions(+), 4 deletions(-) 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