使用 Eclise JDT,我需要检索任何 ASTNode 的子节点。我可以在某处使用实用方法吗?
我现在能想到的唯一方法是继承 ASTVisitor 并手动处理每种节点以找到它的子节点。但是要研究每种节点类型需要做很多工作。
使用 Eclise JDT,我需要检索任何 ASTNode 的子节点。我可以在某处使用实用方法吗?
我现在能想到的唯一方法是继承 ASTVisitor 并手动处理每种节点以找到它的子节点。但是要研究每种节点类型需要做很多工作。
我将从查看ASTView Plugin的来源开始,因为它也做同样的事情。
基于中的代码
所需的代码应该是这样的
public Object[] getChildren(ASTNode node) {
List list= node.structuralPropertiesForType();
for (int i= 0; i < list.size(); i++) {
StructuralPropertyDescriptor curr= (StructuralPropertyDescriptor) list.get(i);
Object child= node.getStructuralProperty(curr);
if (child instanceof List) {
return ((List) child).toArray();
} else if (child instanceof ASTNode) {
return new Object[] { child };
}
return new Object[0];
}
}
我们可以使用以下 API 将子节点检索为 ASTNode 列表:
ASTNode.getStructureProperty(StructuralPropertyDescriptor property)
它返回此节点的给定结构属性的值。返回的值取决于属性的类型:
SimplePropertyDescriptor - the value of the given simple property, or null if none; primitive values are "boxed"
ChildPropertyDescriptor - the child node (type ASTNode), or null if none
ChildListPropertyDescriptor - the list (element type: ASTNode)
但是,ChildListPropertyDescripor
不打算由客户端实例化。您可以参考我的代码来获取孩子的列表:
public static List<ASTNode> getChildren(ASTNode node) {
List<ASTNode> children = new ArrayList<ASTNode>();
List list = node.structuralPropertiesForType();
for (int i = 0; i < list.size(); i++) {
Object child = node.getStructuralProperty((StructuralPropertyDescriptor)list.get(i));
if (child instanceof ASTNode) {
children.add((ASTNode) child);
}
}
return children;
}