From 365d521519a88f2192c62376ae454380fd786b4e Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 7 Jul 2017 17:50:27 +0200 Subject: [PATCH] IDEA-175018 Unwrap if produces red code --- .../quickfix/SimplifyBooleanExpressionFix.java | 10 +++++++++- .../unwrapIfStatement/afterAlwaysReturning.java | 14 ++++++++++++++ .../unwrapIfStatement/beforeAlwaysReturning.java | 15 +++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterAlwaysReturning.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforeAlwaysReturning.java 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 8a8dfdc0a12a..68865e05fd31 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 @@ -189,9 +189,16 @@ public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement { PsiElement parent = orig.getParent(); if (parent == null) return; + PsiElement grandParent = parent.getParent(); if (parent instanceof PsiCodeBlock && blockAlwaysReturns(statement)) { removeFollowingStatements(orig, (PsiCodeBlock)parent); } + else if (grandParent instanceof PsiCodeBlock && parent instanceof PsiIfStatement) { + PsiIfStatement ifStmt = (PsiIfStatement)parent; + if (ifStmt.getElseBranch() == orig && blockAlwaysReturns(ifStmt.getThenBranch()) && blockAlwaysReturns(statement)) { + removeFollowingStatements(ifStmt, (PsiCodeBlock)grandParent); + } + } if (parent instanceof PsiCodeBlock) { if (statement instanceof PsiBlockStatement && @@ -246,7 +253,8 @@ public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement { orig.delete(); } - private static boolean blockAlwaysReturns(@NotNull PsiStatement statement) { + private static boolean blockAlwaysReturns(@Nullable PsiStatement statement) { + if (statement == null) return false; try { return ControlFlowUtil.returnPresent(HighlightControlFlowUtil.getControlFlowNoConstantEvaluate(statement)); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterAlwaysReturning.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterAlwaysReturning.java new file mode 100644 index 000000000000..cb4efd0745d5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/afterAlwaysReturning.java @@ -0,0 +1,14 @@ +// "Unwrap 'if' statement" "true" +class X { + boolean f(int[] a) { + if (a.length == 0) return false; + if (a.length == 1) { + System.out.println(); + return true; + } + else { + System.out.println("2"); + return true; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforeAlwaysReturning.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforeAlwaysReturning.java new file mode 100644 index 000000000000..d286fb6e2be3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unwrapIfStatement/beforeAlwaysReturning.java @@ -0,0 +1,15 @@ +// "Unwrap 'if' statement" "true" +class X { + boolean f(int[] a) { + if (a.length == 0) return false; + if (a.length == 1) { + System.out.println(); + return true; + } + else if (a.length > 1) { + System.out.println("2"); + return true; + } + return false; + } +} \ No newline at end of file