В AST Visitor, как я могу узнать свойство какого узла я посещаю? - PullRequest
4 голосов
/ 11 декабря 2010

Я программирую AST Visitor (Eclipse JDT).

Узел EnumDeclaration содержит следующие структурные свойства:

JAVADOC, MODIFIERS, NAME, SUPER_INTERFACE_TYPES, ENUM_CONSTANTS и BODY_DECLARATIONS.

Когда я посещаю дочерний узел EnumDeclaration (например, SimpleName), можно ли узнать, какой из списков узлов я посещаю? Можно ли дифференцировать?

Я хотел бы обработать узел по-разному, в зависимости от того, нашел я его в ENUM_CONSTANTS или BODY_DECLARATIONS.

Ответы [ 3 ]

2 голосов
/ 11 декабря 2010

Я нашел решение.Явное посещение узлов в списке (С accept(), а не visit()).Что-то вроде (для посещения суперинтерфейсов):

List<Type> superInterfaces = enumDecNode.superInterfaceTypes();
for( Type superInterface: superInterfaces)
    superInterface.accept( this);

Обратите внимание, что невозможно использовать:

    this.visit( superInterface);

, поскольку Type является зонтичным абстрактным классом, для которого нет visit( Type node) реализация существует.

Это также заставляет дочерние узлы в списке superInterfaces посещаться, как только посещается их родительский элемент.Проблема решена.

В примечании, если вы уже обрабатываете все дочерние элементы узла с помощью этих списков, вы можете запретить посетителю повторно посещать его дочерние элементы, возвращая false.

1 голос
/ 11 декабря 2010

Ваши узлы должны вызывать соответствующие методы.

MODIFIERS -> visitModifiers 
NAME -> visitNAME

и т. Д.

0 голосов
/ 13 декабря 2010

Другое альтернативное решение (спасибо Markus Keller @ eclipse JDT forum):

Используйте "node.getLocationInParent () == EnumDeclaration.NAME_PROPERTY" или другие * _PROPERTY константы.

Маркус

...