mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-26 19:06:24 +07:00
Improve quickfix to replace += operator with StringBuilder on left hand side with append() call
now works on java.lang.Appendable and splits concatenated strings into separate append calls
This commit is contained in:
@@ -403,7 +403,7 @@ public class HighlightUtil {
|
||||
formatType(rType));
|
||||
|
||||
errorResult = HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, assignment, message);
|
||||
QuickFixAction.registerQuickFixAction(errorResult, new ChangeToAppendFix(eqOpSign, lType, rType, assignment));
|
||||
QuickFixAction.registerQuickFixAction(errorResult, new ChangeToAppendFix(eqOpSign, lType, assignment));
|
||||
}
|
||||
return errorResult;
|
||||
}
|
||||
|
||||
+81
-14
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2011 JetBrains s.r.o.
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -23,8 +23,11 @@ import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.tree.IElementType;
|
||||
import com.intellij.psi.util.PsiUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* @author Bas Leijdekkers
|
||||
@@ -33,13 +36,11 @@ public class ChangeToAppendFix implements IntentionAction {
|
||||
|
||||
private final IElementType myTokenType;
|
||||
private final PsiType myLhsType;
|
||||
private final PsiType myRhsType;
|
||||
private final PsiAssignmentExpression myAssignmentExpression;
|
||||
|
||||
public ChangeToAppendFix(IElementType eqOpSign, PsiType lType, PsiType rType, PsiAssignmentExpression assignmentExpression) {
|
||||
public ChangeToAppendFix(IElementType eqOpSign, PsiType lType, PsiAssignmentExpression assignmentExpression) {
|
||||
myTokenType = eqOpSign;
|
||||
myLhsType = lType;
|
||||
myRhsType = rType;
|
||||
myAssignmentExpression = assignmentExpression;
|
||||
}
|
||||
|
||||
@@ -47,8 +48,9 @@ public class ChangeToAppendFix implements IntentionAction {
|
||||
@Override
|
||||
public String getText() {
|
||||
return QuickFixBundle.message("change.to.append.text",
|
||||
myAssignmentExpression.getLExpression().getText(),
|
||||
myAssignmentExpression.getRExpression().getText());
|
||||
buildAppendExpression(myAssignmentExpression.getRExpression(),
|
||||
myLhsType.equalsToText("java.lang.Appendable"),
|
||||
new StringBuilder(myAssignmentExpression.getLExpression().getText())));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -61,9 +63,10 @@ public class ChangeToAppendFix implements IntentionAction {
|
||||
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
|
||||
return JavaTokenType.PLUSEQ == myTokenType &&
|
||||
myAssignmentExpression.isValid() &&
|
||||
myAssignmentExpression.getManager().isInProject(myAssignmentExpression) &&
|
||||
myRhsType.equalsToText(CommonClassNames.JAVA_LANG_STRING) &&
|
||||
(myLhsType.equalsToText(CommonClassNames.JAVA_LANG_STRING_BUILDER) || myLhsType.equalsToText(CommonClassNames.JAVA_LANG_STRING_BUFFER));
|
||||
PsiManager.getInstance(project).isInProject(myAssignmentExpression) &&
|
||||
(myLhsType.equalsToText(CommonClassNames.JAVA_LANG_STRING_BUILDER) ||
|
||||
myLhsType.equalsToText(CommonClassNames.JAVA_LANG_STRING_BUFFER) ||
|
||||
myLhsType.equalsToText("java.lang.Appendable"));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -74,14 +77,78 @@ public class ChangeToAppendFix implements IntentionAction {
|
||||
@Override
|
||||
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
|
||||
if (!CodeInsightUtilBase.prepareFileForWrite(file)) return;
|
||||
final PsiExpression rExpression = myAssignmentExpression.getRExpression();
|
||||
if (rExpression == null) {
|
||||
final PsiExpression rhs = myAssignmentExpression.getRExpression();
|
||||
if (rhs == null) {
|
||||
return;
|
||||
}
|
||||
final StringBuilder appendCallText = buildAppendExpression(rhs, myLhsType.equalsToText("java.lang.Appendable"),
|
||||
new StringBuilder(myAssignmentExpression.getLExpression().getText()));
|
||||
if (appendCallText == null) {
|
||||
return;
|
||||
}
|
||||
final String appendCallText =
|
||||
myAssignmentExpression.getLExpression().getText() + ".append(" + rExpression.getText() + ')';
|
||||
final PsiElementFactory factory = JavaPsiFacade.getElementFactory(myAssignmentExpression.getProject());
|
||||
final PsiExpression appendCall = factory.createExpressionFromText(appendCallText, myAssignmentExpression);
|
||||
final PsiExpression appendCall = factory.createExpressionFromText(appendCallText.toString(), myAssignmentExpression);
|
||||
myAssignmentExpression.replace(appendCall);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static StringBuilder buildAppendExpression(PsiExpression concatenation, boolean useStringValueOf, @NonNls StringBuilder out)
|
||||
throws IncorrectOperationException {
|
||||
final PsiType type = concatenation.getType();
|
||||
if (type == null) {
|
||||
return null;
|
||||
}
|
||||
if (concatenation instanceof PsiPolyadicExpression && type.equalsToText(CommonClassNames.JAVA_LANG_STRING)) {
|
||||
PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)concatenation;
|
||||
final PsiExpression[] operands = polyadicExpression.getOperands();
|
||||
boolean isConstant = true;
|
||||
boolean isString = false;
|
||||
final StringBuilder builder = new StringBuilder();
|
||||
for (PsiExpression operand : operands) {
|
||||
if (isConstant && PsiUtil.isConstantExpression(operand)) {
|
||||
if (builder.length() != 0) {
|
||||
builder.append('+');
|
||||
}
|
||||
final PsiType operandType = operand.getType();
|
||||
if (operandType != null && operandType.equalsToText(CommonClassNames.JAVA_LANG_STRING)) {
|
||||
isString = true;
|
||||
}
|
||||
builder.append(operand.getText());
|
||||
}
|
||||
else {
|
||||
isConstant = false;
|
||||
if (builder.length() != 0) {
|
||||
append(builder, useStringValueOf && !isString, out);
|
||||
builder.setLength(0);
|
||||
}
|
||||
buildAppendExpression(operand, useStringValueOf, out);
|
||||
}
|
||||
}
|
||||
if (builder.length() != 0) {
|
||||
append(builder, false, out);
|
||||
}
|
||||
}
|
||||
else if (concatenation instanceof PsiParenthesizedExpression) {
|
||||
final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)concatenation;
|
||||
final PsiExpression expression = parenthesizedExpression.getExpression();
|
||||
if (expression != null) {
|
||||
return buildAppendExpression(expression, useStringValueOf, out);
|
||||
}
|
||||
}
|
||||
else {
|
||||
append(concatenation.getText(), useStringValueOf && !type.equalsToText(CommonClassNames.JAVA_LANG_STRING), out);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
private static void append(CharSequence text, boolean useStringValueOf, StringBuilder out) {
|
||||
out.append(".append(");
|
||||
if (useStringValueOf) {
|
||||
out.append("String.valueOf(").append(text).append(')');
|
||||
}
|
||||
else {
|
||||
out.append(text);
|
||||
}
|
||||
out.append(')');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user