mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-10-06 06:21:16 +07:00
reuse of local: don't add fixes with templates in batch, restore comments
This commit is contained in:
+28
-51
@@ -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]));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user