diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/SimplifyBooleanExpressionFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/SimplifyBooleanExpressionFix.java index 573bebfe375d..f1913aa85275 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/SimplifyBooleanExpressionFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/SimplifyBooleanExpressionFix.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.daemon.impl.quickfix; import com.intellij.codeInsight.daemon.QuickFixBundle; +import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil; import com.intellij.codeInspection.LocalQuickFixOnPsiElement; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; @@ -24,6 +25,8 @@ import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.controlFlow.AnalysisCanceledException; +import com.intellij.psi.controlFlow.ControlFlowUtil; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; @@ -32,8 +35,10 @@ import com.siyeh.ig.psiutils.DeclarationSearchUtils; import com.siyeh.ig.psiutils.ParenthesesUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement { @@ -118,13 +123,18 @@ public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement { return true; } - private static void replaceWithStatements(final PsiIfStatement orig, final PsiStatement statement) throws IncorrectOperationException { + private static void replaceWithStatements(@NotNull PsiIfStatement orig, @Nullable PsiStatement statement) throws IncorrectOperationException { if (statement == null) { orig.delete(); return; } PsiElement parent = orig.getParent(); if (parent == null) return; + + if (parent instanceof PsiCodeBlock && blockAlwaysReturns(statement)) { + removeFollowingStatements(orig, (PsiCodeBlock)parent); + } + if (statement instanceof PsiBlockStatement && parent instanceof PsiCodeBlock && !DeclarationSearchUtils.containsConflictingDeclarations(((PsiBlockStatement)statement).getCodeBlock(), (PsiCodeBlock)parent)) { // See IDEADEV-24277 @@ -153,6 +163,23 @@ public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement { } } + private static boolean blockAlwaysReturns(@NotNull PsiStatement statement) { + try { + return ControlFlowUtil.returnPresent(HighlightControlFlowUtil.getControlFlowNoConstantEvaluate(statement)); + } + catch (AnalysisCanceledException e) { + return false; + } + } + + private static void removeFollowingStatements(@NotNull PsiIfStatement anchor, @NotNull PsiCodeBlock parentBlock) { + PsiStatement[] siblingStatements = parentBlock.getStatements(); + int ifIndex = Arrays.asList(siblingStatements).indexOf(anchor); + if (ifIndex >= 0 && ifIndex < siblingStatements.length - 1) { + parentBlock.deleteChildRange(siblingStatements[ifIndex + 1], siblingStatements[siblingStatements.length - 1]); + } + } + public static void simplifyExpression(PsiExpression expression) throws IncorrectOperationException { final PsiExpression[] result = {(PsiExpression)expression.copy()}; final ExpressionVisitor expressionVisitor = new ExpressionVisitor(expression.getManager(), true); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterUnreachableElse.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterUnreachableElse.java new file mode 100644 index 000000000000..19013534d407 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterUnreachableElse.java @@ -0,0 +1,8 @@ +// "Unwrap 'if' statement" "true" +class X { + private final boolean field = true; + + String m() { + return "one"; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforeUnreachableElse.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforeUnreachableElse.java new file mode 100644 index 000000000000..24f2a8b27728 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforeUnreachableElse.java @@ -0,0 +1,9 @@ +// "Unwrap 'if' statement" "true" +class X { + private final boolean field = true; + + String m() { + if (field) return "one"; + return "two"; + } +} \ No newline at end of file