Если вы работаете в AST, я предлагаю работать с AST View plugin. Это очень удобный инструмент для понимания JDT AST.
Ваш подход будет работать. Я использую переменную внутри посетителя, чтобы указать, что у меня есть задание.
public boolean visit(final Assignment node) {
inVariableAssignment = true;
node.getLeftHandSide().accept(this);
inVariableAssignment = false;
node.getRightHandSide().accept(this);
return false;
}
Теперь при посещении SimpleName
или QualifiedName
я сделать что-то вроде:
public boolean visit(final SimpleName node) {
if (!node.isDeclaration()) {
final IBinding nodeBinding = node.resolveBinding();
if (nodeBinding instanceof IVariableBinding) {
...
}
}
return false;
}
многоточие (...) будет заменен кодом, который обрабатывает доступ поля в соответствии со значением вашего inVariableAssignment
. Это поможет вам начать.
Ой, не забудьте PostfixExpression
и PrefixExpression
...
Спасибо! Что вы подразумеваете под «О, не забудьте PostfixExpression и PrefixExpression»? И что делать с полями, которые не объявлены в моем проекте? Я не хочу, чтобы они были обнаружены. Напр. поле «out» в System.out.println определяется как прочитанное поле. – yeeen
Причина, по которой поле типа «out» в System.out.println определяется как прочитанное поле, потому что я использовал логическое значение (то есть ur inVariableAssignment). Теперь я изменился на int, инициализируется до -1. Если появится LHS, установите значение 0; если он указан в RHS, равен 1. Когда endVisit узла Assignment, я возвращаю его на -1, проблема решена. – yeeen
Могу ли я узнать причину для создания причины "(! Node.isDeclaration())? Мне кажется, что меня можно удалить. Но удаляется ли это или нет, есть еще одна проблема. Он не может обнаружить поле, когда оно является частью иналинизации. Например, int y = x + 15, где x - поле. – yeeen