mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 06:05:01 +07:00
SSR: improve replacement of polyadic expressions and assertion statements
This commit is contained in:
+54
-26
@@ -397,25 +397,6 @@ public class JavaStructuralSearchProfile extends StructuralSearchProfile {
|
||||
visitElement(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitVariable(PsiVariable field) {
|
||||
super.visitVariable(field);
|
||||
|
||||
final PsiExpression initializer = field.getInitializer();
|
||||
|
||||
if (initializer != null) {
|
||||
final String initText = initializer.getText();
|
||||
|
||||
if (StructuralSearchUtil.isTypedVariable(initText)) {
|
||||
final ParameterInfo initInfo = builder.findParameterization(Replacer.stripTypedVariableDecoration(initText));
|
||||
|
||||
if (initInfo != null) {
|
||||
initInfo.setVariableInitializerContext(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void visitClass(PsiClass aClass) {
|
||||
super.visitClass(aClass);
|
||||
@@ -525,6 +506,13 @@ public class JavaStructuralSearchProfile extends StructuralSearchProfile {
|
||||
else if (parent instanceof PsiReferenceList) {
|
||||
buf.append(',');
|
||||
}
|
||||
else if (parent instanceof PsiPolyadicExpression) {
|
||||
final PsiPolyadicExpression expression = (PsiPolyadicExpression)parent;
|
||||
final PsiJavaToken token = expression.getTokenBeforeOperand(expression.getOperands()[1]);
|
||||
if (token != null) {
|
||||
buf.append(token.getText());
|
||||
}
|
||||
}
|
||||
else {
|
||||
buf.append(' ');
|
||||
}
|
||||
@@ -558,20 +546,60 @@ public class JavaStructuralSearchProfile extends StructuralSearchProfile {
|
||||
|
||||
@Override
|
||||
public int handleNoSubstitution(ParameterInfo info, int offset, StringBuilder result) {
|
||||
final int newOffset = super.handleNoSubstitution(info, offset, result);
|
||||
if (newOffset != offset) {
|
||||
return newOffset;
|
||||
final PsiElement element = info.getElement();
|
||||
final PsiElement prevSibling = PsiTreeUtil.skipSiblingsBackward(element, PsiWhiteSpace.class);
|
||||
if (prevSibling instanceof PsiJavaToken && isRemovableToken(prevSibling)) {
|
||||
final int start = info.getBeforeDelimiterPos() + offset - (prevSibling.getTextLength() - 1);
|
||||
final int end = info.getStartIndex() + offset;
|
||||
result.delete(start, end);
|
||||
return offset - (end - start);
|
||||
}
|
||||
if (info.isVariableInitializerContext()) {
|
||||
result.delete(info.getBeforeDelimiterPos() + offset, info.getAfterDelimiterPos() + offset - 1);
|
||||
offset -= (info.getAfterDelimiterPos() - info.getBeforeDelimiterPos() - 1);
|
||||
final PsiElement nextSibling = PsiTreeUtil.skipSiblingsForward(element, PsiWhiteSpace.class);
|
||||
if (nextSibling instanceof PsiJavaToken && isRemovableToken(nextSibling)) {
|
||||
final int start = info.getStartIndex() + offset;
|
||||
final int end = info.getAfterDelimiterPos() + nextSibling.getTextLength() + offset;
|
||||
result.delete(start, end);
|
||||
return offset - 1;
|
||||
}
|
||||
else if (info.isStatementContext()) {
|
||||
if (element == null || !(element.getParent() instanceof PsiForStatement)) {
|
||||
return removeExtraSemicolon(info, offset, result, null);
|
||||
}
|
||||
return offset;
|
||||
}
|
||||
|
||||
private static boolean isRemovableToken(PsiElement element) {
|
||||
final PsiElement parent = element.getParent();
|
||||
if (!(parent instanceof PsiAnnotationParameterList || // ',' between annotation parameters
|
||||
parent instanceof PsiAssertStatement || // ':' before assertion message
|
||||
parent instanceof PsiExpressionList || // ',' between expressions
|
||||
parent instanceof PsiParameterList || // ',' between parameters
|
||||
parent instanceof PsiPolyadicExpression || // '+', '*', '&&' etcetera
|
||||
parent instanceof PsiReferenceList || // ','
|
||||
parent instanceof PsiReferenceParameterList || // ','
|
||||
parent instanceof PsiResourceList || // ';'
|
||||
parent instanceof PsiTypeParameterList || // ','
|
||||
parent instanceof PsiVariable)) { // '=' before initializer
|
||||
return false;
|
||||
}
|
||||
final String text = element.getText();
|
||||
if (text.length() != 1) {
|
||||
return true;
|
||||
}
|
||||
switch(text.charAt(0)) {
|
||||
case '<':
|
||||
case '>':
|
||||
case '(':
|
||||
case ')':
|
||||
case '{':
|
||||
case '}':
|
||||
case '[':
|
||||
case ']':
|
||||
return false;
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIdentifier(PsiElement element) {
|
||||
return element instanceof PsiIdentifier;
|
||||
|
||||
Reference in New Issue
Block a user