/* * Copyright 2000-2016 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.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()); } @NotNull @Override public PsiElement getElementToMakeWritable(@NotNull PsiFile file) { return myPrefixExpression; } @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { if (!isAvailable(project, editor, file)) 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; } }