diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/deadCode/UnreferencedFilter.java b/java/java-analysis-impl/src/com/intellij/codeInspection/deadCode/UnreferencedFilter.java index 222e28029d80..4fc78748909f 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/deadCode/UnreferencedFilter.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/deadCode/UnreferencedFilter.java @@ -45,7 +45,7 @@ public class UnreferencedFilter extends RefUnreachableFilter { return -1; } - protected static boolean isExternallyReferenced(RefElement element) { + public static boolean isExternallyReferenced(RefElement element) { return element.getInReferences().stream().anyMatch(reference -> reference instanceof RefFile); } } 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 55e043aad84e..aba4e7253766 100644 --- a/java/java-impl/src/com/intellij/codeInspection/unusedReturnValue/UnusedReturnValue.java +++ b/java/java-impl/src/com/intellij/codeInspection/unusedReturnValue/UnusedReturnValue.java @@ -19,6 +19,7 @@ import com.intellij.analysis.AnalysisScope; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.daemon.GroupNames; import com.intellij.codeInspection.*; +import com.intellij.codeInspection.deadCode.UnreferencedFilter; import com.intellij.codeInspection.reference.*; import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel; import com.intellij.codeInspection.unusedSymbol.VisibilityModifierChooser; @@ -57,25 +58,26 @@ 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; - if (refMethod.isEntry()) return null; - - if (!refMethod.isReturnValueUsed()) { - final PsiMethod psiMethod = (PsiMethod)refMethod.getUastElement().getJavaPsi(); - if (psiMethod == null) return null; - if (IGNORE_BUILDER_PATTERN && PropertyUtilBase.isSimplePropertySetter(psiMethod)) return null; - - final boolean isNative = psiMethod.hasModifierProperty(PsiModifier.NATIVE); - if (refMethod.isExternalOverride() && !isNative) return null; - if (RefUtil.isImplicitRead(psiMethod)) return null; - if (canIgnoreReturnValue(psiMethod)) return null; - return new ProblemDescriptor[]{createProblemDescriptor(psiMethod, manager, processor, isNative, false)}; + if (VisibilityUtil.compare(refMethod.getAccessModifier(), highestModifier) < 0 || + refMethod.isConstructor() || + !refMethod.getSuperMethods().isEmpty() || + refMethod.getInReferences().isEmpty() || + refMethod.isEntry() || + refMethod.isReturnValueUsed() || + UnreferencedFilter.isExternallyReferenced(refMethod)) { + return null; } - } + final PsiMethod psiMethod = (PsiMethod)refMethod.getUastElement().getJavaPsi(); + if (psiMethod == null) return null; + if (IGNORE_BUILDER_PATTERN && PropertyUtilBase.isSimplePropertySetter(psiMethod)) return null; + + final boolean isNative = psiMethod.hasModifierProperty(PsiModifier.NATIVE); + if (refMethod.isExternalOverride() && !isNative) return null; + if (RefUtil.isImplicitRead(psiMethod)) return null; + if (canIgnoreReturnValue(psiMethod)) return null; + return new ProblemDescriptor[]{createProblemDescriptor(psiMethod, manager, processor, isNative, false)}; + } return null; } @@ -106,7 +108,8 @@ public class UnusedReturnValue extends GlobalJavaBatchInspectionTool{ } @Override - protected boolean queryExternalUsagesRequests(@NotNull final RefManager manager, @NotNull final GlobalJavaInspectionContext globalContext, + protected boolean queryExternalUsagesRequests(@NotNull final RefManager manager, + @NotNull final GlobalJavaInspectionContext globalContext, @NotNull final ProblemDescriptionsProcessor processor) { manager.iterate(new RefJavaVisitor() { @Override public void visitElement(@NotNull RefEntity refEntity) { diff --git a/java/java-tests/testData/inspection/unusedReturnValue/usedFromGroovy/expected.xml b/java/java-tests/testData/inspection/unusedReturnValue/usedFromGroovy/expected.xml new file mode 100644 index 000000000000..4704d91e891d --- /dev/null +++ b/java/java-tests/testData/inspection/unusedReturnValue/usedFromGroovy/expected.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/java/java-tests/testData/inspection/unusedReturnValue/usedFromGroovy/src/Test.java b/java/java-tests/testData/inspection/unusedReturnValue/usedFromGroovy/src/Test.java new file mode 100644 index 000000000000..e12bcbec390b --- /dev/null +++ b/java/java-tests/testData/inspection/unusedReturnValue/usedFromGroovy/src/Test.java @@ -0,0 +1,19 @@ +import java.util.Random; + +class JavaClass { + private final Random rnd = new Random(); + + public int getRandom13() { + return rnd.nextInt(13); + } + + public int getRandom42() { + return rnd.nextInt(42); + } +} + +class JavaMain { + public static void main(String[] args) { + System.out.println(new JavaClass().getRandom42()); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/unusedReturnValue/usedFromGroovy/src/Util.groovy b/java/java-tests/testData/inspection/unusedReturnValue/usedFromGroovy/src/Util.groovy new file mode 100644 index 000000000000..05eeb5cfa768 --- /dev/null +++ b/java/java-tests/testData/inspection/unusedReturnValue/usedFromGroovy/src/Util.groovy @@ -0,0 +1,7 @@ +class Util { + + void m() { + new JavaClass().random13 + } + +} \ No newline at end of file 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 f19c57cbf0ba..310468758fa3 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedReturnValueLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedReturnValueLocalTest.java @@ -73,4 +73,8 @@ public class UnusedReturnValueLocalTest extends InspectionTestCase { myGlobal.highestModifier = UnusedReturnValue.DEFAULT_HIGHEST_MODIFIER; } } + + public void testUsedFromGroovy() { + doTest(); + } } 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 b46826cb52ef..c4679b70547b 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedReturnValueTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/UnusedReturnValueTest.java @@ -79,4 +79,8 @@ public class UnusedReturnValueTest extends InspectionTestCase { myTool.highestModifier = UnusedReturnValue.DEFAULT_HIGHEST_MODIFIER; } } + + public void testUsedFromGroovy() { + doTest(); + } } \ No newline at end of file