SimplifyBooleanExpressionFix: preserve comments during simple replacement

This commit is contained in:
Tagir Valeev
2018-01-15 13:08:37 +07:00
parent cf454fab2c
commit 128e018b9c
4 changed files with 10 additions and 8 deletions
@@ -15,6 +15,7 @@ import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.controlFlow.AnalysisCanceledException;
import com.intellij.psi.controlFlow.ControlFlowUtil;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiExpressionTrimRenderer;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.util.RefactoringUtil;
@@ -77,7 +78,7 @@ public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement {
if (parent instanceof PsiDoWhileStatement) return "Unwrap 'do-while' statement";
if (parent instanceof PsiForStatement) return "Remove 'for' statement";
}
return QuickFixBundle.message("simplify.boolean.expression.text", expression.getText(), constantValue);
return QuickFixBundle.message("simplify.boolean.expression.text", PsiExpressionTrimRenderer.render(expression), constantValue);
}
@Override
@@ -118,6 +119,7 @@ public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement {
if (!isAvailable()) return;
PsiExpression subExpression = getSubExpression();
if (subExpression == null) return;
CommentTracker ct = new CommentTracker();
if (shouldExtractSideEffect()) {
subExpression = RefactoringUtil.ensureCodeBlock(subExpression);
if (subExpression == null) {
@@ -130,6 +132,7 @@ public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement {
return;
}
List<PsiExpression> sideEffects = SideEffectChecker.extractSideEffectExpressions(subExpression);
sideEffects.forEach(ct::markUnchanged);
PsiStatement[] statements = StatementExtractor.generateStatements(sideEffects, subExpression);
if (statements.length > 0) {
BlockUtils.addBefore(anchor, statements);
@@ -139,9 +142,7 @@ public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement {
return;
}
}
final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project);
final PsiExpression constExpression = factory.createExpressionFromText(Boolean.toString(mySubExpressionValue), subExpression);
PsiExpression expression = (PsiExpression)subExpression.replace(constExpression);
PsiExpression expression = (PsiExpression)ct.replaceAndRestoreComments(subExpression, Boolean.toString(mySubExpressionValue));
while (expression.getParent() instanceof PsiExpression) {
expression = (PsiExpression)expression.getParent();
}
@@ -1,7 +1,7 @@
class SideEffectReturn {
private boolean isValidValue(String value) {
try {
return <warning descr="Condition 'Test.valueOf(value) != null' is always 'true'">Test.valueOf(value) <caret>!= null</warning>;
return <warning descr="Condition 'Test.valueOf(value/*oops*/) != null' is always 'true'">Test.valueOf(value/*oops*/<caret>) != null</warning>;
} catch (IllegalArgumentException e) {
return false;
}
@@ -1,7 +1,7 @@
class SideEffectReturn {
private boolean isValidValue(String value) {
try {
Test.valueOf(value);
Test.valueOf(value/*oops*/);
return true;
} catch (IllegalArgumentException e) {
return false;
@@ -490,12 +490,12 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase {
public void testSideEffectReturn() {
doTest();
checkIntentionResult("Simplify 'Test.valueOf(value) != null' to true extracting side effects");
checkIntentionResult("Simplify 'Test.valueOf(...) != null' to true extracting side effects");
}
public void testSideEffectNoBrace() {
doTest();
checkIntentionResult("Simplify 'Test.valueOf(value) != null' to true extracting side effects");
checkIntentionResult("Simplify 'Test.valueOf(...) != null' to true extracting side effects");
}
public void testSimplifyConcatWithParentheses() {
@@ -584,4 +584,5 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase {
public void testAdvancedArrayAccess() { doTest(); }
public void testNullableGetterInLoop() { doTest(); }
public void testNullabilityBasics() { doTest(); }
public void testReassignedVarInLoop() { doTest(); }
}