mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
SSR: proper replacing for multiple (Java) variables in a single declaration
This commit is contained in:
+19
-16
@@ -6,6 +6,7 @@ import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
import com.intellij.psi.javadoc.PsiDocComment;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.structuralsearch.impl.matcher.GlobalMatchingVisitor;
|
||||
import com.intellij.structuralsearch.impl.matcher.MatcherImplUtil;
|
||||
import com.intellij.structuralsearch.impl.matcher.PatternTreeContext;
|
||||
@@ -242,17 +243,20 @@ public class JavaReplaceHandler extends StructuralReplaceHandler {
|
||||
|
||||
public void replace(final ReplacementInfo info, ReplaceOptions options) {
|
||||
PsiElement elementToReplace = info.getMatch(0);
|
||||
PsiElement elementParent = elementToReplace.getParent();
|
||||
if (elementToReplace == null) {
|
||||
return;
|
||||
}
|
||||
final PsiElement elementParent = elementToReplace.getParent();
|
||||
String replacementToMake = info.getReplacement();
|
||||
PsiElement el = findRealSubstitutionElement(elementToReplace);
|
||||
boolean listContext = isListContext(el);
|
||||
final boolean listContext = isListContext(el);
|
||||
|
||||
if (el instanceof PsiAnnotation && !replacementToMake.isEmpty() && !StringUtil.startsWithChar(replacementToMake, '@')) {
|
||||
replacementToMake = "@" + replacementToMake;
|
||||
}
|
||||
|
||||
PsiElement[] statements = ReplacerUtil
|
||||
.createTreeForReplacement(replacementToMake, el instanceof PsiMember && !isSymbolReplacement(el) ?
|
||||
final PsiElement[] statements = ReplacerUtil
|
||||
.createTreeForReplacement(replacementToMake, el instanceof PsiMember && !isSymbolReplacement(elementToReplace) ?
|
||||
PatternTreeContext.Class :
|
||||
PatternTreeContext.Block, myContext);
|
||||
|
||||
@@ -274,7 +278,8 @@ public class JavaReplaceHandler extends StructuralReplaceHandler {
|
||||
}
|
||||
if (listContext) {
|
||||
if (statements.length > 1) {
|
||||
elementParent.addRangeBefore(statements[0], statements[statements.length - 1], elementToReplace);
|
||||
final PsiElement replacement = elementParent.addRangeBefore(statements[0], statements[statements.length - 1], elementToReplace);
|
||||
handleModifierList(el, replacement);
|
||||
}
|
||||
else if (statements.length == 1) {
|
||||
PsiElement replacement = getMatchExpr(statements[0], elementToReplace);
|
||||
@@ -417,7 +422,7 @@ public class JavaReplaceHandler extends StructuralReplaceHandler {
|
||||
|
||||
if (prevSibling instanceof PsiWhiteSpace) {
|
||||
firstToDelete = prevSibling;
|
||||
prevSibling = prevSibling != null ? prevSibling.getPrevSibling() : null;
|
||||
prevSibling = prevSibling.getPrevSibling();
|
||||
}
|
||||
else if (prevSibling == null && nextSibling instanceof PsiWhiteSpace) {
|
||||
lastToDelete = nextSibling;
|
||||
@@ -425,21 +430,19 @@ public class JavaReplaceHandler extends StructuralReplaceHandler {
|
||||
|
||||
if (element instanceof PsiExpression) {
|
||||
final PsiElement parent = element.getParent().getParent();
|
||||
if ((parent instanceof PsiCall ||
|
||||
parent instanceof PsiAnonymousClass
|
||||
) &&
|
||||
prevSibling instanceof PsiJavaToken &&
|
||||
((PsiJavaToken)prevSibling).getTokenType() == JavaTokenType.COMMA
|
||||
) {
|
||||
if ((parent instanceof PsiCall || parent instanceof PsiAnonymousClass) && PsiUtil.isJavaToken(prevSibling, JavaTokenType.COMMA)) {
|
||||
firstToDelete = prevSibling;
|
||||
}
|
||||
}
|
||||
else if (element instanceof PsiParameter &&
|
||||
prevSibling instanceof PsiJavaToken &&
|
||||
((PsiJavaToken)prevSibling).getTokenType() == JavaTokenType.COMMA
|
||||
) {
|
||||
else if (element instanceof PsiParameter && PsiUtil.isJavaToken(prevSibling, JavaTokenType.COMMA)) {
|
||||
firstToDelete = prevSibling;
|
||||
}
|
||||
else if (element instanceof PsiField) {
|
||||
while (PsiUtil.isJavaToken(nextSibling, JavaTokenType.COMMA)) {
|
||||
lastToDelete = PsiTreeUtil.skipSiblingsForward(nextSibling, PsiWhiteSpace.class);
|
||||
nextSibling = PsiTreeUtil.skipSiblingsForward(lastToDelete, PsiWhiteSpace.class);
|
||||
}
|
||||
}
|
||||
|
||||
element.getParent().deleteChildRange(firstToDelete, lastToDelete);
|
||||
}
|
||||
|
||||
+8
-3
@@ -468,7 +468,13 @@ public class JavaStructuralSearchProfile extends StructuralSearchProfile {
|
||||
|
||||
if (buf.length() > 0) {
|
||||
final PsiElement parent = currentElement.getParent();
|
||||
if (info.isStatementContext()) {
|
||||
if (parent instanceof PsiVariable) {
|
||||
final PsiElement prevSibling = PsiTreeUtil.skipSiblingsBackward(parent, PsiWhiteSpace.class);
|
||||
if (prevSibling instanceof PsiJavaToken && JavaTokenType.COMMA.equals(((PsiJavaToken)prevSibling).getTokenType())) {
|
||||
buf.append(',');
|
||||
}
|
||||
}
|
||||
else if (info.isStatementContext()) {
|
||||
final PsiElement previousElement = previous.getMatchRef().getElement();
|
||||
|
||||
if (!(previousElement instanceof PsiComment) &&
|
||||
@@ -525,11 +531,10 @@ public class JavaStructuralSearchProfile extends StructuralSearchProfile {
|
||||
|
||||
replacementString = buf.toString();
|
||||
} else {
|
||||
StringBuilder buf = new StringBuilder();
|
||||
if (info.isStatementContext()) {
|
||||
forceAddingNewLine = match.getMatch() instanceof PsiComment;
|
||||
}
|
||||
buf.append(replacementString);
|
||||
StringBuilder buf = new StringBuilder(replacementString);
|
||||
removeExtraSemicolonForSingleVarInstanceInMultipleMatch(info, match, buf);
|
||||
replacementString = buf.toString();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user