diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/conditional/ReplaceConditionalWithIfIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/conditional/ReplaceConditionalWithIfIntention.java index ccdc0c3ee621..6d22d8e12eeb 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/conditional/ReplaceConditionalWithIfIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/conditional/ReplaceConditionalWithIfIntention.java @@ -15,11 +15,14 @@ */ package com.siyeh.ipp.conditional; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.refactoring.util.RefactoringUtil; +import com.intellij.util.ArrayUtilRt; import com.intellij.util.IncorrectOperationException; import com.siyeh.ig.psiutils.ParenthesesUtils; import com.siyeh.ipp.base.Intention; @@ -29,6 +32,8 @@ import org.jetbrains.annotations.Nullable; public class ReplaceConditionalWithIfIntention extends Intention { + private static final Logger LOG = Logger.getInstance("#" + ReplaceConditionalWithIfIntention.class.getName()); + @Override @NotNull public PsiElementPredicate getElementPredicate() { @@ -53,8 +58,8 @@ public class ReplaceConditionalWithIfIntention extends Intention { else { variable = null; } - final PsiExpression thenExpression = expression.getThenExpression(); - final PsiExpression elseExpression = expression.getElseExpression(); + PsiExpression thenExpression = expression.getThenExpression(); + PsiExpression elseExpression = expression.getElseExpression(); final PsiExpression condition = expression.getCondition(); final PsiExpression strippedCondition = ParenthesesUtils.stripParentheses(condition); final StringBuilder newStatement = new StringBuilder(); @@ -67,10 +72,21 @@ public class ReplaceConditionalWithIfIntention extends Intention { final String name = variable.getName(); newStatement.append(name); newStatement.append('='); - final PsiExpression initializer = variable.getInitializer(); + PsiExpression initializer = variable.getInitializer(); if (initializer == null) { return; } + if (initializer instanceof PsiArrayInitializerExpression) { + final int conditionIdx = ArrayUtilRt.find(((PsiArrayInitializerExpression)initializer).getInitializers(), expression); + if (conditionIdx >= 0) { + initializer = (PsiExpression)initializer.replace(RefactoringUtil.convertInitializerToNormalExpression(initializer, variable.getType())); + final PsiArrayInitializerExpression arrayInitializer = ((PsiNewExpression)initializer).getArrayInitializer(); + LOG.assertTrue(arrayInitializer != null, initializer.getText()); + expression = (PsiConditionalExpression)arrayInitializer.getInitializers()[conditionIdx]; + thenExpression = expression.getThenExpression(); + elseExpression = expression.getElseExpression(); + } + } appendElementTextWithoutParentheses(initializer, expression, thenExpression, newStatement); newStatement.append("; else "); newStatement.append(name); diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/conditional/withIf/ArrayInitializer.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/conditional/withIf/ArrayInitializer.java new file mode 100644 index 000000000000..68f0375e149c --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/conditional/withIf/ArrayInitializer.java @@ -0,0 +1,5 @@ +class Test { + void f(boolean b){ + String [] s = {b ? "a" : "c"}; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/conditional/withIf/ArrayInitializer_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/conditional/withIf/ArrayInitializer_after.java new file mode 100644 index 000000000000..022085f0a048 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/conditional/withIf/ArrayInitializer_after.java @@ -0,0 +1,7 @@ +class Test { + void f(boolean b){ + String [] s; + if (b) s = new String[]{"a"}; + else s = new String[]{"c"}; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/conditional/ReplaceConditionalWithIfTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/conditional/ReplaceConditionalWithIfTest.java index f2e32bb56f59..8ba24fdec63d 100644 --- a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/conditional/ReplaceConditionalWithIfTest.java +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/conditional/ReplaceConditionalWithIfTest.java @@ -28,6 +28,7 @@ public class ReplaceConditionalWithIfTest extends IPPTestCase { public void testParentheses() { doTest(); } public void testConditionalInIf() { doTest(); } public void testConditionalInBinaryExpression() { doTest(); } + public void testArrayInitializer() { doTest(); } @Override protected String getIntentionName() {