SSR: proper replacing for multiple (Java) variables in a single declaration

This commit is contained in:
Bas Leijdekkers
2015-06-03 22:50:08 +02:00
parent 8190148d3e
commit 0761b6dfc3
3 changed files with 43 additions and 19 deletions
@@ -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);
}
@@ -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();
}