diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/whileloop/ReplaceDoWhileLoopWithWhileLoopIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/whileloop/ReplaceDoWhileLoopWithWhileLoopIntention.java index 9561be7f8458..050fdcb4d9a2 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/whileloop/ReplaceDoWhileLoopWithWhileLoopIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/whileloop/ReplaceDoWhileLoopWithWhileLoopIntention.java @@ -16,6 +16,7 @@ package com.siyeh.ipp.whileloop; import com.intellij.psi.*; +import com.siyeh.ig.psiutils.BoolUtils; import com.siyeh.ipp.base.Intention; import com.siyeh.ipp.base.PsiElementPredicate; import org.jetbrains.annotations.NonNls; @@ -35,8 +36,18 @@ public class ReplaceDoWhileLoopWithWhileLoopIntention extends Intention { } final PsiStatement body = doWhileStatement.getBody(); final PsiElement parent = doWhileStatement.getParent(); - boolean noBraces = !(parent instanceof PsiCodeBlock); + final PsiExpression condition = doWhileStatement.getCondition(); @NonNls final StringBuilder replacementText = new StringBuilder(); + if (BoolUtils.isTrue(condition)) { + // no trickery needed + replacementText.append("while(").append(condition.getText()).append(')'); + if (body != null) { + replacementText.append(body.getText()); + } + replaceStatement(replacementText.toString(), doWhileStatement); + return; + } + final boolean noBraces = !(parent instanceof PsiCodeBlock); if (noBraces) { final PsiElement[] parentChildren = parent.getChildren(); for (PsiElement child : parentChildren) { @@ -60,7 +71,10 @@ public class ReplaceDoWhileLoopWithWhileLoopIntention extends Intention { for (PsiElement declaredElement : declaredElements) { if (declaredElement instanceof PsiVariable) { final PsiVariable variable = (PsiVariable)declaredElement; - variable.getModifierList().setModifierProperty(PsiModifier.FINAL, false); + final PsiModifierList modifierList = variable.getModifierList(); + if (modifierList != null) { + modifierList.setModifierProperty(PsiModifier.FINAL, false); + } } } } @@ -82,7 +96,6 @@ public class ReplaceDoWhileLoopWithWhileLoopIntention extends Intention { } } replacementText.append("while("); - final PsiExpression condition = doWhileStatement.getCondition(); if (condition != null) { replacementText.append(condition.getText()); } diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable1.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable1.java index 01f24b777014..700fb457ffb0 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable1.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable1.java @@ -5,6 +5,10 @@ class FinalVariable1 { do { final int j = 10; System.out.println(j); - } while (true); + } while (c()); + } + + boolean c() { + return true; } } \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable1_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable1_after.java index 2177673a26da..ac015f0aeed3 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable1_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable1_after.java @@ -4,9 +4,13 @@ class FinalVariable1 { void m() { int j = 10; System.out.println(j); - while (true) { + while (c()) { j = 10; System.out.println(j); } } + + boolean c() { + return true; + } } \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable2.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable2.java index d00a1af82eb0..0cff5bb3a931 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable2.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable2.java @@ -6,6 +6,10 @@ class FinalVariable2 { if (b) do { final int i = 10; System.out.println(i); - } while (true); + } while (c()); + } + + boolean c() { + return true; } } \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable2_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable2_after.java index 57b867d2e5e7..4d19ee3b4277 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable2_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/FinalVariable2_after.java @@ -6,10 +6,14 @@ class FinalVariable2 { if (b) { int i = 10; System.out.println(i); - while (true) { + while (c()) { i = 10; System.out.println(i); } } } + + boolean c() { + return true; + } } \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/InfiniteLoop.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/InfiniteLoop.java new file mode 100644 index 000000000000..0061e9c0d446 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/InfiniteLoop.java @@ -0,0 +1,10 @@ +package com.siyeh.ipp.whileloop.replace_do_while_with_while_loop; + +class InfiniteLoop { + void m() { + do { + int i = 10; + System.out.println(i); + } while ((true)); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/InfiniteLoop_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/InfiniteLoop_after.java new file mode 100644 index 000000000000..e075befb7c68 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/whileloop/replace_do_while_with_while_loop/InfiniteLoop_after.java @@ -0,0 +1,10 @@ +package com.siyeh.ipp.whileloop.replace_do_while_with_while_loop; + +class InfiniteLoop { + void m() { + while ((true)) { + int i = 10; + System.out.println(i); + } + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/whileloop/ReplaceDoWhileWithWhileLoopIntentionTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/whileloop/ReplaceDoWhileWithWhileLoopIntentionTest.java index daa74814338d..1df251c37cc4 100644 --- a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/whileloop/ReplaceDoWhileWithWhileLoopIntentionTest.java +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/whileloop/ReplaceDoWhileWithWhileLoopIntentionTest.java @@ -3,11 +3,15 @@ package com.siyeh.ipp.whileloop; import com.siyeh.IntentionPowerPackBundle; import com.siyeh.ipp.IPPTestCase; +/** + * @see com.siyeh.ipp.whileloop.ReplaceDoWhileLoopWithWhileLoopIntention + */ public class ReplaceDoWhileWithWhileLoopIntentionTest extends IPPTestCase { public void testWithoutBraces() { doTest(); } public void testFinalVariable1() { doTest(); } public void testFinalVariable2() { doTest(); } + public void testInfiniteLoop() { doTest(); } @Override protected String getRelativePath() {