method may be void: don't warn for implicit reads

This commit is contained in:
Anna.Kozlova
2017-04-11 11:52:20 +02:00
parent c9554bd544
commit ddb4bb31e9
4 changed files with 43 additions and 2 deletions
@@ -21,7 +21,9 @@ import com.intellij.codeInspection.*;
import com.intellij.codeInspection.reference.*;
import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.psi.*;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiReference;
import com.intellij.psi.util.PropertyUtil;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
@@ -55,6 +57,7 @@ public class UnusedReturnValue extends GlobalJavaBatchInspectionTool{
final boolean isNative = psiMethod.hasModifierProperty(PsiModifier.NATIVE);
if (refMethod.isExternalOverride() && !isNative) return null;
if (RefUtil.isImplicitRead(psiMethod)) return null;
return new ProblemDescriptor[]{createProblemDescriptor(psiMethod, manager, processor, isNative)};
}
}
@@ -19,6 +19,7 @@ import com.intellij.codeInsight.daemon.impl.UnusedSymbolUtil;
import com.intellij.codeInspection.BaseJavaLocalInspectionTool;
import com.intellij.codeInspection.InspectionManager;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.codeInspection.reference.RefUtil;
import com.intellij.openapi.progress.EmptyProgressIndicator;
import com.intellij.patterns.PsiJavaPatterns;
import com.intellij.psi.*;
@@ -57,7 +58,8 @@ public class UnusedReturnValueLocalInspection extends BaseJavaLocalInspectionToo
PsiType.VOID.equals(method.getReturnType()) ||
myGlobal.IGNORE_BUILDER_PATTERN && PropertyUtil.isSimplePropertySetter(method) ||
method.hasModifierProperty(PsiModifier.NATIVE) ||
MethodUtils.hasSuper(method)) return null;
MethodUtils.hasSuper(method) ||
RefUtil.isImplicitRead(method)) return null;
final boolean[] atLeastOneUsageExists = new boolean[]{false};
if (UnusedSymbolUtil.processUsages(manager.getProject(), method.getContainingFile(), method, new EmptyProgressIndicator(), null, u -> {
@@ -0,0 +1,9 @@
class Test {
public String <caret>implicitRead() {
return "";
}
{
implicitRead();
}
}
@@ -16,7 +16,12 @@
package com.intellij.codeInspection;
import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.daemon.ImplicitUsageProvider;
import com.intellij.codeInspection.unusedReturnValue.UnusedReturnValue;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
/**
@@ -27,11 +32,33 @@ public class UnusedReturnValueQuickFixTest extends LightCodeInsightFixtureTestCa
@Override
protected void setUp() throws Exception {
super.setUp();
PlatformTestUtil.registerExtension(Extensions.getRootArea(), ImplicitUsageProvider.EP_NAME, new ImplicitUsageProvider() {
@Override
public boolean isImplicitUsage(PsiElement element) {
return false;
}
@Override
public boolean isImplicitRead(PsiElement element) {
return element instanceof PsiMethod && ((PsiMethod)element).getName().equals("implicitRead");
}
@Override
public boolean isImplicitWrite(PsiElement element) {
return false;
}
}, getTestRootDisposable());
myFixture.enableInspections(new UnusedReturnValue());
}
public void testSideEffects() { doTest(); }
public void testRedundantReturn() { doTest(); }
public void testNoChangeForImplicitRead() {
final String name = getTestName(false);
myFixture.configureByFile(name + ".java");
assertEmpty(myFixture.filterAvailableIntentions(InspectionsBundle.message("inspection.unused.return.value.make.void.quickfix")));
}
private void doTest() {
final String name = getTestName(false);