blob: 8581de630fb6f77e62047c4ae45bc28e37ce9a4b [file] [log] [blame]
/*
* Copyright 2000-2014 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.FileModificationService;
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.util.TypeConversionUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
/**
* @author cdr
* if (!a == b) ... => if (!(a == b)) ...
*/
public class NegationBroadScopeFix implements IntentionAction {
private final PsiPrefixExpression myPrefixExpression;
public NegationBroadScopeFix(@NotNull PsiPrefixExpression prefixExpression) {
myPrefixExpression = prefixExpression;
}
@Override
@NotNull
public String getText() {
PsiExpression operand = myPrefixExpression.getOperand();
String text = operand == null ? "" : operand.getText() + " ";
PsiElement parent = myPrefixExpression.getParent();
String rop;
if (parent instanceof PsiInstanceOfExpression) {
text += PsiKeyword.INSTANCEOF + " ";
final PsiTypeElement type = ((PsiInstanceOfExpression)parent).getCheckType();
rop = type == null ? "" : type.getText();
}
else if (parent instanceof PsiBinaryExpression) {
text += ((PsiBinaryExpression)parent).getOperationSign().getText() + " ";
final PsiExpression rOperand = ((PsiBinaryExpression)parent).getROperand();
rop = rOperand == null ? "" : rOperand.getText();
}
else {
rop = "<expr>";
}
text += rop;
return QuickFixBundle.message("negation.broader.scope.text", text);
}
@Override
@NotNull
public String getFamilyName() {
return QuickFixBundle.message("negation.broader.scope.family");
}
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
if (!myPrefixExpression.isValid() || myPrefixExpression.getOperand() == null) return false;
PsiElement parent = myPrefixExpression.getParent();
if (parent instanceof PsiInstanceOfExpression && ((PsiInstanceOfExpression)parent).getOperand() == myPrefixExpression) {
return true;
}
if (!(parent instanceof PsiBinaryExpression)) return false;
PsiBinaryExpression binaryExpression = (PsiBinaryExpression)parent;
return binaryExpression.getLOperand() == myPrefixExpression && TypeConversionUtil.isBooleanType(binaryExpression.getType());
}
@Override
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
if (!isAvailable(project, editor, file) || !FileModificationService.getInstance().preparePsiElementForWrite(myPrefixExpression)) return;
PsiExpression operand = myPrefixExpression.getOperand();
PsiElement unnegated = myPrefixExpression.replace(operand);
PsiElement parent = unnegated.getParent();
PsiElementFactory factory = JavaPsiFacade.getInstance(file.getProject()).getElementFactory();
PsiPrefixExpression negated = (PsiPrefixExpression)factory.createExpressionFromText("!(xxx)", parent);
PsiParenthesizedExpression parentheses = (PsiParenthesizedExpression)negated.getOperand();
parentheses.getExpression().replace(parent.copy());
parent.replace(negated);
}
@Override
public boolean startInWriteAction() {
return true;
}
}