下面列出了怎么用org.eclipse.jdt.core.dom.PostfixExpression的API类实例代码及写法,或者点击链接到github查看源代码。
private PostfixExpr visit(PostfixExpression node) {
int startLine = _cunit.getLineNumber(node.getStartPosition());
int endLine = _cunit.getLineNumber(node.getStartPosition() + node.getLength());
PostfixExpr postfixExpr = new PostfixExpr(startLine, endLine, node);
Expr expression = (Expr) process(node.getOperand());
expression.setParent(postfixExpr);
postfixExpr.setExpression(expression);
postfixExpr.setOperator(node.getOperator());
Type exprType = NodeUtils.parseExprType(expression, node.getOperator().toString(), null);
postfixExpr.setType(exprType);
return postfixExpr;
}
private static boolean isLeftValue(ASTNode node) {
ASTNode parent = node.getParent();
if (parent instanceof Assignment) {
Assignment assignment = (Assignment) parent;
if (assignment.getLeftHandSide() == node) {
return true;
}
}
if (parent instanceof PostfixExpression) {
return true;
}
if (parent instanceof PrefixExpression) {
PrefixExpression.Operator op = ((PrefixExpression) parent).getOperator();
if (op.equals(PrefixExpression.Operator.DECREMENT)) {
return true;
}
if (op.equals(PrefixExpression.Operator.INCREMENT)) {
return true;
}
return false;
}
return false;
}
private static boolean isLeftValue(ASTNode node) {
ASTNode parent = node.getParent();
if (parent instanceof Assignment) {
Assignment assignment = (Assignment) parent;
if (assignment.getLeftHandSide() == node) {
return true;
}
}
if (parent instanceof PostfixExpression) {
return true;
}
if (parent instanceof PrefixExpression) {
PrefixExpression.Operator op = ((PrefixExpression) parent).getOperator();
if (op.equals(PrefixExpression.Operator.DECREMENT)) {
return true;
}
if (op.equals(PrefixExpression.Operator.INCREMENT)) {
return true;
}
return false;
}
return false;
}
private static boolean isLeftValue(ASTNode node) {
ASTNode parent= node.getParent();
if (parent instanceof Assignment) {
Assignment assignment= (Assignment) parent;
if (assignment.getLeftHandSide() == node)
return true;
}
if (parent instanceof PostfixExpression)
return true;
if (parent instanceof PrefixExpression) {
PrefixExpression.Operator op= ((PrefixExpression) parent).getOperator();
if (op.equals(PrefixExpression.Operator.DECREMENT))
return true;
if (op.equals(PrefixExpression.Operator.INCREMENT))
return true;
return false;
}
return false;
}
@Override
public boolean visit(PostfixExpression node) {
Expression operand= node.getOperand();
if (!considerBinding(resolveBinding(operand), operand))
return true;
ASTNode parent= node.getParent();
if (!(parent instanceof ExpressionStatement)) {
fStatus.addError(RefactoringCoreMessages.SelfEncapsulateField_AccessAnalyzer_cannot_convert_postfix_expression,
JavaStatusContext.create(fCUnit, SourceRangeFactory.create(node)));
return false;
}
fRewriter.replace(node,
createInvocation(node.getAST(), node.getOperand(), node.getOperator().toString()),
createGroupDescription(POSTFIX_ACCESS));
return false;
}
private boolean isUpdated(Expression expr) {
if(expr.getParent() instanceof Assignment) {
Assignment assignment = (Assignment)expr.getParent();
if(assignment.getLeftHandSide().equals(expr)) {
return true;
}
}
else if(expr.getParent() instanceof PostfixExpression) {
return true;
}
else if(expr.getParent() instanceof PrefixExpression) {
PrefixExpression prefix = (PrefixExpression)expr.getParent();
if(prefix.getOperator().equals(PrefixExpression.Operator.INCREMENT) ||
prefix.getOperator().equals(PrefixExpression.Operator.DECREMENT)) {
return true;
}
}
return false;
}
public static boolean isUpdatingVariable(Expression updater, SimpleName variable)
{
if (updater instanceof PrefixExpression)
{
PrefixExpression prefixExpression = (PrefixExpression) updater;
return isSameVariable(prefixExpression.getOperand(), variable);
}
else if (updater instanceof PostfixExpression)
{
PostfixExpression postfixExpression = (PostfixExpression) updater;
return isSameVariable(postfixExpression.getOperand(), variable);
}
else if (updater instanceof Assignment)
{
Assignment assignment = (Assignment) updater;
return isSameVariable(assignment.getLeftHandSide(), variable);
}
else if (updater instanceof MethodInvocation)
{
MethodInvocation methodInvocation = (MethodInvocation) updater;
return isSameVariable(methodInvocation.getExpression(), variable);
}
return false;
}
public static Integer getUpdateValue(Expression updater)
{
if (updater instanceof PrefixExpression || updater instanceof PostfixExpression)
{
return AbstractLoopUtilities.getIncrementValue(updater);
}
else if (updater instanceof Assignment)
{
Assignment assignment = (Assignment) updater;
return assignmentUpdateValue(assignment);
}
else if (updater instanceof MethodInvocation)
{
MethodInvocation methodInvocation = (MethodInvocation) updater;
AbstractLoopBindingInformation bindingInformation = AbstractLoopBindingInformation.getInstance();
return bindingInformation.getUpdateMethodValue(methodInvocation.resolveMethodBinding().getMethodDeclaration().getKey());
}
return null;
}
private static Integer getIncrementValue(Expression expression)
{
Integer incrementValue = null;
String operator = null;
if (expression instanceof PrefixExpression)
{
PrefixExpression prefixExpression = (PrefixExpression) expression;
operator = prefixExpression.getOperator().toString();
}
else if (expression instanceof PostfixExpression)
{
PostfixExpression postfixExpression = (PostfixExpression) expression;
operator = postfixExpression.getOperator().toString();
}
if (operator != null && operator.equals("++"))
{
incrementValue = 1;
}
else if (operator != null && operator.equals("--"))
{
incrementValue = (-1);
}
return incrementValue;
}
public static PostfixOperator getPostfixOperator(PostfixExpression.Operator operator) {
switch (operator.toString()) {
case "++":
return PostfixOperator.INCREMENT;
case "--":
return PostfixOperator.DECREMENT;
default:
return null;
}
}
@Override
public boolean visit(PostfixExpression node) {
Expression operand = node.getOperand();
if (!considerBinding(resolveBinding(operand), operand)) {
return true;
}
ASTNode parent = node.getParent();
if (!(parent instanceof ExpressionStatement)) {
fStatus.addError(RefactoringCoreMessages.SelfEncapsulateField_AccessAnalyzer_cannot_convert_postfix_expression, JavaStatusContext.create(fCUnit, SourceRangeFactory.create(node)));
return false;
}
fRewriter.replace(node, createInvocation(node.getAST(), node.getOperand(), node.getOperator().toString()), createGroupDescription(POSTFIX_ACCESS));
return false;
}
public Iterable<Expression> findAssignmentsInBlock(final Block scope, final VariableDeclaration varDecl) {
final Function1<Expression, Boolean> _function = (Expression it) -> {
Expression name = null;
boolean _matched = false;
if (it instanceof Assignment) {
_matched=true;
name = ((Assignment)it).getLeftHandSide();
}
if (!_matched) {
if (it instanceof PrefixExpression) {
_matched=true;
name = ((PrefixExpression)it).getOperand();
}
}
if (!_matched) {
if (it instanceof PostfixExpression) {
_matched=true;
name = ((PostfixExpression)it).getOperand();
}
}
if ((name instanceof Name)) {
final IBinding binding = ((Name)name).resolveBinding();
if ((binding instanceof IVariableBinding)) {
final IVariableBinding declBinding = varDecl.resolveBinding();
return Boolean.valueOf((varDecl.getName().getIdentifier().equals(this.toSimpleName(((Name)name))) && ((IVariableBinding)binding).equals(declBinding)));
}
}
return Boolean.valueOf(false);
};
return this.findAssignmentsInBlock(scope, _function);
}
public Boolean isAssignedInBody(final Block scope, final SimpleName nameToLookFor) {
final Function1<Expression, Boolean> _function = (Expression it) -> {
Expression simpleName = null;
boolean _matched = false;
if (it instanceof Assignment) {
_matched=true;
simpleName = ((Assignment)it).getLeftHandSide();
}
if (!_matched) {
if (it instanceof PrefixExpression) {
_matched=true;
simpleName = ((PrefixExpression)it).getOperand();
}
}
if (!_matched) {
if (it instanceof PostfixExpression) {
_matched=true;
simpleName = ((PostfixExpression)it).getOperand();
}
}
if ((simpleName instanceof SimpleName)) {
return Boolean.valueOf(((simpleName != null) && nameToLookFor.getIdentifier().equals(((SimpleName)simpleName).getIdentifier())));
}
return Boolean.valueOf(false);
};
boolean _isEmpty = IterableExtensions.isEmpty(this.findAssignmentsInBlock(scope, _function));
return Boolean.valueOf((!_isEmpty));
}
public boolean visit(PostfixExpression node) {
postfixExpressions.add(node.toString());
if(current.getUserObject() != null) {
AnonymousClassDeclarationObject anonymous = (AnonymousClassDeclarationObject)current.getUserObject();
anonymous.getPostfixExpressions().add(node.toString());
}
return super.visit(node);
}
private boolean labelMatch(ASTNode nodeM, ASTNode nodeN) {
if (nodeM.getNodeType() != nodeN.getNodeType())
return false;
if (nodeM instanceof Assignment)
return labelMatch((Assignment) nodeM, (Assignment) nodeN);
if (nodeM instanceof InfixExpression)
return labelMatch((InfixExpression) nodeM, (InfixExpression) nodeN);
if (nodeM instanceof PostfixExpression)
return labelMatch((PostfixExpression) nodeM, (PostfixExpression) nodeN);
if (nodeM instanceof PrefixExpression)
return labelMatch((PrefixExpression) nodeM, (PrefixExpression) nodeN);
return true;
}
public static char buildLabelForVector(ASTNode node) {
char label = (char) node.getNodeType();
if (node instanceof Expression) {
if (node.getClass().getSimpleName().endsWith("Literal")) {
return (char) (label | (node.toString().hashCode() << 7));
}
int type = node.getNodeType();
switch (type) {
case ASTNode.INFIX_EXPRESSION:
return (char) (label | (((InfixExpression) node).getOperator().toString().hashCode() << 7));
case ASTNode.SIMPLE_NAME:
return (char) (label | (node.toString().hashCode() << 7));
case ASTNode.POSTFIX_EXPRESSION:
return (char) (label | (((PostfixExpression) node).getOperator().toString().hashCode() << 7));
case ASTNode.PREFIX_EXPRESSION:
return (char) (label | (((PrefixExpression) node).getOperator().toString().hashCode() << 7));
default:
break;
}
} else if (node instanceof Modifier) {
return (char) (label | (node.toString().hashCode() << 7));
} else if (node instanceof Type) {
if (node instanceof PrimitiveType)
return (char) (label | (node.toString().hashCode() << 7));
} else if (node instanceof TextElement) {
return (char) (label | (node.toString().hashCode() << 7));
} else if (node instanceof TagElement) {
String tag = ((TagElement) node).getTagName();
if (tag != null)
return (char) (label | (((TagElement) node).getTagName().hashCode() << 7));
}
return label;
}
public static String buildASTLabel(ASTNode node) {
String label = node.getClass().getSimpleName();
if (node instanceof Expression) {
if (node.getClass().getSimpleName().endsWith("Literal")) {
return label + "(" + node.toString() + ")";
}
int type = node.getNodeType();
switch (type) {
case ASTNode.INFIX_EXPRESSION:
return label + "(" + ((InfixExpression) node).getOperator().toString() + ")";
case ASTNode.SIMPLE_NAME:
return label + "(" + node.toString() + ")";
case ASTNode.POSTFIX_EXPRESSION:
return label + "(" + ((PostfixExpression) node).getOperator().toString() + ")";
case ASTNode.PREFIX_EXPRESSION:
return label + "(" + ((PrefixExpression) node).getOperator().toString() + ")";
default:
break;
}
} else if (node instanceof Modifier) {
return label + "(" + node.toString() + ")";
} else if (node instanceof Type) {
if (node instanceof PrimitiveType)
return label + "(" + node.toString() + ")";
} else if (node instanceof TextElement) {
return label + "(" + node.toString() + ")";
} else if (node instanceof TagElement) {
String tag = ((TagElement) node).getTagName();
if (tag == null)
return label;
return label + "(" + tag + ")";
}
return label;
}
@Override
public final boolean visit(final PostfixExpression node) {
final IVariableBinding binding= getFieldBinding(node.getOperand());
if (binding != null)
fWritten.add(binding.getKey());
return true;
}
@Override
public boolean visit(PostfixExpression postfixExpression) {
if (postfixExpression.getOperand() == null)
return true;
if (! (postfixExpression.getOperand() instanceof SimpleName))
return true;
SimpleName simpleName= (SimpleName)postfixExpression.getOperand();
if (! isNameReferenceToTemp(simpleName))
return true;
fFirstAssignment= postfixExpression;
return false;
}
/**
* Returns the precedence of the expression. Expression
* with higher precedence are executed before expressions
* with lower precedence.
* i.e. in:
* <br><code> int a= ++3--;</code></br>
*
* the precedence order is
* <ul>
* <li>3</li>
* <li>++</li>
* <li>--</li>
* <li>=</li>
* </ul>
* 1. 3 -(++)-> 4<br>
* 2. 4 -(--)-> 3<br>
* 3. 3 -(=)-> a<br>
*
* @param expression the expression to determine the precedence for
* @return the precedence the higher to stronger the binding to its operand(s)
*/
public static int getExpressionPrecedence(Expression expression) {
if (expression instanceof InfixExpression) {
return getOperatorPrecedence(((InfixExpression)expression).getOperator());
} else if (expression instanceof Assignment) {
return ASSIGNMENT;
} else if (expression instanceof ConditionalExpression) {
return CONDITIONAL;
} else if (expression instanceof InstanceofExpression) {
return RELATIONAL;
} else if (expression instanceof CastExpression) {
return TYPEGENERATION;
} else if (expression instanceof ClassInstanceCreation) {
return POSTFIX;
} else if (expression instanceof PrefixExpression) {
return PREFIX;
} else if (expression instanceof FieldAccess) {
return POSTFIX;
} else if (expression instanceof MethodInvocation) {
return POSTFIX;
} else if (expression instanceof ArrayAccess) {
return POSTFIX;
} else if (expression instanceof PostfixExpression) {
return POSTFIX;
}
return Integer.MAX_VALUE;
}
@Override
public boolean visit(PostfixExpression node) {
SimpleName name= getSimpleName(node.getOperand());
if (name != null)
addWrite(name, name.resolveBinding());
return true;
}
/**
* Creates a {@link PostfixExpression} used to increment the loop variable of a <code>for</code>
* loop to iterate over an array.
*
* @param rewrite the current {@link ASTRewrite} instance
* @param variableToIncrement the name of the variable to increment
* @return a filled {@link PostfixExpression} realizing an incrementation of the specified
* variable
*/
private Expression getLinkedIncrementExpression(ASTRewrite rewrite, String variableToIncrement) {
AST ast= rewrite.getAST();
PostfixExpression incrementLoopVariable= ast.newPostfixExpression();
SimpleName name= ast.newSimpleName(variableToIncrement);
addLinkedPosition(rewrite.track(name), LinkedPositionGroup.NO_STOP, name.getIdentifier());
incrementLoopVariable.setOperand(name);
incrementLoopVariable.setOperator(PostfixExpression.Operator.INCREMENT);
return incrementLoopVariable;
}
private Set<PostfixExpression> getMatchingPostfixAssignments(SimpleName simpleName, List<Expression> postfixExpressions) {
Set<PostfixExpression> matchingPostfixAssignments = new LinkedHashSet<PostfixExpression>();
for(Expression expression : postfixExpressions) {
PostfixExpression postfixExpression = (PostfixExpression)expression;
Expression operand = postfixExpression.getOperand();
SimpleName operandName = MethodDeclarationUtility.getRightMostSimpleName(operand);
if(operandName != null && operandName.equals(simpleName)) {
matchingPostfixAssignments.add(postfixExpression);
}
}
return matchingPostfixAssignments;
}
public boolean visit(PostfixExpression expr) {
/*
* PostfixExpression: Expression PostfixOperator
*/
activateDiffStyle(expr);
handleExpression(expr.getOperand());
styledString.append(expr.getOperator().toString(), determineDiffStyle(expr, new StyledStringStyler(ordinaryStyle)));
deactivateDiffStyle(expr);
return false;
}
public void setOperator(PostfixExpression.Operator operator){
_operator = operator;
}
private void parseExpression(MethodInfo methodInfo, Expression expression) {
if (expression == null) {
return;
}//System.out.println(expression.toString()+" "+Annotation.nodeClassForType(expression.getNodeType()));
if (expression.getNodeType() == ASTNode.ARRAY_INITIALIZER) {
List<Expression> expressions = ((ArrayInitializer) expression).expressions();
for (Expression expression2 : expressions) {
parseExpression(methodInfo, expression2);
}
}
if (expression.getNodeType() == ASTNode.CAST_EXPRESSION) {
parseExpression(methodInfo, ((CastExpression) expression).getExpression());
}
if (expression.getNodeType() == ASTNode.CONDITIONAL_EXPRESSION) {
parseExpression(methodInfo, ((ConditionalExpression) expression).getExpression());
parseExpression(methodInfo, ((ConditionalExpression) expression).getElseExpression());
parseExpression(methodInfo, ((ConditionalExpression) expression).getThenExpression());
}
if (expression.getNodeType() == ASTNode.INFIX_EXPRESSION) {
parseExpression(methodInfo, ((InfixExpression) expression).getLeftOperand());
parseExpression(methodInfo, ((InfixExpression) expression).getRightOperand());
}
if (expression.getNodeType() == ASTNode.INSTANCEOF_EXPRESSION) {
parseExpression(methodInfo, ((InstanceofExpression) expression).getLeftOperand());
}
if (expression.getNodeType() == ASTNode.PARENTHESIZED_EXPRESSION) {
parseExpression(methodInfo, ((ParenthesizedExpression) expression).getExpression());
}
if (expression.getNodeType() == ASTNode.POSTFIX_EXPRESSION) {
parseExpression(methodInfo, ((PostfixExpression) expression).getOperand());
}
if (expression.getNodeType() == ASTNode.PREFIX_EXPRESSION) {
parseExpression(methodInfo, ((PrefixExpression) expression).getOperand());
}
if (expression.getNodeType() == ASTNode.THIS_EXPRESSION) {
parseExpression(methodInfo, ((ThisExpression) expression).getQualifier());
}
if (expression.getNodeType() == ASTNode.METHOD_INVOCATION) {
List<Expression> arguments = ((MethodInvocation) expression).arguments();
IMethodBinding methodBinding = ((MethodInvocation) expression).resolveMethodBinding();
if (methodBinding != null)
methodInfo.methodCalls.add(methodBinding);
for (Expression exp : arguments)
parseExpression(methodInfo, exp);
parseExpression(methodInfo, ((MethodInvocation) expression).getExpression());
}
if (expression.getNodeType() == ASTNode.ASSIGNMENT) {
parseExpression(methodInfo, ((Assignment) expression).getLeftHandSide());
parseExpression(methodInfo, ((Assignment) expression).getRightHandSide());
}
if (expression.getNodeType() == ASTNode.QUALIFIED_NAME) {
if (((QualifiedName) expression).getQualifier().resolveTypeBinding() != null) {
String name = ((QualifiedName) expression).getQualifier().resolveTypeBinding().getQualifiedName() + "." + ((QualifiedName) expression).getName().getIdentifier();
methodInfo.fieldUsesSet.add(name);
}
parseExpression(methodInfo, ((QualifiedName) expression).getQualifier());
}
}
@Override
public void endVisit(PostfixExpression node) {
endVisitIncDecOperation(node, node.getOperand());
}
@Override
public boolean visit(final PostfixExpression node) {
final AST dummyAST = AST.newAST(node.getAST().apiLevel());
final PostfixExpression.Operator pfOperator = node.getOperator();
Expression _operand = node.getOperand();
if ((_operand instanceof ArrayAccess)) {
Expression _operand_1 = node.getOperand();
final ArrayAccess pfOperand = ((ArrayAccess) _operand_1);
if ((Objects.equal(pfOperator, PostfixExpression.Operator.INCREMENT) ||
Objects.equal(pfOperator, PostfixExpression.Operator.DECREMENT))) {
final String arrayName = this.computeArrayName(pfOperand);
StringConcatenation _builder = new StringConcatenation();
_builder.append("_postIndx_");
_builder.append(arrayName);
final String idxName = _builder.toString();
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("_postVal_");
_builder_1.append(arrayName);
final String tempVarName = _builder_1.toString();
StringConcatenation _builder_2 = new StringConcatenation();
_builder_2.append("{ var ");
_builder_2.append(idxName);
_builder_2.append("=");
this.appendToBuffer(_builder_2.toString());
pfOperand.getIndex().accept(this);
StringConcatenation _builder_3 = new StringConcatenation();
_builder_3.append(" ");
_builder_3.append("var ");
this.appendToBuffer(_builder_3.toString());
final VariableDeclarationFragment varDeclaration = dummyAST.newVariableDeclarationFragment();
varDeclaration.setName(dummyAST.newSimpleName(tempVarName));
ASTNode _copySubtree = ASTNode.copySubtree(dummyAST, pfOperand);
final ArrayAccess arrayAccess = ((ArrayAccess) _copySubtree);
arrayAccess.setIndex(dummyAST.newSimpleName(idxName));
varDeclaration.setInitializer(arrayAccess);
varDeclaration.accept(this);
final InfixExpression infixOp = dummyAST.newInfixExpression();
infixOp.setLeftOperand(dummyAST.newSimpleName(tempVarName));
PostfixExpression.Operator _operator = node.getOperator();
boolean _equals = Objects.equal(_operator, PostfixExpression.Operator.DECREMENT);
if (_equals) {
infixOp.setOperator(InfixExpression.Operator.MINUS);
} else {
infixOp.setOperator(InfixExpression.Operator.PLUS);
}
infixOp.setRightOperand(dummyAST.newNumberLiteral("1"));
final Assignment assigment = dummyAST.newAssignment();
ASTNode _copySubtree_1 = ASTNode.copySubtree(dummyAST, pfOperand);
final ArrayAccess writeArray = ((ArrayAccess) _copySubtree_1);
writeArray.setIndex(dummyAST.newSimpleName(idxName));
assigment.setLeftHandSide(writeArray);
ASTNode _copySubtree_2 = ASTNode.copySubtree(dummyAST, infixOp);
assigment.setRightHandSide(((Expression) _copySubtree_2));
assigment.accept(this);
StringConcatenation _builder_4 = new StringConcatenation();
String _xifexpression = null;
boolean _needsReturnValue = this._aSTFlattenerUtils.needsReturnValue(node);
if (_needsReturnValue) {
_xifexpression = tempVarName;
}
_builder_4.append(_xifexpression);
_builder_4.append(" }");
this.appendToBuffer(_builder_4.toString());
return false;
}
}
node.getOperand().accept(this);
this.appendToBuffer(pfOperator.toString());
return false;
}
private boolean labelMatch(PostfixExpression nodeM, PostfixExpression nodeN) {
return nodeM.getOperator().equals(nodeN.getOperator());
}
@Override
public void endVisit(PostfixExpression node) {
endVisitIncDecOperation(node, node.getOperand());
}