preserve comments: conditional -> if

This commit is contained in:
Anna.Kozlova
2017-11-24 16:14:29 +01:00
parent 8701e43186
commit 1203c4cd05
6 changed files with 53 additions and 30 deletions
@@ -22,7 +22,6 @@ 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;
@@ -31,10 +30,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.ExpectedTypeUtils;
import com.siyeh.ig.psiutils.ExpressionUtils;
import com.siyeh.ig.psiutils.MethodCallUtils;
import com.siyeh.ig.psiutils.ParenthesesUtils;
import com.siyeh.ig.psiutils.*;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -123,10 +119,11 @@ public class ConditionalExpressionInspection extends BaseInspection {
PsiExpression thenExpression = ParenthesesUtils.stripParentheses(expression.getThenExpression());
PsiExpression elseExpression = ParenthesesUtils.stripParentheses(expression.getElseExpression());
final PsiExpression condition = ParenthesesUtils.stripParentheses(expression.getCondition());
CommentTracker tracker = new CommentTracker();
final StringBuilder newStatement = new StringBuilder();
newStatement.append("if(");
if (condition != null) {
newStatement.append(condition.getText());
newStatement.append(tracker.markUnchanged(condition).getText());
}
newStatement.append(')');
if (variable != null) {
@@ -147,15 +144,16 @@ public class ConditionalExpressionInspection extends BaseInspection {
elseExpression = expression.getElseExpression();
}
}
appendElementTextWithoutParentheses(initializer, expression, thenExpression, newStatement);
appendElementTextWithoutParentheses(initializer, expression, thenExpression, newStatement, tracker);
newStatement.append("; else ").append(name).append('=');
appendElementTextWithoutParentheses(initializer, expression, elseExpression, newStatement);
appendElementTextWithoutParentheses(initializer, expression, elseExpression, newStatement, tracker);
newStatement.append(';');
initializer.delete();
tracker.delete(initializer);
final PsiManager manager = statement.getManager();
final PsiStatement ifStatement = JavaPsiFacade.getElementFactory(project).createStatementFromText(newStatement.toString(), statement);
final PsiElement parent = statement.getParent();
final PsiElement addedElement = parent.addAfter(ifStatement, statement);
tracker.insertCommentsBefore(addedElement);
final CodeStyleManager styleManager = CodeStyleManager.getInstance(manager.getProject());
styleManager.reformat(addedElement);
}
@@ -164,7 +162,7 @@ public class ConditionalExpressionInspection extends BaseInspection {
if (addBraces || thenExpression == null) {
newStatement.append('{');
}
appendElementTextWithoutParentheses(statement, expression, thenExpression, newStatement);
appendElementTextWithoutParentheses(statement, expression, thenExpression, newStatement, tracker);
if (addBraces) {
newStatement.append("} else {");
}
@@ -177,32 +175,39 @@ public class ConditionalExpressionInspection extends BaseInspection {
newStatement.append('{');
}
}
appendElementTextWithoutParentheses(statement, expression, elseExpression, newStatement);
appendElementTextWithoutParentheses(statement, expression, elseExpression, newStatement, tracker);
if (addBraces || elseExpression == null) {
newStatement.append('}');
}
PsiReplacementUtil.replaceStatement(statement, newStatement.toString());
PsiReplacementUtil.replaceStatement(statement, newStatement.toString(), tracker);
}
}
private static void appendElementTextWithoutParentheses(@NotNull PsiElement element, @NotNull PsiExpression expressionToReplace,
@Nullable PsiExpression replacementExpression, @NotNull StringBuilder out) {
private static void appendElementTextWithoutParentheses(@NotNull PsiElement element,
@NotNull PsiExpression expressionToReplace,
@Nullable PsiExpression replacementExpression,
@NotNull StringBuilder out,
CommentTracker tracker) {
final PsiElement expressionParent = expressionToReplace.getParent();
if (expressionParent instanceof PsiParenthesizedExpression) {
final PsiElement grandParent = expressionParent.getParent();
if (replacementExpression == null || !(grandParent instanceof PsiExpression) ||
!ParenthesesUtils.areParenthesesNeeded(replacementExpression, (PsiExpression) grandParent, false)) {
appendElementTextWithoutParentheses(element, (PsiExpression)expressionParent, replacementExpression, out);
appendElementTextWithoutParentheses(element, (PsiExpression)expressionParent, replacementExpression, out, tracker);
return;
}
}
final boolean needsCast =
replacementExpression != null && MethodCallUtils.isNecessaryForSurroundingMethodCall(expressionToReplace, replacementExpression);
appendElementText(element, expressionToReplace, replacementExpression, needsCast, out);
appendElementText(element, expressionToReplace, replacementExpression, needsCast, out, tracker);
}
private static void appendElementText(@NotNull PsiElement element, @NotNull PsiExpression elementToReplace,
@Nullable PsiExpression replacementExpression, boolean insertCast, @NotNull StringBuilder out) {
private static void appendElementText(@NotNull PsiElement element,
@NotNull PsiExpression elementToReplace,
@Nullable PsiExpression replacementExpression,
boolean insertCast,
@NotNull StringBuilder out,
CommentTracker tracker) {
if (element.equals(elementToReplace)) {
final String replacementText = (replacementExpression == null) ? "" : replacementExpression.getText();
final PsiType type = GenericsUtil.getVariableTypeByExpressionType(ExpectedTypeUtils.findExpectedType(elementToReplace, true));
@@ -214,18 +219,12 @@ public class ConditionalExpressionInspection extends BaseInspection {
}
final PsiElement[] children = element.getChildren();
if (children.length == 0) {
out.append(element.getText());
if (element instanceof PsiComment) {
final PsiComment comment = (PsiComment)element;
final IElementType tokenType = comment.getTokenType();
if (tokenType == JavaTokenType.END_OF_LINE_COMMENT) {
out.append('\n');
}
if (!(element instanceof PsiComment)) {
out.append(tracker.markUnchanged(element).getText());
}
return;
}
for (PsiElement child : children) {
appendElementText(child, elementToReplace, replacementExpression, insertCast, out);
appendElementText(child, elementToReplace, replacementExpression, insertCast, out, tracker);
}
}
}
@@ -2,7 +2,10 @@ package com.siyeh.ipp.conditional.withIf;
class Comment {
public String get() {
if (239 > 42) return "239";//comment
else return "42";//comment
/*before then*/
/*after then*/
//comment
if (239 > 42) return "239";
else return "42";
}
}
@@ -2,6 +2,6 @@ package com.siyeh.ipp.conditional.withIf;
class Comment {
public String get() {
return 239 > <caret>42 ? "239" : "42";//comment
return 239 > <caret>42 ? /*before then*/"239"/*after then*/ : "42";//comment
}
}
@@ -0,0 +1,12 @@
package com.siyeh.ipp.conditional.withIf;
class Comment {
public String get() {
String s;//comment
/*before then*/
/*after then*/
if (239 > 42) s = "239";
else s = "42";
return s;
}
}
@@ -0,0 +1,8 @@
package com.siyeh.ipp.conditional.withIf;
class Comment {
public String get() {
String s = 239 > <caret>42 ? /*before then*/"239"/*after then*/ : "42";//comment
return s;
}
}
@@ -36,6 +36,7 @@ public class ConditionalExpressionFixTest extends IGQuickFixesTestCase {
public void testArrayInitializer() { doTest(); }
public void testCastNeeded() { doTest(); }
public void testComment() { doTest(); }
public void testCommentWithDeclaration() { doTest(); }
public void testConditionalAsArgument() { doTest(); }
public void testConditionalInBinaryExpression() { doTest(); }
public void testConditionalInIf() { doTest(); }