mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-17 21:43:33 +07:00
IDEA-67253 (Quickfix to replace += operator with StringBuilder on left hand side with append() call)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
+87
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user