diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/trivialif/ConvertToNestedIfIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/trivialif/ConvertToNestedIfIntention.java index c73febe194fd..aadbef9b2c60 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/trivialif/ConvertToNestedIfIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/trivialif/ConvertToNestedIfIntention.java @@ -62,7 +62,7 @@ public class ConvertToNestedIfIntention extends Intention { if (returnValue == null || ErrorUtil.containsDeepError(returnValue)) { return; } - final String newStatementText = buildIf(returnValue, new StringBuilder()).toString(); + final String newStatementText = buildIf(returnValue, true, new StringBuilder()).toString(); final Project project = returnStatement.getProject(); final PsiElementFactory elementFactory = JavaPsiFacade.getInstance(project).getElementFactory(); final PsiBlockStatement blockStatement = (PsiBlockStatement)elementFactory.createStatementFromText("{" + newStatementText + "}", returnStatement); @@ -73,23 +73,23 @@ public class ConvertToNestedIfIntention extends Intention { PsiReplacementUtil.replaceStatement(returnStatement, "return false;"); } - private static StringBuilder buildIf(@Nullable PsiExpression expression, StringBuilder out) { + private static StringBuilder buildIf(@Nullable PsiExpression expression, boolean top, StringBuilder out) { if (expression instanceof PsiPolyadicExpression) { final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression; final PsiExpression[] operands = polyadicExpression.getOperands(); final IElementType tokenType = polyadicExpression.getOperationTokenType(); if (JavaTokenType.ANDAND.equals(tokenType)) { for (PsiExpression operand : operands) { - buildIf(operand, out); + buildIf(operand, false, out); } - if (!StringUtil.endsWith(out, "return true;")) { + if (top && !StringUtil.endsWith(out, "return true;")) { out.append("return true;"); } return out; } - else if (JavaTokenType.OROR.equals(tokenType)) { + else if (top && JavaTokenType.OROR.equals(tokenType)) { for (PsiExpression operand : operands) { - buildIf(operand, out); + buildIf(operand, false, out); if (!StringUtil.endsWith(out, "return true;")) { out.append("return true;"); } @@ -99,7 +99,7 @@ public class ConvertToNestedIfIntention extends Intention { } else if (expression instanceof PsiParenthesizedExpression) { final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)expression; - buildIf(parenthesizedExpression.getExpression(), out); + buildIf(parenthesizedExpression.getExpression(), top, out); return out; } if (expression != null) { diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/OrStaircaseInside.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/OrStaircaseInside.java new file mode 100644 index 000000000000..521db40592e9 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/OrStaircaseInside.java @@ -0,0 +1,7 @@ +package com.siyeh.ipp.trivialif.convert_to_nested_if; + +public class X { + boolean f(boolean a, boolean b, boolean c, boolean d) { + return a || (b && c) || d; + } +} diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/OrStaircaseInside_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/OrStaircaseInside_after.java new file mode 100644 index 000000000000..0f3ea890809f --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/OrStaircaseInside_after.java @@ -0,0 +1,10 @@ +package com.siyeh.ipp.trivialif.convert_to_nested_if; + +public class X { + boolean f(boolean a, boolean b, boolean c, boolean d) { + if (a) return true; + if (b) if (c) return true; + if (d) return true; + return false; + } +} diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/StaircaseWithOrInside.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/StaircaseWithOrInside.java new file mode 100644 index 000000000000..81b9b0f86333 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/StaircaseWithOrInside.java @@ -0,0 +1,7 @@ +package com.siyeh.ipp.trivialif.convert_to_nested_if; + +public class X { + boolean f(boolean a, boolean b, boolean c, boolean d) { + return a && (b || c) && d; + } +} diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/StaircaseWithOrInside_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/StaircaseWithOrInside_after.java new file mode 100644 index 000000000000..768a17905219 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/StaircaseWithOrInside_after.java @@ -0,0 +1,8 @@ +package com.siyeh.ipp.trivialif.convert_to_nested_if; + +public class X { + boolean f(boolean a, boolean b, boolean c, boolean d) { + if (a) if (b || c) if (d) return true; + return false; + } +} diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/StaircaseWithParenthesis.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/StaircaseWithParenthesis.java new file mode 100644 index 000000000000..71c207f828b2 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/StaircaseWithParenthesis.java @@ -0,0 +1,19 @@ +package com.siyeh.ipp.trivialif.convert_to_nested_if; + +public class X { + public static boolean foo(double a, double b, double c) + { + // the following return statement is converted by "Convert to multiple 'ifs'" (on the second &&) to the below, incorrect if-then-else + return (a > c && a < b) && !bar1(a) && !bar2(a); + } + + private static boolean bar1(double a) + { + return true; + } + + private static boolean bar2(double a) + { + return true; + } +} diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/StaircaseWithParenthesis_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/StaircaseWithParenthesis_after.java new file mode 100644 index 000000000000..e17ed504d460 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/convert_to_nested_if/StaircaseWithParenthesis_after.java @@ -0,0 +1,20 @@ +package com.siyeh.ipp.trivialif.convert_to_nested_if; + +public class X { + public static boolean foo(double a, double b, double c) + { + // the following return statement is converted by "Convert to multiple 'ifs'" (on the second &&) to the below, incorrect if-then-else + if (a > c) if (a < b) if (!bar1(a)) if (!bar2(a)) return true; + return false; + } + + private static boolean bar1(double a) + { + return true; + } + + private static boolean bar2(double a) + { + return true; + } +} diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/trivialif/ConvertToNestedIfIntentionTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/trivialif/ConvertToNestedIfIntentionTest.java index 84b140376ff4..1515c61030f3 100644 --- a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/trivialif/ConvertToNestedIfIntentionTest.java +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/trivialif/ConvertToNestedIfIntentionTest.java @@ -22,6 +22,9 @@ public class ConvertToNestedIfIntentionTest extends IPPTestCase { public void testNested() { doTest(); } public void testStaircase() { doTest(); } + public void testStaircaseWithParenthesis() { doTest(); } + public void testStaircaseWithOrInside() { doTest(); } + public void testOrStaircaseInside() { doTest(); } public void testOneLevelStaircase() { assertIntentionNotAvailable(); } public void testAndOrMixed() { doTest(); }