invert if: check precedence and keep parenthesis accordingly (IDEA-175062)

replace duplicated negation utility
This commit is contained in:
Anna Kozlova
2018-01-03 14:18:52 +01:00
parent 28ec1b1e80
commit 0ebca9cff2
9 changed files with 56 additions and 11 deletions
@@ -16,7 +16,6 @@
package com.intellij.codeInsight.intention.impl;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.codeInsight.CodeInsightServicesUtil;
import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
@@ -29,6 +28,7 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.ArrayUtilRt;
import com.intellij.util.IncorrectOperationException;
import com.siyeh.ig.psiutils.BoolUtils;
import com.siyeh.ig.psiutils.CommentTracker;
import org.jetbrains.annotations.NotNull;
@@ -93,7 +93,9 @@ public class InvertIfConditionAction extends PsiElementBaseIntentionAction {
ifStatement = setupBranches(ifStatement, controlFlow);
if (condition != null) {
Objects.requireNonNull(ifStatement.getCondition()).replace(CodeInsightServicesUtil.invertCondition(condition));
PsiExpression negatedExpression =
JavaPsiFacade.getElementFactory(project).createExpressionFromText(BoolUtils.getNegatedExpressionText(condition), condition);
Objects.requireNonNull(ifStatement.getCondition()).replace(negatedExpression);
}
formatIf(ifStatement);
@@ -1,7 +1,6 @@
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.codeInsight.template.postfix.util;
import com.intellij.codeInsight.CodeInsightServicesUtil;
import com.intellij.codeInsight.template.postfix.templates.PostfixTemplateExpressionSelector;
import com.intellij.codeInsight.template.postfix.templates.PostfixTemplateExpressionSelectorBase;
import com.intellij.codeInsight.template.postfix.templates.PostfixTemplatePsiInfo;
@@ -18,6 +17,7 @@ import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.introduceVariable.IntroduceVariableBase;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import com.siyeh.ig.psiutils.BoolUtils;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -128,7 +128,8 @@ public abstract class JavaPostfixTemplatesUtils {
@Override
public PsiExpression getNegatedExpression(@NotNull PsiElement element) {
assert element instanceof PsiExpression;
return CodeInsightServicesUtil.invertCondition((PsiExpression)element);
String negatedExpressionText = BoolUtils.getNegatedExpressionText((PsiExpression)element);
return JavaPsiFacade.getElementFactory(element.getProject()).createExpressionFromText(negatedExpressionText, element);
}
};
@@ -15,7 +15,6 @@
*/
package com.intellij.refactoring.invertBoolean;
import com.intellij.codeInsight.CodeInsightServicesUtil;
import com.intellij.codeInsight.daemon.impl.RecursiveCallLineMarkerProvider;
import com.intellij.ide.util.SuperMethodWarningUtil;
import com.intellij.lang.java.JavaLanguage;
@@ -33,6 +32,7 @@ import com.intellij.usageView.UsageInfo;
import com.intellij.util.Query;
import com.intellij.util.containers.HashSet;
import com.intellij.util.containers.MultiMap;
import com.siyeh.ig.psiutils.BoolUtils;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
@@ -172,11 +172,15 @@ public class JavaInvertBooleanDelegate extends InvertBooleanDelegate {
if (expression instanceof PsiMethodReferenceExpression) {
final PsiExpression callExpression = LambdaRefactoringUtil.convertToMethodCallInLambdaBody((PsiMethodReferenceExpression)expression);
if (callExpression instanceof PsiCallExpression) {
callExpression.replace(CodeInsightServicesUtil.invertCondition(callExpression));
PsiExpression negatedExpression = JavaPsiFacade.getElementFactory(callExpression.getProject())
.createExpressionFromText(BoolUtils.getNegatedExpressionText(callExpression), callExpression);
callExpression.replace(negatedExpression);
}
}
else if (!(expression.getParent() instanceof PsiExpressionStatement)) {
expression.replace(CodeInsightServicesUtil.invertCondition((PsiExpression)expression));
PsiExpression negatedExpression = JavaPsiFacade.getElementFactory(expression.getProject())
.createExpressionFromText(BoolUtils.getNegatedExpressionText((PsiExpression)expression), expression);
expression.replace(negatedExpression);
}
}
@@ -0,0 +1,13 @@
// "Invert 'if' condition" "true"
class A {
void method(Object x) {
if (x instanceof String) {
System.out.println(((String) x).toUpperCase());
}
else {
System.out.println(x.toString());
}
}
}
@@ -0,0 +1,12 @@
// "Invert 'if' condition" "true"
class A {
void method(Object x) {
if (!<caret>(x instanceof String)) {
System.out.println(x.toString());
} else {
System.out.println(((String) x).toUpperCase());
}
}
}
@@ -11,7 +11,7 @@ public class IfStatementWithIdenticalBranches {
int work() {
final int y = getX();
if (!true) {
if (false) {
System.out.println(y);
}
return y;
@@ -11,7 +11,7 @@ public class IfStatementWithIdenticalBranches {
int work() {
int x = getX();
if (!true) {
if (false) {
return x;
}
}
@@ -21,8 +21,12 @@ import com.intellij.psi.tree.IElementType;
import com.intellij.util.IncorrectOperationException;
/**
* @author ven
* Consider using instead
* {@link com.siyeh.ig.psiutils.BoolUtils#getNegatedExpressionText(com.intellij.psi.PsiExpression)}
*
* to be deleted in 2018.2
*/
@Deprecated
public class CodeInsightServicesUtil {
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.CodeInsightServicesUtil");
@@ -80,7 +80,10 @@ public class BoolUtils {
}
if (expression instanceof PsiParenthesizedExpression) {
final PsiParenthesizedExpression parenthesizedExpression = (PsiParenthesizedExpression)expression;
return '(' + getNegatedExpressionText(parenthesizedExpression.getExpression(), tracker) + ')';
PsiExpression operand = parenthesizedExpression.getExpression();
if (operand != null) {
return '(' + getNegatedExpressionText(operand, tracker) + ')';
}
}
if (expression instanceof PsiConditionalExpression) {
final PsiConditionalExpression conditionalExpression = (PsiConditionalExpression)expression;
@@ -147,6 +150,12 @@ public class BoolUtils {
return (newPrecedence > precedence) ? '(' + join + ')' : join;
}
}
if (expression instanceof PsiLiteralExpression) {
Object value = ((PsiLiteralExpression)expression).getValue();
if (value instanceof Boolean) {
return String.valueOf(!((Boolean)value));
}
}
return '!' + ParenthesesUtils.getText(tracker.markUnchanged(expression), ParenthesesUtils.PREFIX_PRECEDENCE);
}