3

org.eclipse.jdt.core.domを使用して、特定の Java ソース コードの AST を生成しています。AST を生成すると、ルート ノードが作成されます。

ASTVisitorAST を解析してすべてのリーフ ノードを取得するには、どうすれば を使用できますか?

4

3 に答える 3

4

訪問者パターン

特定のデザイン パターンにまだ慣れていない場合は、ビジター パターンを読むことから始めることをお勧めします。

基本的には、二重ディスパッチを使用して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できます。

于 2015-12-29T13:55:45.020 に答える
0

例はこれです:

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;
    }
}
于 2012-05-14T19:41:48.000 に答える