diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/trivialif/ReplaceIfWithConditionalIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/trivialif/ReplaceIfWithConditionalIntention.java index dd2c81ff9031..bf575bf3be9d 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/trivialif/ReplaceIfWithConditionalIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/trivialif/ReplaceIfWithConditionalIntention.java @@ -20,6 +20,7 @@ import com.intellij.psi.impl.PsiDiamondTypeUtil; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiTypesUtil; import com.siyeh.ig.PsiReplacementUtil; +import com.siyeh.ig.psiutils.CommentTracker; import com.siyeh.ig.psiutils.ControlFlowUtils; import com.siyeh.ig.psiutils.EquivalenceChecker; import com.siyeh.ig.psiutils.ParenthesesUtils; @@ -29,8 +30,6 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collection; - public class ReplaceIfWithConditionalIntention extends Intention { @Override @@ -51,15 +50,14 @@ public class ReplaceIfWithConditionalIntention extends Intention { return; } final PsiStatement thenBranch = ifStatement.getThenBranch(); - final PsiExpressionStatement strippedThenBranch = (PsiExpressionStatement)ControlFlowUtils - .stripBraces(thenBranch); + final PsiExpressionStatement strippedThenBranch = (PsiExpressionStatement)ControlFlowUtils.stripBraces(thenBranch); final PsiStatement elseBranch = ifStatement.getElseBranch(); - final PsiExpressionStatement strippedElseBranch = (PsiExpressionStatement)ControlFlowUtils - .stripBraces(elseBranch); + final PsiExpressionStatement strippedElseBranch = (PsiExpressionStatement)ControlFlowUtils.stripBraces(elseBranch); final PsiAssignmentExpression thenAssign = (PsiAssignmentExpression)strippedThenBranch.getExpression(); final PsiAssignmentExpression elseAssign = (PsiAssignmentExpression)strippedElseBranch.getExpression(); + CommentTracker commentTracker = new CommentTracker(); final PsiExpression lhs = thenAssign.getLExpression(); - final String lhsText = lhs.getText(); + final String lhsText = commentTracker.markUnchanged(lhs).getText(); final PsiJavaToken sign = thenAssign.getOperationSign(); final String operator = sign.getText(); final PsiExpression thenRhs = thenAssign.getRExpression(); @@ -70,8 +68,8 @@ public class ReplaceIfWithConditionalIntention extends Intention { if (elseRhs == null) { return; } - final String conditional = getConditionalText(condition, thenRhs, elseRhs, thenAssign.getType()); - replaceIfStatement(ifStatement, lhsText + operator + conditional + ';'); + final String conditional = getConditionalText(condition, thenRhs, elseRhs, thenAssign.getType(), commentTracker); + PsiReplacementUtil.replaceStatement(ifStatement, lhsText + operator + conditional + ';', commentTracker); } else if (ReplaceIfWithConditionalPredicate.isReplaceableReturn(ifStatement)) { final PsiExpression condition = ifStatement.getCondition(); @@ -90,24 +88,24 @@ public class ReplaceIfWithConditionalIntention extends Intention { if (elseReturnValue == null) { return; } - final String conditional = getConditional(condition, thenReturn, thenReturnValue, elseReturnValue); + CommentTracker commentTracker = new CommentTracker(); + final String conditional = getConditional(condition, thenReturn, thenReturnValue, elseReturnValue, commentTracker); if (conditional == null) { return; } - replaceIfStatement(ifStatement, "return " + conditional + ';'); + PsiReplacementUtil.replaceStatement(ifStatement, "return " + conditional + ';', commentTracker); } else if (ReplaceIfWithConditionalPredicate.isReplaceableMethodCall(ifStatement)) { final PsiExpression condition = ifStatement.getCondition(); if (condition == null) { return; } - final PsiExpressionStatement thenBranch = (PsiExpressionStatement)ControlFlowUtils - .stripBraces(ifStatement.getThenBranch()); - final PsiExpressionStatement elseBranch = (PsiExpressionStatement)ControlFlowUtils - .stripBraces(ifStatement.getElseBranch()); + CommentTracker commentTracker = new CommentTracker(); + final PsiExpressionStatement thenBranch = (PsiExpressionStatement)ControlFlowUtils.stripBraces(ifStatement.getThenBranch()); + final PsiExpressionStatement elseBranch = (PsiExpressionStatement)ControlFlowUtils.stripBraces(ifStatement.getElseBranch()); final PsiMethodCallExpression thenMethodCallExpression = (PsiMethodCallExpression)thenBranch.getExpression(); final PsiMethodCallExpression elseMethodCallExpression = (PsiMethodCallExpression)elseBranch.getExpression(); - final StringBuilder replacementText = new StringBuilder(thenMethodCallExpression.getMethodExpression().getText()); + final StringBuilder replacementText = new StringBuilder(commentTracker.markUnchanged(thenMethodCallExpression.getMethodExpression()).getText()); replacementText.append('('); final PsiExpressionList thenArgumentList = thenMethodCallExpression.getArgumentList(); final PsiExpression[] thenArguments = thenArgumentList.getExpressions(); @@ -120,7 +118,7 @@ public class ReplaceIfWithConditionalIntention extends Intention { final PsiExpression thenArgument = thenArguments[i]; final PsiExpression elseArgument = elseArguments[i]; if (EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(thenArgument, elseArgument)) { - replacementText.append(thenArgument.getText()); + replacementText.append(commentTracker.markUnchanged(thenArgument).getText()); } else { final PsiMethod method = thenMethodCallExpression.resolveMethod(); @@ -129,7 +127,7 @@ public class ReplaceIfWithConditionalIntention extends Intention { } final PsiParameterList parameterList = method.getParameterList(); final PsiType requiredType = parameterList.getParameters()[i].getType(); - final String conditionalText = getConditionalText(condition, thenArgument, elseArgument, requiredType); + final String conditionalText = getConditionalText(condition, thenArgument, elseArgument, requiredType, commentTracker); if (conditionalText == null) { return; } @@ -137,15 +135,14 @@ public class ReplaceIfWithConditionalIntention extends Intention { } } replacementText.append(");"); - replaceIfStatement(ifStatement, replacementText.toString()); + PsiReplacementUtil.replaceStatement(ifStatement, replacementText.toString(), commentTracker); } else if (ReplaceIfWithConditionalPredicate.isReplaceableImplicitReturn(ifStatement)) { final PsiExpression condition = ifStatement.getCondition(); if (condition == null) { return; } - final PsiReturnStatement thenBranch = (PsiReturnStatement)ControlFlowUtils - .stripBraces(ifStatement.getThenBranch()); + final PsiReturnStatement thenBranch = (PsiReturnStatement)ControlFlowUtils.stripBraces(ifStatement.getThenBranch()); final PsiExpression thenReturnValue = thenBranch.getReturnValue(); if (thenReturnValue == null) { return; @@ -158,10 +155,11 @@ public class ReplaceIfWithConditionalIntention extends Intention { if (elseReturnValue == null) { return; } - final String conditional = getConditional(condition, thenBranch, thenReturnValue, elseReturnValue); + CommentTracker commentTracker = new CommentTracker(); + final String conditional = getConditional(condition, thenBranch, thenReturnValue, elseReturnValue, commentTracker); if (conditional == null) return; - replaceIfStatement(ifStatement, "return " + conditional + ';'); - elseBranch.delete(); + commentTracker.delete(elseBranch); + PsiReplacementUtil.replaceStatement(ifStatement, "return " + conditional + ';', commentTracker); } } @@ -169,24 +167,17 @@ public class ReplaceIfWithConditionalIntention extends Intention { private static String getConditional(PsiExpression condition, PsiElement thenBranch, PsiExpression thenReturnValue, - PsiExpression elseReturnValue) { + PsiExpression elseReturnValue, + CommentTracker commentTracker) { final PsiType methodType = PsiTypesUtil.getMethodReturnType(thenBranch); - return methodType == null ? null : getConditionalText(condition, thenReturnValue, elseReturnValue, methodType); - } - - private static void replaceIfStatement(PsiIfStatement ifStatement, String text) { - PsiElement parent = ifStatement.getParent(); - final Collection comments = PsiTreeUtil.findChildrenOfType(ifStatement, PsiComment.class); - for (PsiComment comment : comments) { - parent.addBefore(comment, ifStatement); - } - PsiReplacementUtil.replaceStatement(ifStatement, text); + return methodType == null ? null : getConditionalText(condition, thenReturnValue, elseReturnValue, methodType, commentTracker); } private static String getConditionalText(PsiExpression condition, PsiExpression thenValue, PsiExpression elseValue, - PsiType requiredType) { + PsiType requiredType, + CommentTracker commentTracker) { condition = ParenthesesUtils.stripParentheses(condition); thenValue = ParenthesesUtils.stripParentheses(thenValue); elseValue = ParenthesesUtils.stripParentheses(elseValue); @@ -211,24 +202,24 @@ public class ReplaceIfWithConditionalIntention extends Intention { // prevent unboxing of boxed value to preserve semantics (IDEADEV-36008) final PsiPrimitiveType primitiveType = (PsiPrimitiveType)thenType; conditional.append(primitiveType.getBoxedTypeName()); - conditional.append(".valueOf(").append(thenValue.getText()).append("):"); - conditional.append(getExpressionText(elseValue, false)); + conditional.append(".valueOf(").append(commentTracker.markUnchanged(thenValue).getText()).append("):"); + conditional.append(getExpressionText(commentTracker.markUnchanged(elseValue), false)); } else if (elseType instanceof PsiPrimitiveType && !PsiType.NULL.equals(elseType) && !(thenType instanceof PsiPrimitiveType) && !(requiredType instanceof PsiPrimitiveType)) { // prevent unboxing of boxed value to preserve semantics (IDEADEV-36008) - conditional.append(getExpressionText(thenValue, false)); + conditional.append(getExpressionText(commentTracker.markUnchanged(thenValue), false)); conditional.append(':'); final PsiPrimitiveType primitiveType = (PsiPrimitiveType)elseType; conditional.append(primitiveType.getBoxedTypeName()); - conditional.append(".valueOf(").append(elseValue.getText()).append(')'); + conditional.append(".valueOf(").append(commentTracker.markUnchanged(elseValue).getText()).append(')'); } else { - conditional.append(getExpressionText(thenValue, false)); + conditional.append(getExpressionText(commentTracker.markUnchanged(thenValue), false)); conditional.append(':'); - conditional.append(getExpressionText(elseValue, false)); + conditional.append(getExpressionText(commentTracker.markUnchanged(elseValue), false)); } return conditional.toString(); } diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition.java index a1e3377c76bf..5888acb4d6a9 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition.java @@ -11,6 +11,6 @@ class ConditionalCondition { if (s != null ? !s.equals(condition.s) : condition.s != null) return false; - return t.equals(condition.t); + return t.equals(condition.t);//end line comment } } \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition_after.java index 753f032bb9c3..b02105ebb307 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/trivialif/replaceIfWithConditional/ConditionalCondition_after.java @@ -10,6 +10,7 @@ class ConditionalCondition { final ConditionalCondition condition = (ConditionalCondition)other; + //end line comment return (s != null ? !s.equals(condition.s) : condition.s != null) ? false : t.equals(condition.t); } } \ No newline at end of file