From 1b33b6b6211b1c14ea12eeacac53d9db909ff1cb Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 May 2013 17:46:02 +0200 Subject: [PATCH] invert if: do not forget continue; if if is not the "last statement" (IDEA-19457) --- .../impl/InvertIfConditionAction.java | 16 ++++++++++++++- .../invertIfCondition/afterContinue3.java | 20 +++++++++++++++++++ .../invertIfCondition/afterContinue4.java | 16 +++++++++++++++ .../invertIfCondition/beforeContinue3.java | 18 +++++++++++++++++ .../invertIfCondition/beforeContinue4.java | 15 ++++++++++++++ 5 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/invertIfCondition/afterContinue3.java create mode 100644 java/java-tests/testData/codeInsight/invertIfCondition/afterContinue4.java create mode 100644 java/java-tests/testData/codeInsight/invertIfCondition/beforeContinue3.java create mode 100644 java/java-tests/testData/codeInsight/invertIfCondition/beforeContinue4.java diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/InvertIfConditionAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/InvertIfConditionAction.java index 2deccb037d09..9815601a16c9 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/InvertIfConditionAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/InvertIfConditionAction.java @@ -36,6 +36,7 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.controlFlow.*; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.ArrayUtilRt; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; @@ -304,8 +305,21 @@ public class InvertIfConditionAction extends PsiElementBaseIntentionAction { codeStyle.reformat(statement); } - private static void setElseBranch(PsiIfStatement ifStatement, PsiStatement thenBranch, ControlFlow flow) throws IncorrectOperationException { + private static void setElseBranch(PsiIfStatement ifStatement, PsiStatement thenBranch, ControlFlow flow) + throws IncorrectOperationException { if (flow.getEndOffset(ifStatement) == flow.getEndOffset(thenBranch)) { + final PsiLoopStatement loopStmt = PsiTreeUtil.getParentOfType(ifStatement, PsiLoopStatement.class); + if (loopStmt != null) { + final PsiStatement body = loopStmt.getBody(); + if (body instanceof PsiBlockStatement) { + final PsiStatement[] statements = ((PsiBlockStatement)body).getCodeBlock().getStatements(); + if (statements.length > 0 && !PsiTreeUtil.isAncestor(statements[statements.length - 1], ifStatement, false) && + ArrayUtilRt.find(statements, ifStatement) < 0) { + ifStatement.setElseBranch(thenBranch); + return; + } + } + } if (thenBranch instanceof PsiContinueStatement) { PsiStatement elseBranch = ifStatement.getElseBranch(); if (elseBranch != null) { diff --git a/java/java-tests/testData/codeInsight/invertIfCondition/afterContinue3.java b/java/java-tests/testData/codeInsight/invertIfCondition/afterContinue3.java new file mode 100644 index 000000000000..be835ee8b2a8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/invertIfCondition/afterContinue3.java @@ -0,0 +1,20 @@ +// "Invert If Condition" "true" +class B { + public static void foo() { + for (int i = 0; i < 10; i++) { + if (i % 2 == 0) { + if (i != 0) { + + System.out.println("!= 0"); + continue; + } + else { + System.out.println("== 0"); + continue; + } + } + + System.out.println("i = " + i); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/invertIfCondition/afterContinue4.java b/java/java-tests/testData/codeInsight/invertIfCondition/afterContinue4.java new file mode 100644 index 000000000000..461672c90383 --- /dev/null +++ b/java/java-tests/testData/codeInsight/invertIfCondition/afterContinue4.java @@ -0,0 +1,16 @@ +// "Invert If Condition" "true" +class B { + public static void foo() { + for (int i = 0; i < 10; i++) { + if (i % 2 == 0) { + if (i != 0) { + + System.out.println("!= 0"); + } + else { + System.out.println("== 0"); + } + } + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/invertIfCondition/beforeContinue3.java b/java/java-tests/testData/codeInsight/invertIfCondition/beforeContinue3.java new file mode 100644 index 000000000000..339b3de105ae --- /dev/null +++ b/java/java-tests/testData/codeInsight/invertIfCondition/beforeContinue3.java @@ -0,0 +1,18 @@ +// "Invert If Condition" "true" +class B { + public static void foo() { + for (int i = 0; i < 10; i++) { + if (i % 2 == 0) { + if (i == 0) { + System.out.println("== 0"); + continue; + } + + System.out.println("!= 0"); + continue; + } + + System.out.println("i = " + i); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/invertIfCondition/beforeContinue4.java b/java/java-tests/testData/codeInsight/invertIfCondition/beforeContinue4.java new file mode 100644 index 000000000000..d2c904a6b372 --- /dev/null +++ b/java/java-tests/testData/codeInsight/invertIfCondition/beforeContinue4.java @@ -0,0 +1,15 @@ +// "Invert If Condition" "true" +class B { + public static void foo() { + for (int i = 0; i < 10; i++) { + if (i % 2 == 0) { + if (i == 0) { + System.out.println("== 0"); + continue; + } + + System.out.println("!= 0"); + } + } + } +} \ No newline at end of file