Eclise JDTを使用して、ASTNodeの子を取得する必要があります。どこかに使えるユーティリティメソッドはありますか?
私が今考えることができる唯一の方法は、ASTVisitorをサブクラス化し、各種類のノードを手動で処理してその子を見つけることです。しかし、すべてのノードタイプを調査するのは大変な作業です。
Eclise JDTを使用して、ASTNodeの子を取得する必要があります。どこかに使えるユーティリティメソッドはありますか?
私が今考えることができる唯一の方法は、ASTVisitorをサブクラス化し、各種類のノードを手動で処理してその子を見つけることです。しかし、すべてのノードタイプを調査するのは大変な作業です。
ASTViewプラグインのソースを調べることから始めます。これも同じことを行うからです。
のコードに基づく
必要なコードは次のようになります
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;
}