У меня есть код, в котором я заменяю логическое выражение его отрицательной формой.Мол, заменив 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 - привязки теряются после копирования поддерева .Но никто, казалось, не ответил на это.Так что я все равно отправляю свой вопрос.