我有一个代码,该代码将逻辑表达式替换为其取反形式。喜欢,
将A || B
替换为!A && !B
。
为此,我使用了JDT ASTNode的copySubtree()
函数来复制原始节点。然后修改副本并用其替换原件。但是替换后,resolveBinding()
方法始终返回null
。但是,如果我不进行复制,而只是修改原始节点,则resolveBinding()
方法可以正常工作。
现在,我需要同时拥有原始节点和修改后的节点。这就是为什么必须复制其中任何一个的原因。但是复制后,JDT无法再解析内部变量的绑定。
下面给出我的否定简单逻辑表达式的函数:
public ASTNode negateLogicalExpression(ASTNode expression) {
AST nAST = expression.getAST();
ASTNode copyExpression = ASTNode.copySubtree(nAST, expression);
copyExpression.accept(new ASTVisitor() {
@Override
public void endVisit(InfixExpression node) {
InfixExpression.Operator op = node.getOperator();
if(op.equals(Operator.LESS)) {
node.setOperator(Operator.GREATER_EQUALS);
} else if(op.equals(Operator.LESS_EQUALS)) {
node.setOperator(Operator.GREATER);
} else if(op.equals(Operator.GREATER)) {
node.setOperator(Operator.LESS_EQUALS);
} else if(op.equals(Operator.GREATER_EQUALS)) {
node.setOperator(Operator.LESS);
} else if(op.equals(Operator.EQUALS)) {
node.setOperator(Operator.NOT_EQUALS);
} else if(op.equals(Operator.NOT_EQUALS)) {
node.setOperator(Operator.EQUALS);
} else if(op.equals(Operator.CONDITIONAL_OR)) {
node.setOperator(Operator.CONDITIONAL_AND);
} else if(op.equals(Operator.CONDITIONAL_AND)) {
node.setOperator(Operator.CONDITIONAL_OR);
}
}
});
return copyExpression;
}
如果有人可以,请让我知道是否有一种方法可以解决来自复制节点的变量绑定。 另外,我的问题类似于JDT - Bindings are lost after copying subtree。但是似乎没有人回答。所以我还是要发布我的问题。