From bdc586c2904a4e0b401d951ab12b580847ccd59a Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Mon, 27 Nov 2017 16:40:24 +0100 Subject: [PATCH] reuse of local: don't add fixes with templates in batch, restore comments --- .../ReuseOfLocalVariableInspection.java | 79 +++++++------------ 1 file changed, 28 insertions(+), 51 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/dataflow/ReuseOfLocalVariableInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/dataflow/ReuseOfLocalVariableInspection.java index 7f5a5d49f257..49c5187e02e7 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/dataflow/ReuseOfLocalVariableInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/dataflow/ReuseOfLocalVariableInspection.java @@ -28,6 +28,7 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.Query; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.InspectionGadgetsFix; +import com.siyeh.ig.psiutils.CommentTracker; import com.siyeh.ig.psiutils.HighlightUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -35,49 +36,40 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -public class ReuseOfLocalVariableInspection - extends ReuseOfLocalVariableInspectionBase { +public class ReuseOfLocalVariableInspection extends ReuseOfLocalVariableInspectionBase { @Override protected InspectionGadgetsFix buildFix(Object... infos) { return new ReuseOfLocalVariableFix(); } - private static class ReuseOfLocalVariableFix - extends InspectionGadgetsFix { + @Override + protected boolean buildQuickFixesOnlyForOnTheFlyErrors() { + return true; + } + + private static class ReuseOfLocalVariableFix extends InspectionGadgetsFix { @Override @NotNull public String getFamilyName() { - return InspectionGadgetsBundle.message( - "reuse.of.local.variable.split.quickfix"); + return InspectionGadgetsBundle.message("reuse.of.local.variable.split.quickfix"); } @Override - public void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { - final PsiReferenceExpression referenceExpression = - (PsiReferenceExpression)descriptor.getPsiElement(); - final PsiLocalVariable variable = - (PsiLocalVariable)referenceExpression.resolve(); - final PsiAssignmentExpression assignment = - (PsiAssignmentExpression)referenceExpression.getParent(); + public void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)descriptor.getPsiElement(); + final PsiLocalVariable variable = (PsiLocalVariable)referenceExpression.resolve(); + final PsiAssignmentExpression assignment = (PsiAssignmentExpression)referenceExpression.getParent(); assert assignment != null; - final PsiExpressionStatement assignmentStatement = - (PsiExpressionStatement)assignment.getParent(); + final PsiExpressionStatement assignmentStatement = (PsiExpressionStatement)assignment.getParent(); final PsiExpression lExpression = assignment.getLExpression(); final String originalVariableName = lExpression.getText(); assert variable != null; final PsiType type = variable.getType(); - final JavaCodeStyleManager codeStyleManager = - JavaCodeStyleManager.getInstance(project); - final PsiCodeBlock variableBlock = - PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); - final String newVariableName = - codeStyleManager.suggestUniqueVariableName( - originalVariableName, variableBlock, false); - final PsiCodeBlock codeBlock = - PsiTreeUtil.getParentOfType(assignmentStatement, - PsiCodeBlock.class); + final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project); + final PsiCodeBlock variableBlock = PsiTreeUtil.getParentOfType(variable, PsiCodeBlock.class); + final String newVariableName = codeStyleManager.suggestUniqueVariableName(originalVariableName, variableBlock, false); + final PsiCodeBlock codeBlock = PsiTreeUtil.getParentOfType(assignmentStatement, PsiCodeBlock.class); final SearchScope scope; if (codeBlock != null) { scope = new LocalSearchScope(codeBlock); @@ -85,8 +77,7 @@ public class ReuseOfLocalVariableInspection else { scope = variable.getUseScope(); } - final Query query = - ReferencesSearch.search(variable, scope, false); + final Query query = ReferencesSearch.search(variable, scope, false); final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); final PsiElementFactory factory = psiFacade.getElementFactory(); List collectedReferences = new ArrayList<>(); @@ -96,43 +87,29 @@ public class ReuseOfLocalVariableInspection continue; } final TextRange textRange = assignmentStatement.getTextRange(); - if (referenceElement.getTextOffset() <= - textRange.getEndOffset()) { + if (referenceElement.getTextOffset() <= textRange.getEndOffset()) { continue; } - final PsiExpression newExpression = - factory.createExpressionFromText(newVariableName, referenceElement); - final PsiReferenceExpression replacementExpression = - (PsiReferenceExpression) - referenceElement.replace(newExpression); + final PsiExpression newExpression = factory.createExpressionFromText(newVariableName, referenceElement); + final PsiReferenceExpression replacementExpression = (PsiReferenceExpression)referenceElement.replace(newExpression); collectedReferences.add(replacementExpression); } + CommentTracker commentTracker = new CommentTracker(); final PsiExpression rhs = assignment.getRExpression(); final String rhsText; if (rhs == null) { rhsText = ""; } else { - rhsText = rhs.getText(); + rhsText = commentTracker.markUnchanged(rhs).getText(); } - @NonNls final String newStatementText = - type.getCanonicalText() + ' ' + newVariableName + - " = " + rhsText + ';'; + @NonNls final String newStatementText = type.getCanonicalText() + ' ' + newVariableName + " = " + rhsText + ';'; - final PsiStatement newStatement = - factory.createStatementFromText(newStatementText, - assignmentStatement); - final PsiDeclarationStatement declarationStatement = - (PsiDeclarationStatement) - assignmentStatement.replace(newStatement); - final PsiElement[] elements = - declarationStatement.getDeclaredElements(); + final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)commentTracker.replaceAndRestoreComments(assignmentStatement, newStatementText); + final PsiElement[] elements = declarationStatement.getDeclaredElements(); final PsiLocalVariable newVariable = (PsiLocalVariable)elements[0]; final PsiElement context = declarationStatement.getParent(); - HighlightUtils.showRenameTemplate(context, newVariable, - collectedReferences.toArray( - new PsiReferenceExpression[ - collectedReferences.size()])); + HighlightUtils.showRenameTemplate(context, newVariable, collectedReferences.toArray(new PsiReferenceExpression[0])); } } } \ No newline at end of file