Make "Expand boolean" intention work for variable declarations

This commit is contained in:
Bas Leijdekkers
2012-10-08 18:12:19 +02:00
parent 7d25396fa1
commit 9c2234454d
2 changed files with 60 additions and 44 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2003-2010 Dave Griffith, Bas Leijdekkers
* Copyright 2003-2012 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,25 +33,20 @@ public class ExpandBooleanIntention extends Intention {
}
@Override
public void processIntention(@NotNull PsiElement element)
throws IncorrectOperationException {
final PsiStatement containingStatement =
PsiTreeUtil.getParentOfType(element, PsiStatement.class);
public void processIntention(@NotNull PsiElement element) throws IncorrectOperationException {
final PsiStatement containingStatement = PsiTreeUtil.getParentOfType(element, PsiStatement.class);
if (containingStatement == null) {
return;
}
if (ExpandBooleanPredicate.isBooleanAssignment(containingStatement)) {
final PsiExpressionStatement assignmentStatement =
(PsiExpressionStatement)containingStatement;
final PsiAssignmentExpression assignmentExpression =
(PsiAssignmentExpression)assignmentStatement.getExpression();
final PsiExpressionStatement assignmentStatement = (PsiExpressionStatement)containingStatement;
final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)assignmentStatement.getExpression();
final PsiExpression rhs = assignmentExpression.getRExpression();
if (rhs == null) {
return;
}
final PsiExpression lhs = assignmentExpression.getLExpression();
if (ErrorUtil.containsDeepError(lhs) ||
ErrorUtil.containsDeepError(rhs)) {
if (ErrorUtil.containsDeepError(lhs) || ErrorUtil.containsDeepError(rhs)) {
return;
}
final String rhsText = rhs.getText();
@@ -65,16 +60,11 @@ public class ExpandBooleanIntention extends Intention {
else {
conditionText = rhsText;
}
@NonNls final String statement =
"if(" + conditionText + ") " + lhsText + " = true; else " +
lhsText + " = false;";
@NonNls final String statement = "if(" + conditionText + ") " + lhsText + " = true; else " + lhsText + " = false;";
replaceStatement(statement, containingStatement);
}
else if (ExpandBooleanPredicate.isBooleanReturn(
containingStatement)) {
final PsiReturnStatement returnStatement =
(PsiReturnStatement)containingStatement;
else if (ExpandBooleanPredicate.isBooleanReturn(containingStatement)) {
final PsiReturnStatement returnStatement = (PsiReturnStatement)containingStatement;
final PsiExpression returnValue = returnStatement.getReturnValue();
if (returnValue == null) {
return;
@@ -83,9 +73,26 @@ public class ExpandBooleanIntention extends Intention {
return;
}
final String valueText = returnValue.getText();
@NonNls final String statement =
"if(" + valueText + ") return true; else return false;";
@NonNls final String statement = "if(" + valueText + ") return true; else return false;";
replaceStatement(statement, containingStatement);
}
else if (ExpandBooleanPredicate.isBooleanDeclaration(containingStatement)) {
final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)containingStatement;
final PsiElement declaredElement = declarationStatement.getDeclaredElements()[0];
if (!(declaredElement instanceof PsiLocalVariable)) {
return;
}
final PsiLocalVariable variable = (PsiLocalVariable)declaredElement;
final PsiExpression initializer = variable.getInitializer();
if (initializer == null) {
return;
}
final String name = variable.getName();
@NonNls final String newStatementText = "if(" + initializer.getText() + ") " + name +"=true; else " + name + "=false;";
final PsiElementFactory factory = JavaPsiFacade.getElementFactory(containingStatement.getProject());
final PsiStatement newStatement = factory.createStatementFromText(newStatementText, containingStatement);
declarationStatement.getParent().addAfter(newStatement, declarationStatement);
initializer.delete();
}
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2003-2010 Dave Griffith, Bas Leijdekkers
* Copyright 2003-2012 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,6 @@ package com.siyeh.ipp.trivialif;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.siyeh.ipp.base.PsiElementPredicate;
import com.siyeh.ipp.psiutils.ErrorUtil;
class ExpandBooleanPredicate implements PsiElementPredicate {
@@ -26,53 +25,63 @@ class ExpandBooleanPredicate implements PsiElementPredicate {
if (!(element instanceof PsiJavaToken)) {
return false;
}
final PsiStatement containingStatement =
PsiTreeUtil.getParentOfType(element,
PsiStatement.class);
final PsiStatement containingStatement = PsiTreeUtil.getParentOfType(element, PsiStatement.class);
if (containingStatement == null) {
return false;
}
return isBooleanReturn(containingStatement) ||
isBooleanAssignment(containingStatement);
return isBooleanReturn(containingStatement) || isBooleanAssignment(containingStatement) || isBooleanDeclaration(containingStatement);
}
public static boolean isBooleanReturn(PsiStatement containingStatement) {
if (!(containingStatement instanceof PsiReturnStatement)) {
public static boolean isBooleanReturn(PsiStatement statement) {
if (!(statement instanceof PsiReturnStatement)) {
return false;
}
final PsiReturnStatement returnStatement =
(PsiReturnStatement)containingStatement;
final PsiReturnStatement returnStatement = (PsiReturnStatement)statement;
final PsiExpression returnValue = returnStatement.getReturnValue();
if (returnValue == null || returnValue instanceof PsiLiteralExpression) {
return false;
}
final PsiType returnType = returnValue.getType();
if (!PsiType.BOOLEAN.equals(returnType)) {
return false;
}
return !ErrorUtil.containsError(returnValue);
return PsiType.BOOLEAN.equals(returnType);
}
public static boolean isBooleanAssignment(PsiStatement containingStatement) {
if (!(containingStatement instanceof PsiExpressionStatement)) {
public static boolean isBooleanAssignment(PsiStatement statement) {
if (!(statement instanceof PsiExpressionStatement)) {
return false;
}
final PsiExpressionStatement expressionStatement =
(PsiExpressionStatement)containingStatement;
final PsiExpressionStatement expressionStatement = (PsiExpressionStatement)statement;
final PsiExpression expression = expressionStatement.getExpression();
if (!(expression instanceof PsiAssignmentExpression)) {
return false;
}
final PsiAssignmentExpression assignment =
(PsiAssignmentExpression)expression;
final PsiAssignmentExpression assignment = (PsiAssignmentExpression)expression;
final PsiExpression rhs = assignment.getRExpression();
if (rhs == null || rhs instanceof PsiLiteralExpression) {
return false;
}
final PsiType assignmentType = rhs.getType();
if (!PsiType.BOOLEAN.equals(assignmentType)) {
return PsiType.BOOLEAN.equals(assignmentType);
}
public static boolean isBooleanDeclaration(PsiStatement statement) {
if (!(statement instanceof PsiDeclarationStatement)) {
return false;
}
return !ErrorUtil.containsError(rhs);
final PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)statement;
final PsiElement[] declaredElements = declarationStatement.getDeclaredElements();
if (declaredElements.length != 1) {
return false;
}
final PsiElement element = declaredElements[0];
if (!(element instanceof PsiLocalVariable)) {
return false;
}
final PsiLocalVariable variable = (PsiLocalVariable)element;
final PsiExpression initializer = variable.getInitializer();
if (initializer == null || initializer instanceof PsiLiteralExpression) {
return false;
}
final PsiType type = initializer.getType();
return PsiType.BOOLEAN.equals(type);
}
}