preserve comments: replace if with conditional

This commit is contained in:
Anna.Kozlova
2017-12-04 12:57:44 +01:00
parent 1a29f95a65
commit 39954ad9a8
3 changed files with 35 additions and 43 deletions
@@ -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<PsiComment> 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();
}
@@ -11,6 +11,6 @@ class ConditionalCondition {
if<caret> (s != null ? !s.equals(condition.s) : condition.s != null) return false;
return t.equals(condition.t);
return t.equals(condition.t);//end line comment
}
}
@@ -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);
}
}