org.eclipse.jdt.core.domを使用して、特定の Java ソース コードの AST を生成しています。AST を生成すると、ルート ノードが作成されます。
ASTVisitorAST を解析してすべてのリーフ ノードを取得するには、どうすれば を使用できますか?
org.eclipse.jdt.core.domを使用して、特定の Java ソース コードの AST を生成しています。AST を生成すると、ルート ノードが作成されます。
ASTVisitorAST を解析してすべてのリーフ ノードを取得するには、どうすれば を使用できますか?
特定のデザイン パターンにまだ慣れていない場合は、ビジター パターンを読むことから始めることをお勧めします。
基本的には、二重ディスパッチを使用して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渡されます。acceptVisitorNode
を実装する方法のより完全な概要については、このチュートリアルASTVisitorをチェックしてください。
特定のケースでは、気になる実装のメソッドをorg.eclipse.jdt.core.dom.ASTVisitorオーバーライドして、クラスを拡張する必要があります。次に、このインスタンスをAST のルート ノードのメソッドに渡します。visitorg.eclipse.jdt.core.dom.ASTNodeASTVisitoraccept
リーフ ノード (子を持たない 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;
}
}