preserve comments: if may be conditional

This commit is contained in:
Anna.Kozlova
2017-12-07 15:51:06 +01:00
parent 1fc76eb779
commit 35cafcf62e
4 changed files with 62 additions and 15 deletions
@@ -25,6 +25,7 @@ import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
import com.siyeh.ig.InspectionGadgetsFix;
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;
@@ -84,19 +85,20 @@ public class IfMayBeConditionalInspection extends BaseInspection {
final PsiStatement elseBranch = ifStatement.getElseBranch();
final PsiStatement elseStatement = ControlFlowUtils.stripBraces(elseBranch);
final PsiExpression condition = ifStatement.getCondition();
CommentTracker tracker = new CommentTracker();
@NonNls final StringBuilder replacementText = new StringBuilder();
if (thenStatement instanceof PsiReturnStatement) {
final PsiReturnStatement elseReturn = (PsiReturnStatement)elseStatement;
final PsiReturnStatement thenReturn = (PsiReturnStatement)thenStatement;
replacementText.append("return ");
appendExpressionText(condition, replacementText);
appendExpressionText(condition, replacementText, tracker);
replacementText.append('?');
final PsiExpression thenReturnValue = thenReturn.getReturnValue();
appendExpressionText(thenReturnValue, replacementText);
appendExpressionText(thenReturnValue, replacementText, tracker);
replacementText.append(':');
if (elseReturn != null) {
final PsiExpression elseReturnValue = elseReturn.getReturnValue();
appendExpressionText(elseReturnValue, replacementText);
appendExpressionText(elseReturnValue, replacementText, tracker);
}
replacementText.append(';');
}
@@ -108,24 +110,24 @@ public class IfMayBeConditionalInspection extends BaseInspection {
if (thenExpression instanceof PsiAssignmentExpression && elseExpression instanceof PsiAssignmentExpression) {
final PsiAssignmentExpression thenAssignmentExpression = (PsiAssignmentExpression)thenExpression;
final PsiExpression lhs = thenAssignmentExpression.getLExpression();
replacementText.append(lhs.getText());
replacementText.append(tracker.markUnchanged(lhs).getText());
final PsiJavaToken token = thenAssignmentExpression.getOperationSign();
replacementText.append(token.getText());
appendExpressionText(condition, replacementText);
appendExpressionText(condition, replacementText, tracker);
replacementText.append('?');
final PsiExpression thenRhs = thenAssignmentExpression.getRExpression();
appendExpressionText(thenRhs, replacementText);
appendExpressionText(thenRhs, replacementText, tracker);
replacementText.append(':');
final PsiAssignmentExpression elseAssignmentExpression = (PsiAssignmentExpression)elseExpression;
final PsiExpression elseRhs = elseAssignmentExpression.getRExpression();
appendExpressionText(elseRhs, replacementText);
appendExpressionText(elseRhs, replacementText, tracker);
replacementText.append(';');
}
else if (thenExpression instanceof PsiMethodCallExpression && elseExpression instanceof PsiMethodCallExpression) {
final PsiMethodCallExpression thenMethodCallExpression = (PsiMethodCallExpression)thenExpression;
final PsiMethodCallExpression elseMethodCallExpression = (PsiMethodCallExpression)elseExpression;
final PsiReferenceExpression thenMethodExpression = thenMethodCallExpression.getMethodExpression();
replacementText.append(thenMethodExpression.getText());
replacementText.append(tracker.markUnchanged(thenMethodExpression).getText());
replacementText.append('(');
final PsiExpressionList thenArgumentList = thenMethodCallExpression.getArgumentList();
final PsiExpression[] thenArguments = thenArgumentList.getExpressions();
@@ -138,14 +140,14 @@ public class IfMayBeConditionalInspection extends BaseInspection {
final PsiExpression thenArgument = thenArguments[i];
final PsiExpression elseArgument = elseArguments[i];
if (EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(thenArgument, elseArgument)) {
replacementText.append(thenArgument.getText());
replacementText.append(tracker.markUnchanged(thenArgument).getText());
}
else {
appendExpressionText(condition, replacementText);
appendExpressionText(condition, replacementText, tracker);
replacementText.append('?');
appendExpressionText(thenArgument, replacementText);
appendExpressionText(thenArgument, replacementText, tracker);
replacementText.append(':');
appendExpressionText(elseArgument, replacementText);
appendExpressionText(elseArgument, replacementText, tracker);
}
}
replacementText.append(");");
@@ -154,15 +156,18 @@ public class IfMayBeConditionalInspection extends BaseInspection {
return;
}
}
PsiReplacementUtil.replaceStatement(ifStatement, replacementText.toString());
PsiReplacementUtil.replaceStatement(ifStatement, replacementText.toString(), tracker);
}
private static void appendExpressionText(@Nullable PsiExpression expression, StringBuilder out) {
private static void appendExpressionText(@Nullable PsiExpression expression,
StringBuilder out,
CommentTracker tracker) {
expression = ParenthesesUtils.stripParentheses(expression);
if (expression == null) {
return;
}
final String expressionText = expression.getText();
final String expressionText = tracker.markUnchanged(expression).getText();
if (ParenthesesUtils.getPrecedence(expression) > ParenthesesUtils.CONDITIONAL_PRECEDENCE) {
out.append('(');
out.append(expressionText);
@@ -0,0 +1,8 @@
class Test {
String foo(){
// Handling properties of the object
// Handling ivar-s
return child instanceof KeyedValue ? "(id)" : "(" + myValue.getEvaluationExpression(true) + ")->" + child.getName();
}
}
@@ -0,0 +1,13 @@
class Test {
String foo(){
i<caret>f (child instanceof KeyedValue) {
// Handling properties of the object
return "(id)";
}
else {
// Handling ivar-s
return "(" + myValue.getEvaluationExpression(true) + ")->" + child.getName();
}
}
}
@@ -0,0 +1,21 @@
/*
* Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
*/
package com.siyeh.ig.fixes.controlflow;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.IGQuickFixesTestCase;
import com.siyeh.ig.controlflow.IfMayBeConditionalInspection;
public class IfMayBeConditionalFixTest extends IGQuickFixesTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
myFixture.enableInspections(new IfMayBeConditionalInspection());
myRelativePath = "controlflow/if_conditional";
myDefaultHint = InspectionGadgetsBundle.message("if.may.be.conditional.quickfix");
}
public void testComment() { doTest(); }
}