diff --git a/java/java-impl/src/com/intellij/codeInspection/unusedReturnValue/UnusedReturnValue.java b/java/java-impl/src/com/intellij/codeInspection/unusedReturnValue/UnusedReturnValue.java index 9036f1a56aed..196c9746cf33 100644 --- a/java/java-impl/src/com/intellij/codeInspection/unusedReturnValue/UnusedReturnValue.java +++ b/java/java-impl/src/com/intellij/codeInspection/unusedReturnValue/UnusedReturnValue.java @@ -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 component = LabeledComponent.create(new VisibilityModifierChooser(() -> true, + highestModifier, + (newModifier) -> highestModifier = newModifier), + "Maximal reported method visibility:", + BorderLayout.WEST); + panel.addComponent(component); + return panel; } @Override diff --git a/java/java-impl/src/com/intellij/codeInspection/unusedReturnValue/UnusedReturnValueLocalInspection.java b/java/java-impl/src/com/intellij/codeInspection/unusedReturnValue/UnusedReturnValueLocalInspection.java index 5d828942ec14..3960180cd09a 100644 --- a/java/java-impl/src/com/intellij/codeInspection/unusedReturnValue/UnusedReturnValueLocalInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/unusedReturnValue/UnusedReturnValueLocalInspection.java @@ -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) || diff --git a/java/java-tests/testData/inspection/unusedReturnValue/visibilitySetting/expected.xml b/java/java-tests/testData/inspection/unusedReturnValue/visibilitySetting/expected.xml new file mode 100644 index 000000000000..040c5b85970a --- /dev/null +++ b/java/java-tests/testData/inspection/unusedReturnValue/visibilitySetting/expected.xml @@ -0,0 +1,9 @@ + + + + Test.java + 17 + Method can be void + Return value of the method is never used + + \ No newline at end of file diff --git a/java/java-tests/testData/inspection/unusedReturnValue/visibilitySetting/src/Test.java b/java/java-tests/testData/inspection/unusedReturnValue/visibilitySetting/src/Test.java new file mode 100644 index 000000000000..3ff06bb592dd --- /dev/null +++ b/java/java-tests/testData/inspection/unusedReturnValue/visibilitySetting/src/Test.java @@ -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; + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedReturnValueLocalTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedReturnValueLocalTest.java index 97911e100798..f19c57cbf0ba 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedReturnValueLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedReturnValueLocalTest.java @@ -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; + } + } } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedReturnValueTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedReturnValueTest.java index a85852386e25..b46826cb52ef 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedReturnValueTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedReturnValueTest.java @@ -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; + } + } } \ No newline at end of file