From 35cafcf62e5eaf168c8a0cfaad8a043f9b5de7ed Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Thu, 7 Dec 2017 14:13:19 +0100 Subject: [PATCH] preserve comments: if may be conditional --- .../IfMayBeConditionalInspection.java | 35 +++++++++++-------- .../if_conditional/Comment.after.java | 8 +++++ .../controlflow/if_conditional/Comment.java | 13 +++++++ .../IfMayBeConditionalFixTest.java | 21 +++++++++++ 4 files changed, 62 insertions(+), 15 deletions(-) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/if_conditional/Comment.after.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/if_conditional/Comment.java create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/controlflow/IfMayBeConditionalFixTest.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/IfMayBeConditionalInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/IfMayBeConditionalInspection.java index 2c4712b3d99f..5ab64f8ded15 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/IfMayBeConditionalInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/IfMayBeConditionalInspection.java @@ -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); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/if_conditional/Comment.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/if_conditional/Comment.after.java new file mode 100644 index 000000000000..2c20e9c62770 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/if_conditional/Comment.after.java @@ -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(); + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/if_conditional/Comment.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/if_conditional/Comment.java new file mode 100644 index 000000000000..9fe9f62231c1 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/if_conditional/Comment.java @@ -0,0 +1,13 @@ +class Test { + + String foo(){ + if (child instanceof KeyedValue) { + // Handling properties of the object + return "(id)"; + } + else { + // Handling ivar-s + return "(" + myValue.getEvaluationExpression(true) + ")->" + child.getName(); + } + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/controlflow/IfMayBeConditionalFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/controlflow/IfMayBeConditionalFixTest.java new file mode 100644 index 000000000000..d23e1de82970 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/controlflow/IfMayBeConditionalFixTest.java @@ -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(); } +} \ No newline at end of file