下面列出了怎么用org.eclipse.jdt.core.dom.InfixExpression.Operator的API类实例代码及写法,或者点击链接到github查看源代码。
private static Expression getInversedAndOrExpression(ASTRewrite rewrite, InfixExpression infixExpression, Operator newOperator, SimpleNameRenameProvider provider) {
InfixExpression newExpression = rewrite.getAST().newInfixExpression();
newExpression.setOperator(newOperator);
int newOperatorPrecedence = OperatorPrecedence.getOperatorPrecedence(newOperator);
Expression leftOperand = getInversedExpression(rewrite, infixExpression.getLeftOperand(), provider);
newExpression.setLeftOperand(parenthesizeIfRequired(leftOperand, newOperatorPrecedence));
Expression rightOperand = getInversedExpression(rewrite, infixExpression.getRightOperand(), provider);
newExpression.setRightOperand(parenthesizeIfRequired(rightOperand, newOperatorPrecedence));
List<Expression> extraOperands = infixExpression.extendedOperands();
List<Expression> newExtraOperands = newExpression.extendedOperands();
for (int i = 0; i < extraOperands.size(); i++) {
Expression extraOperand = getInversedExpression(rewrite, extraOperands.get(i), provider);
newExtraOperands.add(parenthesizeIfRequired(extraOperand, newOperatorPrecedence));
}
return newExpression;
}
private static void breakInfixOperationAtOperation(ASTRewrite rewrite, Expression expression, Operator operator, int operatorOffset, boolean removeParentheses, Expression[] res) {
if (expression.getStartPosition() + expression.getLength() <= operatorOffset) {
// add to the left
res[0] = combineOperands(rewrite, res[0], expression, removeParentheses, operator);
return;
}
if (operatorOffset <= expression.getStartPosition()) {
// add to the right
res[1] = combineOperands(rewrite, res[1], expression, removeParentheses, operator);
return;
}
if (!(expression instanceof InfixExpression)) {
throw new IllegalArgumentException("Cannot break up non-infix expression"); //$NON-NLS-1$
}
InfixExpression infixExpression = (InfixExpression) expression;
if (infixExpression.getOperator() != operator) {
throw new IllegalArgumentException("Incompatible operator"); //$NON-NLS-1$
}
breakInfixOperationAtOperation(rewrite, infixExpression.getLeftOperand(), operator, operatorOffset, removeParentheses, res);
breakInfixOperationAtOperation(rewrite, infixExpression.getRightOperand(), operator, operatorOffset, removeParentheses, res);
List<Expression> extended = infixExpression.extendedOperands();
for (int i = 0; i < extended.size(); i++) {
breakInfixOperationAtOperation(rewrite, extended.get(i), operator, operatorOffset, removeParentheses, res);
}
}
private static Expression combineOperands(ASTRewrite rewrite, Expression existing, Expression originalNode, boolean removeParentheses, Operator operator) {
if (existing == null && removeParentheses) {
while (originalNode instanceof ParenthesizedExpression) {
originalNode = ((ParenthesizedExpression) originalNode).getExpression();
}
}
Expression newRight = (Expression) rewrite.createMoveTarget(originalNode);
if (originalNode instanceof InfixExpression) {
((InfixExpression) newRight).setOperator(((InfixExpression) originalNode).getOperator());
}
if (existing == null) {
return newRight;
}
AST ast = rewrite.getAST();
InfixExpression infix = ast.newInfixExpression();
infix.setOperator(operator);
infix.setLeftOperand(existing);
infix.setRightOperand(newRight);
return infix;
}
@Override
protected void repairBug(ASTRewrite rewrite, CompilationUnit workingUnit, BugInstance bug) throws BugResolutionException {
Assert.isNotNull(rewrite);
Assert.isNotNull(workingUnit);
Assert.isNotNull(bug);
InfixExpression[] stringEqualityChecks = findStringEqualityChecks(getASTNode(workingUnit, bug.getPrimarySourceLineAnnotation()));
for (InfixExpression stringEqualityCheck : stringEqualityChecks) {
Operator operator = stringEqualityCheck.getOperator();
Expression replaceExpression;
if (EQUALS.equals(operator)) {
replaceExpression = createEqualsExpression(rewrite, stringEqualityCheck);
} else if (NOT_EQUALS.equals(operator)) {
replaceExpression = createNotEqualsExpression(rewrite, stringEqualityCheck);
} else {
throw new BugResolutionException("Illegal operator '" + operator + "' found.");
}
rewrite.replace(stringEqualityCheck, replaceExpression, null);
}
}
/**
* Returns the precedence of an infix operator. Operators
* with higher precedence are executed before expressions
* with lower precedence.
* <br>
* i.e. in: <br>
* <code>3 + 4 - 5 * 6;</code><br>
* the precedence order is
* <ul>
* <li>*</li>
* <li>+</li>
* <li>-</li>
* </ul>
* 1. 5,6 -(*)-> 30<br>
* 2. 3,4 -(+)-> 7<br>
* 3. 7,30 -(-)-> -23<br>
*
* @param operator the expression to determine the precedence for
* @return the precedence the higher to stronger the binding to its operands
*/
public static int getOperatorPrecedence(Operator operator) {
if (operator == Operator.CONDITIONAL_OR) {
return CONDITIONAL_OR;
} else if (operator == Operator.CONDITIONAL_AND) {
return CONDITIONAL_AND;
} else if (operator == Operator.OR) {
return BITWISE_INCLUSIVE_OR;
} else if (operator == Operator.XOR) {
return BITWISE_EXCLUSIVE_OR;
} else if (operator == Operator.AND) {
return BITWISE_AND;
} else if (operator == Operator.EQUALS || operator == Operator.NOT_EQUALS) {
return EQUALITY;
} else if (operator == Operator.LESS || operator == Operator.LESS_EQUALS || operator == Operator.GREATER || operator == Operator.GREATER_EQUALS) {
return RELATIONAL;
} else if (operator == Operator.LEFT_SHIFT || operator == Operator.RIGHT_SHIFT_SIGNED || operator == Operator.RIGHT_SHIFT_UNSIGNED) {
return SHIFT;
} else if (operator == Operator.PLUS || operator == Operator.MINUS) {
return ADDITIVE;
} else if (operator == Operator.REMAINDER || operator == Operator.DIVIDE || operator == Operator.TIMES) {
return MULTIPLICATIVE;
}
return Integer.MAX_VALUE;
}
private static boolean isAssociative(InfixExpression.Operator operator, ITypeBinding infixExprType, boolean isAllOperandsHaveSameType) {
if (operator == InfixExpression.Operator.PLUS)
return isStringType(infixExprType) || isIntegerType(infixExprType) && isAllOperandsHaveSameType;
if (operator == InfixExpression.Operator.TIMES)
return isIntegerType(infixExprType) && isAllOperandsHaveSameType;
if (operator == InfixExpression.Operator.CONDITIONAL_AND
|| operator == InfixExpression.Operator.CONDITIONAL_OR
|| operator == InfixExpression.Operator.AND
|| operator == InfixExpression.Operator.OR
|| operator == InfixExpression.Operator.XOR)
return true;
return false;
}
/**
* Returns the type of infix expression based on its operands and operator.
*
* @param operator the operator of infix expression
* @param leftOperandType the type of left operand of infix expression
* @param rightOperandType the type of right operand of infix expression
* @return the type of infix expression if the type of both the operands is same or if the type
* of either operand of a + operator is String, <code>null</code> otherwise.
*
* @since 3.9
*/
private static ITypeBinding getInfixExpressionType(InfixExpression.Operator operator, ITypeBinding leftOperandType, ITypeBinding rightOperandType) {
if (leftOperandType == rightOperandType) {
return leftOperandType;
}
if (operator == InfixExpression.Operator.PLUS) {
if (isStringType(leftOperandType)) {
return leftOperandType;
} else if (isStringType(rightOperandType)) {
return rightOperandType;
}
}
// If the left and right operand types are different, we assume that parentheses are needed.
// This is to avoid complications of numeric promotions and for readability of complicated code.
return null;
}
@Override
protected void addMemberCheckNull(Object member, boolean addSeparator) {
IfStatement ifStatement= fAst.newIfStatement();
ifStatement.setExpression(createInfixExpression(createMemberAccessExpression(member, true, true), Operator.NOT_EQUALS, fAst.newNullLiteral()));
Block thenBlock= fAst.newBlock();
flushBuffer(null);
String[] arrayString= getContext().getTemplateParser().getBody();
for (int i= 0; i < arrayString.length; i++) {
addElement(processElement(arrayString[i], member), thenBlock);
}
if (addSeparator)
addElement(getContext().getTemplateParser().getSeparator(), thenBlock);
flushBuffer(thenBlock);
if (thenBlock.statements().size() == 1 && !getContext().isForceBlocks()) {
ifStatement.setThenStatement((Statement)ASTNode.copySubtree(fAst, (ASTNode)thenBlock.statements().get(0)));
} else {
ifStatement.setThenStatement(thenBlock);
}
toStringMethod.getBody().statements().add(ifStatement);
}
@Override
protected void addMemberCheckNull(Object member, boolean addSeparator) {
IfStatement ifStatement= fAst.newIfStatement();
ifStatement.setExpression(createInfixExpression(createMemberAccessExpression(member, true, true), Operator.NOT_EQUALS, fAst.newNullLiteral()));
Block thenBlock= fAst.newBlock();
flushTemporaryExpression();
String[] arrayString= getContext().getTemplateParser().getBody();
for (int i= 0; i < arrayString.length; i++) {
addElement(processElement(arrayString[i], member), thenBlock);
}
if (addSeparator)
addElement(getContext().getTemplateParser().getSeparator(), thenBlock);
flushTemporaryExpression();
if (thenBlock.statements().size() == 1 && !getContext().isForceBlocks()) {
ifStatement.setThenStatement((Statement)ASTNode.copySubtree(fAst, (ASTNode)thenBlock.statements().get(0)));
} else {
ifStatement.setThenStatement(thenBlock);
}
toStringMethod.getBody().statements().add(ifStatement);
}
private Statement createAddQualifiedHashCode(IVariableBinding binding) {
MethodInvocation invoc= fAst.newMethodInvocation();
invoc.setExpression(getThisAccessForHashCode(binding.getName()));
invoc.setName(fAst.newSimpleName(METHODNAME_HASH_CODE));
InfixExpression expr= fAst.newInfixExpression();
expr.setOperator(Operator.EQUALS);
expr.setLeftOperand(getThisAccessForHashCode(binding.getName()));
expr.setRightOperand(fAst.newNullLiteral());
ConditionalExpression cexpr= fAst.newConditionalExpression();
cexpr.setThenExpression(fAst.newNumberLiteral("0")); //$NON-NLS-1$
cexpr.setElseExpression(invoc);
cexpr.setExpression(parenthesize(expr));
return prepareAssignment(parenthesize(cexpr));
}
private Expression createShiftAssignment(Expression shift1, Expression shift2) {
// (int)(element ^ (element >>> 32));
// see implementation in Arrays.hashCode(), Double.hashCode() and
// Long.hashCode()
CastExpression ce= fAst.newCastExpression();
ce.setType(fAst.newPrimitiveType(PrimitiveType.INT));
InfixExpression unsignedShiftRight= fAst.newInfixExpression();
unsignedShiftRight.setLeftOperand(shift1);
unsignedShiftRight.setRightOperand(fAst.newNumberLiteral("32")); //$NON-NLS-1$
unsignedShiftRight.setOperator(Operator.RIGHT_SHIFT_UNSIGNED);
InfixExpression xor= fAst.newInfixExpression();
xor.setLeftOperand(shift2);
xor.setRightOperand(parenthesize(unsignedShiftRight));
xor.setOperator(InfixExpression.Operator.XOR);
ce.setExpression(parenthesize(xor));
return ce;
}
private Statement prepareAssignment(Expression rightHand) {
// result = PRIME*result + (...)
InfixExpression mul= fAst.newInfixExpression();
mul.setLeftOperand(fAst.newSimpleName(VARIABLE_NAME_PRIME));
mul.setRightOperand(fAst.newSimpleName(VARIABLE_NAME_RESULT));
mul.setOperator(Operator.TIMES);
Assignment ass= fAst.newAssignment();
ass.setLeftHandSide(fAst.newSimpleName(VARIABLE_NAME_RESULT));
InfixExpression plus= fAst.newInfixExpression();
plus.setLeftOperand(mul);
plus.setOperator(Operator.PLUS);
plus.setRightOperand(rightHand);
ass.setRightHandSide(plus);
return fAst.newExpressionStatement(ass);
}
private Statement createOuterComparison() {
MethodInvocation outer1= fAst.newMethodInvocation();
outer1.setName(fAst.newSimpleName(METHODNAME_OUTER_TYPE));
MethodInvocation outer2= fAst.newMethodInvocation();
outer2.setName(fAst.newSimpleName(METHODNAME_OUTER_TYPE));
outer2.setExpression(fAst.newSimpleName(VARIABLE_NAME_EQUALS_CASTED));
MethodInvocation outerEql= fAst.newMethodInvocation();
outerEql.setName(fAst.newSimpleName(METHODNAME_EQUALS));
outerEql.setExpression(outer1);
outerEql.arguments().add(outer2);
PrefixExpression not= fAst.newPrefixExpression();
not.setOperand(outerEql);
not.setOperator(PrefixExpression.Operator.NOT);
IfStatement notEqNull= fAst.newIfStatement();
notEqNull.setExpression(not);
notEqNull.setThenStatement(getThenStatement(getReturnFalse()));
return notEqNull;
}
private Statement createArrayComparison(String name) {
MethodInvocation invoc= fAst.newMethodInvocation();
invoc.setName(fAst.newSimpleName(METHODNAME_EQUALS));
invoc.setExpression(getQualifiedName(JAVA_UTIL_ARRAYS));
invoc.arguments().add(getThisAccessForEquals(name));
invoc.arguments().add(getOtherAccess(name));
PrefixExpression pe= fAst.newPrefixExpression();
pe.setOperator(PrefixExpression.Operator.NOT);
pe.setOperand(invoc);
IfStatement ifSt= fAst.newIfStatement();
ifSt.setExpression(pe);
ifSt.setThenStatement(getThenStatement(getReturnFalse()));
return ifSt;
}
private Statement createMultiArrayComparison(String name) {
MethodInvocation invoc= fAst.newMethodInvocation();
invoc.setName(fAst.newSimpleName(METHODNAME_DEEP_EQUALS));
invoc.setExpression(getQualifiedName(JAVA_UTIL_ARRAYS));
invoc.arguments().add(getThisAccessForEquals(name));
invoc.arguments().add(getOtherAccess(name));
PrefixExpression pe= fAst.newPrefixExpression();
pe.setOperator(PrefixExpression.Operator.NOT);
pe.setOperand(invoc);
IfStatement ifSt= fAst.newIfStatement();
ifSt.setExpression(pe);
ifSt.setThenStatement(getThenStatement(getReturnFalse()));
return ifSt;
}
private static Expression getInversedAndOrExpression(ASTRewrite rewrite, InfixExpression infixExpression, Operator newOperator, SimpleNameRenameProvider provider) {
InfixExpression newExpression= rewrite.getAST().newInfixExpression();
newExpression.setOperator(newOperator);
int newOperatorPrecedence= OperatorPrecedence.getOperatorPrecedence(newOperator);
//
Expression leftOperand= getInversedExpression(rewrite, infixExpression.getLeftOperand(), provider);
newExpression.setLeftOperand(parenthesizeIfRequired(leftOperand, newOperatorPrecedence));
Expression rightOperand= getInversedExpression(rewrite, infixExpression.getRightOperand(), provider);
newExpression.setRightOperand(parenthesizeIfRequired(rightOperand, newOperatorPrecedence));
List<Expression> extraOperands= infixExpression.extendedOperands();
List<Expression> newExtraOperands= newExpression.extendedOperands();
for (int i= 0; i < extraOperands.size(); i++) {
Expression extraOperand= getInversedExpression(rewrite, extraOperands.get(i), provider);
newExtraOperands.add(parenthesizeIfRequired(extraOperand, newOperatorPrecedence));
}
return newExpression;
}
private static void breakInfixOperationAtOperation(ASTRewrite rewrite, Expression expression, Operator operator, int operatorOffset, boolean removeParentheses, Expression[] res) {
if (expression.getStartPosition() + expression.getLength() <= operatorOffset) {
// add to the left
res[0]= combineOperands(rewrite, res[0], expression, removeParentheses, operator);
return;
}
if (operatorOffset <= expression.getStartPosition()) {
// add to the right
res[1]= combineOperands(rewrite, res[1], expression, removeParentheses, operator);
return;
}
if (!(expression instanceof InfixExpression)) {
throw new IllegalArgumentException("Cannot break up non-infix expression"); //$NON-NLS-1$
}
InfixExpression infixExpression= (InfixExpression) expression;
if (infixExpression.getOperator() != operator) {
throw new IllegalArgumentException("Incompatible operator"); //$NON-NLS-1$
}
breakInfixOperationAtOperation(rewrite, infixExpression.getLeftOperand(), operator, operatorOffset, removeParentheses, res);
breakInfixOperationAtOperation(rewrite, infixExpression.getRightOperand(), operator, operatorOffset, removeParentheses, res);
List<Expression> extended= infixExpression.extendedOperands();
for (int i= 0; i < extended.size(); i++) {
breakInfixOperationAtOperation(rewrite, extended.get(i), operator, operatorOffset, removeParentheses, res);
}
}
private static Expression combineOperands(ASTRewrite rewrite, Expression existing, Expression originalNode, boolean removeParentheses, Operator operator) {
if (existing == null && removeParentheses) {
while (originalNode instanceof ParenthesizedExpression) {
originalNode= ((ParenthesizedExpression)originalNode).getExpression();
}
}
Expression newRight= (Expression)rewrite.createMoveTarget(originalNode);
if (originalNode instanceof InfixExpression) {
((InfixExpression)newRight).setOperator(((InfixExpression)originalNode).getOperator());
}
if (existing == null) {
return newRight;
}
AST ast= rewrite.getAST();
InfixExpression infix= ast.newInfixExpression();
infix.setOperator(operator);
infix.setLeftOperand(existing);
infix.setRightOperand(newRight);
return infix;
}
private static Expression getInversedNotExpression(ASTRewrite rewrite, Expression expression, AST ast) {
PrefixExpression prefixExpression = ast.newPrefixExpression();
prefixExpression.setOperator(PrefixExpression.Operator.NOT);
ParenthesizedExpression parenthesizedExpression = getParenthesizedExpression(ast, (Expression) rewrite.createCopyTarget(expression));
prefixExpression.setOperand(parenthesizedExpression);
return prefixExpression;
}
private static Expression getInversedInfixExpression(ASTRewrite rewrite, InfixExpression expression, InfixExpression.Operator newOperator, SimpleNameRenameProvider provider) {
InfixExpression newExpression = rewrite.getAST().newInfixExpression();
newExpression.setOperator(newOperator);
newExpression.setLeftOperand(getRenamedNameCopy(provider, rewrite, expression.getLeftOperand()));
newExpression.setRightOperand(getRenamedNameCopy(provider, rewrite, expression.getRightOperand()));
return newExpression;
}
protected Expression createNotEqualsExpression(ASTRewrite rewrite, InfixExpression stringEqualityCheck) {
Expression equalsExpression = createEqualsExpression(rewrite, stringEqualityCheck);
final AST ast = rewrite.getAST();
PrefixExpression prefixExpression = ast.newPrefixExpression();
prefixExpression.setOperator(PrefixExpression.Operator.NOT);
prefixExpression.setOperand(equalsExpression);
return prefixExpression;
}
/**
* This one also takes care of expanded expressions like true || (41 == 42) &&
* booleanAttribute
*/
@Override
public boolean visit(InfixExpression node) {
if ((node.getOperator().equals(Operator.AND) || node.getOperator().equals(Operator.OR))
&& importer.topFromContainerStack(Method.class) != null) {
importer.topFromContainerStack(Method.class).incCyclomaticComplexity();
}
importer.createAccessFromExpression((Expression) node.getLeftOperand());
importer.createAccessFromExpression((Expression) node.getRightOperand());
return true;
}
public static Expression newInfixExpression(AST ast, Operator operator, ArrayList<Expression> operands) {
if (operands.size() == 1)
return operands.get(0);
InfixExpression result= ast.newInfixExpression();
result.setOperator(operator);
result.setLeftOperand(operands.get(0));
result.setRightOperand(operands.get(1));
result.extendedOperands().addAll(operands.subList(2, operands.size()));
return result;
}
@Override
protected void addMemberCheckNull(Object member, boolean addSeparator) {
ConditionalExpression cExpression= fAst.newConditionalExpression();
// member != null ?
InfixExpression infExpression= fAst.newInfixExpression();
infExpression.setLeftOperand(createMemberAccessExpression(member, true, true));
infExpression.setRightOperand(fAst.newNullLiteral());
infExpression.setOperator(Operator.NOT_EQUALS);
cExpression.setExpression(infExpression);
SumExpressionBuilder builder= new SumExpressionBuilder(null);
String[] arrayString= getContext().getTemplateParser().getBody();
for (int i= 0; i < arrayString.length; i++) {
addElement(processElement(arrayString[i], member), builder);
}
if (addSeparator)
addElement(getContext().getTemplateParser().getSeparator(), builder);
cExpression.setThenExpression(builder.getExpression());
StringLiteral literal= fAst.newStringLiteral();
literal.setLiteralValue(getContext().isSkipNulls() ? "" : "null"); //$NON-NLS-1$ //$NON-NLS-2$
cExpression.setElseExpression(literal);
ParenthesizedExpression pExpression= fAst.newParenthesizedExpression();
pExpression.setExpression(cExpression);
toStringExpressionBuilder.addExpression(pExpression);
}
private Expression createSumExpression(Expression left, Expression right) {
if (right == null)
return left;
if (left == null)
return right;
return createInfixExpression(left, Operator.PLUS, right);
}
protected InfixExpression createInfixExpression(Expression leftOperand, Operator operator, Expression rightOperand) {
InfixExpression expression= fAst.newInfixExpression();
expression.setLeftOperand(leftOperand);
expression.setOperator(operator);
expression.setRightOperand(rightOperand);
return expression;
}
private Statement createSimpleComparison(IVariableBinding binding) {
if (isPrimitiveType(binding.getType(), PrimitiveType.FLOAT)) {
return createReturningIfStatement(createFloatInvocation(getThisAccessForEquals(binding.getName())), createFloatInvocation(getOtherAccess(binding
.getName())), Operator.NOT_EQUALS, false);
} else if (isPrimitiveType(binding.getType(), PrimitiveType.DOUBLE)) {
return createReturningIfStatement(createDoubleInvocation(getThisAccessForEquals(binding.getName())), createDoubleInvocation(getOtherAccess(binding
.getName())), Operator.NOT_EQUALS, false);
} else
return createReturningIfStatement(getThisAccessForEquals(binding.getName()), getOtherAccess(binding.getName()), Operator.NOT_EQUALS, false);
}
private Statement createReturningIfStatement(Expression left, Expression right, Operator operator, boolean whatToReturn) {
InfixExpression newCondition= fAst.newInfixExpression();
newCondition.setOperator(operator);
newCondition.setLeftOperand(left);
newCondition.setRightOperand(right);
return createReturningIfStatement(whatToReturn, newCondition);
}
private static Expression getInversedNotExpression(ASTRewrite rewrite, Expression expression, AST ast) {
PrefixExpression prefixExpression= ast.newPrefixExpression();
prefixExpression.setOperator(PrefixExpression.Operator.NOT);
ParenthesizedExpression parenthesizedExpression= getParenthesizedExpression(ast, (Expression)rewrite.createCopyTarget(expression));
prefixExpression.setOperand(parenthesizedExpression);
return prefixExpression;
}
private static Expression getInversedInfixExpression(ASTRewrite rewrite, InfixExpression expression, InfixExpression.Operator newOperator, SimpleNameRenameProvider provider) {
InfixExpression newExpression= rewrite.getAST().newInfixExpression();
newExpression.setOperator(newOperator);
newExpression.setLeftOperand(getRenamedNameCopy(provider, rewrite, expression.getLeftOperand()));
newExpression.setRightOperand(getRenamedNameCopy(provider, rewrite, expression.getRightOperand()));
return newExpression;
}