org.eclipse.jdt.core.domを使用して、特定の Java ソース コードの AST を生成しています。AST を生成すると、ルート ノードが作成されます。
ASTVisitor
AST を解析してすべてのリーフ ノードを取得するには、どうすれば を使用できますか?
org.eclipse.jdt.core.domを使用して、特定の Java ソース コードの AST を生成しています。AST を生成すると、ルート ノードが作成されます。
ASTVisitor
AST を解析してすべてのリーフ ノードを取得するには、どうすれば を使用できますか?
特定のデザイン パターンにまだ慣れていない場合は、ビジター パターンを読むことから始めることをお勧めします。
基本的には、二重ディスパッチを使用してVisitor
クラスの適切なメソッドを呼び出し、訪問したオブジェクトをパラメーターとして渡すことになります。一般に、次の (YMMV) と同様の方法で実装されます。
public interface Node {
void acceptVisitor(Visitor v);
Collection<Node> getChildren();
}
// Incomplete implementation, for demonstration only
public class SubNode implements Node {
@Override
public void acceptVisitor(Visitor v) {
if(v.preVisit(this)) {
v.visit(this);
v.postVisit(this);
}
getChildren().forEach(child -> child.accept(v));
}
}
public interface Visitor {
boolean preVisit(Node node);
void visit(Node node);
void visit(SubNode node);
void postVisit(Node node);
}
次に、インターフェイスが実装され、a (常にではありませんが、多くの場合、ツリーのルート ノード)のメソッドにVisitor
渡されます。acceptVisitor
Node
を実装する方法のより完全な概要については、このチュートリアルASTVisitor
をチェックしてください。
特定のケースでは、気になる実装のメソッドをorg.eclipse.jdt.core.dom.ASTVisitor
オーバーライドして、クラスを拡張する必要があります。次に、このインスタンスをAST のルート ノードのメソッドに渡します。visit
org.eclipse.jdt.core.dom.ASTNode
ASTVisitor
accept
リーフ ノード (子を持たない AST ノードとして定義されている) を探しているので、次のようにして、 の子を取得できASTNode
ます。
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];
}
}
このメソッドを呼び出して調べる各ノードを渡すことで、ノードに子がないかどうか (length
返された配列の は 0 になります) を判断し、それらを に追加してそれらをCollection
追跡ASTVisitor
できます。
例はこれです:
package de.vogella.jdt.astsimple.handler;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.MethodDeclaration;
public class MethodVisitor extends ASTVisitor {
List<MethodDeclaration> methods = new ArrayList<MethodDeclaration>();
@Override
public boolean visit(MethodDeclaration node) {
methods.add(node);
return super.visit(node);
}
public List<MethodDeclaration> getMethods() {
return methods;
}
}