reuse of local: don't add fixes with templates in batch, restore comments

This commit is contained in:
Anna.Kozlova
2017-11-27 16:44:17 +01:00
parent a0dc6348ed
commit bdc586c290
@@ -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<PsiReference> query =
ReferencesSearch.search(variable, scope, false);
final Query<PsiReference> query = ReferencesSearch.search(variable, scope, false);
final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project);
final PsiElementFactory factory = psiFacade.getElementFactory();
List<PsiReferenceExpression> 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]));
}
}
}