From dc7d4a92f49b93b8b215285e5e10e0a3e079c94b Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Tue, 10 Jan 2017 18:33:33 +0300 Subject: [PATCH] improve unused return value quickfix (use SideEffectChecker and UnnecessaryReturnInspection) IDEA-166180 --- .../unusedReturnValue/UnusedReturnValue.java | 53 ++++++------------- 1 file changed, 16 insertions(+), 37 deletions(-) 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 57905cc9b3bc..5f829bb00ca0 100644 --- a/java/java-impl/src/com/intellij/codeInspection/unusedReturnValue/UnusedReturnValue.java +++ b/java/java-impl/src/com/intellij/codeInspection/unusedReturnValue/UnusedReturnValue.java @@ -28,16 +28,17 @@ import com.intellij.psi.*; import com.intellij.psi.search.searches.OverridingMethodsSearch; import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.changeSignature.ChangeSignatureProcessor; import com.intellij.refactoring.changeSignature.ParameterInfoImpl; import com.intellij.util.IncorrectOperationException; +import com.siyeh.ig.controlflow.UnnecessaryReturnInspection; +import com.siyeh.ig.psiutils.SideEffectChecker; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.ArrayList; -import java.util.List; /** * @author max @@ -207,43 +208,21 @@ public class UnusedReturnValue extends GlobalJavaBatchInspectionTool{ } private static void replaceReturnStatements(@NotNull final PsiMethod method) { - final PsiCodeBlock body = method.getBody(); - if (body != null) { - final List returnStatements = new ArrayList<>(); - body.accept(new JavaRecursiveElementWalkingVisitor() { - @Override - public void visitReturnStatement(final PsiReturnStatement statement) { - super.visitReturnStatement(statement); - returnStatements.add(statement); - } - - @Override - public void visitClass(PsiClass aClass) {} - - @Override - public void visitLambdaExpression(PsiLambdaExpression expression) {} - }); - final PsiStatement[] psiStatements = body.getStatements(); - final PsiStatement lastStatement = psiStatements[psiStatements.length - 1]; - for (PsiReturnStatement returnStatement : returnStatements) { - try { - final PsiExpression expression = returnStatement.getReturnValue(); - if (expression instanceof PsiLiteralExpression || expression instanceof PsiThisExpression) { //avoid side effects - WriteAction.run(() -> { - if (returnStatement == lastStatement) { - returnStatement.delete(); - } - else { - returnStatement - .replace(JavaPsiFacade.getInstance(method.getProject()).getElementFactory().createStatementFromText("return;", returnStatement)); - } - }); - } - } - catch (IncorrectOperationException e) { - LOG.error(e); + for (PsiReturnStatement returnStatement : PsiUtil.findReturnStatements(method)) { + try { + final PsiExpression expression = returnStatement.getReturnValue(); + if (expression != null && !SideEffectChecker.mayHaveSideEffects(expression)) { + WriteAction.run(() -> { + PsiReturnStatement ret = (PsiReturnStatement)returnStatement.replace(JavaPsiFacade.getInstance(method.getProject()).getElementFactory().createStatementFromText("return;", returnStatement)); + if (UnnecessaryReturnInspection.isReturnRedundant(ret, false, null)) { + ret.delete(); + } + }); } } + catch (IncorrectOperationException e) { + LOG.error(e); + } } } }