IDEA-67253 (Quickfix to replace += operator with StringBuilder on left hand side with append() call)

This commit is contained in:
Bas Leijdekkers
2011-03-31 12:44:31 +02:00
parent e44fcf606f
commit 869733d272
3 changed files with 97 additions and 3 deletions
@@ -378,14 +378,18 @@ public class HighlightUtil {
if (opSign == null) return null;
HighlightInfo errorResult = null;
final PsiType lType = assignment.getLExpression().getType();
if (!TypeConversionUtil.isBinaryOperatorApplicable(opSign, assignment.getLExpression(), assignment.getRExpression(), true) ||
final PsiExpression rExpression = assignment.getRExpression();
if (rExpression == null) return null;
final PsiType rType = rExpression.getType();
if (!TypeConversionUtil.isBinaryOperatorApplicable(opSign, lType, rType, true) ||
PsiType.getJavaLangObject(assignment.getManager(), assignment.getResolveScope()).equals(lType)) {
String operatorText = operationSign.getText().substring(0, operationSign.getText().length() - 1);
String message = JavaErrorMessages.message("binary.operator.not.applicable", operatorText,
formatType(lType),
formatType(assignment.getRExpression().getType()));
formatType(rType));
errorResult = HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, assignment, message);
QuickFixAction.registerQuickFixAction(errorResult, new ChangeToAppendFix(eqOpSign, lType, rType, assignment));
}
return errorResult;
}
@@ -0,0 +1,87 @@
/*
* Copyright 2000-2011 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.CodeInsightUtilBase;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.intention.IntentionAction;
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.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
/**
* @author Bas Leijdekkers
*/
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) {
myTokenType = eqOpSign;
myLhsType = lType;
myRhsType = rType;
myAssignmentExpression = assignmentExpression;
}
@NotNull
@Override
public String getText() {
return QuickFixBundle.message("change.to.append.text",
myAssignmentExpression.getLExpression().getText(),
myAssignmentExpression.getRExpression().getText());
}
@NotNull
@Override
public String getFamilyName() {
return QuickFixBundle.message("change.to.append.family");
}
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
return JavaTokenType.PLUSEQ == myTokenType &&
myAssignmentExpression.isValid() &&
myAssignmentExpression.getManager().isInProject(myAssignmentExpression) &&
myRhsType.equalsToText("java.lang.String") &&
(myLhsType.equalsToText("java.lang.StringBuilder") || myLhsType.equalsToText("java.lang.StringBuffer"));
}
@Override
public boolean startInWriteAction() {
return true;
}
@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) {
return;
}
final String appendCallText =
myAssignmentExpression.getLExpression().getText() + ".append(" + rExpression.getText() + ')';
final PsiElementFactory factory = JavaPsiFacade.getElementFactory(myAssignmentExpression.getProject());
final PsiExpression appendCall = factory.createExpressionFromText(appendCallText, myAssignmentExpression);
myAssignmentExpression.replace(appendCall);
}
}