4

我正在编写一个 AST 访问者(eclipse JDT)。

一个EnumDeclaration节点包含以下结构属性:

JAVADOC, MODIFIERS, NAME,和. SUPER_INTERFACE_TYPES_ENUM_CONSTANTSBODY_DECLARATIONS

当我访问EnumDeclarationSimpleName例如节点)的子节点时,是否可以知道我正在访问的节点列表中的哪些?可以区分吗?

我想以不同的方式处理节点,具体取决于我是否在ENUM_CONSTANTS或中找到它BODY_DECLARATIONS

4

3 回答 3

2

我找到了解决方案。显式访问列表中的节点(WITH accept(),not visit())。类似于(用于访问超级接口):

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

请注意,不能使用:

    this.visit( superInterface);

因为Type是一个没有visit( Type node)实现的伞形抽象类。

这也迫使superInterfaces列表中节点的子节点在其父节点被访问时立即被访问。问题解决了。

附带说明一下,如果您已经通过这些列表处理了节点的所有子节点,则可以通过返回 false 来禁止访问者重新访问其子节点。

于 2010-12-11T20:40:24.667 回答
1

您的节点应该调用相应的方法。

MODIFIERS -> visitModifiers 
NAME -> visitNAME

等等

于 2010-12-11T19:33:34.107 回答
0

另一种替代解决方案(感谢 Markus Keller @ eclipse JDT 论坛):

使用“node.getLocationInParent() == EnumDeclaration.NAME_PROPERTY”或其他 *_PROPERTY 常量。

马库斯

于 2010-12-13T10:27:50.363 回答