2009-10-18 8 views
0

Я пишу Eclipse ASTVisitor. Как определить, прочитано или записано поле в методе?Eclipse JDT ASTVisitor - как определить, прочитано или записано поле в методе?

Идея предоставлена: «Вам нужно указать узел Назначения. Поле на LHS написано, а поля в выражении RHS читаются».

После того как я перейду к заданию и получаю LHS и RHS, которые являются обеим выражениями, как определить, содержит ли выражение выражение?

ответ

0

Если вы работаете в 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 ...

+0

Спасибо! Что вы подразумеваете под «О, не забудьте PostfixExpression и PrefixExpression»? И что делать с полями, которые не объявлены в моем проекте? Я не хочу, чтобы они были обнаружены. Напр. поле «out» в System.out.println определяется как прочитанное поле. – yeeen

+0

Причина, по которой поле типа «out» в System.out.println определяется как прочитанное поле, потому что я использовал логическое значение (то есть ur inVariableAssignment). Теперь я изменился на int, инициализируется до -1. Если появится LHS, установите значение 0; если он указан в RHS, равен 1. Когда endVisit узла Assignment, я возвращаю его на -1, проблема решена. – yeeen

+0

Могу ли я узнать причину для создания причины "(! Node.isDeclaration())? Мне кажется, что меня можно удалить. Но удаляется ли это или нет, есть еще одна проблема. Он не может обнаружить поле, когда оно является частью иналинизации. Например, int y = x + 15, где x - поле. – yeeen