unused return value: add visibility modifier option

This commit is contained in:
Dmitry Batkovich
2018-09-05 17:08:50 +03:00
parent 15ee576bab
commit d2013dbc4f
6 changed files with 73 additions and 2 deletions
@@ -20,17 +20,22 @@ import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.codeInsight.daemon.GroupNames;
import com.intellij.codeInspection.*;
import com.intellij.codeInspection.reference.*;
import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel;
import com.intellij.codeInspection.unusedSymbol.VisibilityModifierChooser;
import com.intellij.openapi.ui.LabeledComponent;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiReference;
import com.intellij.psi.util.PropertyUtilBase;
import com.intellij.util.VisibilityUtil;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.Collections;
/**
@@ -38,6 +43,10 @@ import java.util.Collections;
*/
public class UnusedReturnValue extends GlobalJavaBatchInspectionTool{
public boolean IGNORE_BUILDER_PATTERN;
@PsiModifier.ModifierConstant
public static final String DEFAULT_HIGHEST_MODIFIER = PsiModifier.PUBLIC;
@PsiModifier.ModifierConstant
public String highestModifier = DEFAULT_HIGHEST_MODIFIER;
@Override
@Nullable
@@ -49,6 +58,7 @@ public class UnusedReturnValue extends GlobalJavaBatchInspectionTool{
if (refEntity instanceof RefMethod) {
final RefMethod refMethod = (RefMethod)refEntity;
if (VisibilityUtil.compare(refMethod.getAccessModifier(), highestModifier) < 0) return null;
if (refMethod.isConstructor()) return null;
if (!refMethod.getSuperMethods().isEmpty()) return null;
if (refMethod.getInReferences().size() == 0) return null;
@@ -78,14 +88,22 @@ public class UnusedReturnValue extends GlobalJavaBatchInspectionTool{
@Override
public void writeSettings(@NotNull Element node) throws WriteExternalException {
if (IGNORE_BUILDER_PATTERN) {
if (IGNORE_BUILDER_PATTERN || highestModifier != DEFAULT_HIGHEST_MODIFIER) {
super.writeSettings(node);
}
}
@Override
public JComponent createOptionsPanel() {
return new SingleCheckboxOptionsPanel("Ignore simple setters", this, "IGNORE_BUILDER_PATTERN");
MultipleCheckboxOptionsPanel panel = new MultipleCheckboxOptionsPanel(this);
panel.addCheckbox("Ignore simple setters", "IGNORE_BUILDER_PATTERN");
LabeledComponent<VisibilityModifierChooser> component = LabeledComponent.create(new VisibilityModifierChooser(() -> true,
highestModifier,
(newModifier) -> highestModifier = newModifier),
"Maximal reported method visibility:",
BorderLayout.WEST);
panel.addComponent(component);
return panel;
}
@Override
@@ -10,6 +10,7 @@ import com.intellij.codeInspection.reference.RefUtil;
import com.intellij.openapi.progress.EmptyProgressIndicator;
import com.intellij.psi.*;
import com.intellij.psi.util.PropertyUtilBase;
import com.intellij.util.VisibilityUtil;
import com.siyeh.ig.psiutils.ExpressionUtils;
import com.siyeh.ig.psiutils.MethodUtils;
import org.jetbrains.annotations.NotNull;
@@ -48,6 +49,7 @@ public class UnusedReturnValueLocalInspection extends AbstractBaseJavaLocalInspe
public ProblemDescriptor[] checkMethod(@NotNull PsiMethod method, @NotNull InspectionManager manager, boolean isOnTheFly) {
if (method.isConstructor() ||
PsiType.VOID.equals(method.getReturnType()) ||
VisibilityUtil.compare(VisibilityUtil.getVisibilityModifier(method.getModifierList()), myGlobal.highestModifier) < 0 ||
myGlobal.IGNORE_BUILDER_PATTERN && PropertyUtilBase.isSimplePropertySetter(method) ||
method.hasModifierProperty(PsiModifier.NATIVE) ||
MethodUtils.hasSuper(method) ||
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<problem>
<problem>
<file>Test.java</file>
<line>17</line>
<problem_class>Method can be void</problem_class>
<description>Return value of the method is never used</description>
</problem>
</problem>
@@ -0,0 +1,20 @@
public class Test {
public static void main(String[] args) {
fooBarPublic(239);
fooBarPublic(239);
fooBarPublic(239);
fooBarPrivate(100);
fooBarPrivate(100);
fooBarPrivate(100);
}
public static int fooBarPublic(int val) {
return 239;
}
private static int fooBarPrivate(int val) {
return 239;
}
}
@@ -18,6 +18,7 @@ package com.intellij.java.codeInspection;
import com.intellij.JavaTestUtil;
import com.intellij.codeInspection.unusedReturnValue.UnusedReturnValue;
import com.intellij.codeInspection.unusedReturnValue.UnusedReturnValueLocalInspection;
import com.intellij.psi.PsiModifier;
import com.intellij.testFramework.InspectionTestCase;
public class UnusedReturnValueLocalTest extends InspectionTestCase {
@@ -62,4 +63,14 @@ public class UnusedReturnValueLocalTest extends InspectionTestCase {
myGlobal.IGNORE_BUILDER_PATTERN = false;
}
}
public void testVisibilitySetting() {
try {
myGlobal.highestModifier = PsiModifier.PRIVATE;
doTest();
}
finally {
myGlobal.highestModifier = UnusedReturnValue.DEFAULT_HIGHEST_MODIFIER;
}
}
}
@@ -18,6 +18,7 @@ package com.intellij.java.codeInspection;
import com.intellij.JavaTestUtil;
import com.intellij.codeInspection.unusedReturnValue.UnusedReturnValue;
import com.intellij.psi.PsiModifier;
import com.intellij.testFramework.InspectionTestCase;
public class UnusedReturnValueTest extends InspectionTestCase {
@@ -68,4 +69,14 @@ public class UnusedReturnValueTest extends InspectionTestCase {
myTool.IGNORE_BUILDER_PATTERN = false;
}
}
public void testVisibilitySetting() {
try {
myTool.highestModifier = PsiModifier.PRIVATE;
doTest();
}
finally {
myTool.highestModifier = UnusedReturnValue.DEFAULT_HIGHEST_MODIFIER;
}
}
}