2017-01-05 6 views
0

だから私はEclipseのJDT APIを使って遊んでいて、小さなアプリを構築しようとしています。しかし、私はそれらを印刷することができるので、私は訪問先のノードからデータを抽出するときに立ち往生しています。EclipseのJDT訪問者パターンからデータを抽出する

たとえば、getSuperclassType()の値をListまたはHashMapに戻したり追加したりできます。しかし、新しいASTVisitorは内部クラスであるため、Javaでは、最終キーワードなしでASTVisitor内部で使用されるObjectを宣言することはできません。

private static void get(String src) { 
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setSource(src.toCharArray()); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT); 
    parser.setResolveBindings(true); 
    parser.setBindingsRecovery(true); 

    final CompilationUnit cu = (CompilationUnit) parser.createAST(null); 

    cu.accept(new ASTVisitor() { 
     Set names = new HashSet(); 

     public boolean visit(TypeDeclaration typeDecNode) { 
      if(!typeDecNode.isInterface()) { 
       System.out.println(typeDecNode.getName().toString()); 
       System.out.println(typeDecNode.getSuperclassType()); 
       System.out.println(typeDecNode.superInterfaceTypes().toString()); 

       return true; 
      } 
... 

このようなコードから、訪問先ノードのそれぞれのデータをデータ構造に格納することは可能ですか?訪問者パターンを使わずにASTからノードをたどる別の方法は?

答えて

2

現在使用している匿名クラスの代わりにASTVisitorを拡張して通常のクラスを使用し、クラスに好きなものを保存してください。以下のようなスーパータイプの何かのために例えば

final List<Type> superTypes = new ArrayList<>(); 

cu.accept(new ASTVisitor() { 
    public boolean visit(TypeDeclaration typeDecNode) { 
     if(!typeDecNode.isInterface()) { 
      superTypes.add(typeDecNode.getSuperclassType()); 

      return true; 
     } 
:あなたはこのような匿名クラスで finalリストにアクセスすることができますまた

MyVisitor myVisitor = new MyVisitor(); 

cu.accept(myVisitor); 

List<Type> superTypes = myVisitor.getSuperTypes(); 

class MyVisitor extends ASTVisitor 
{ 
    private List<Type> superTypes = new ArrayList<>(); 

    @Override 
    public boolean visit(TypeDeclaration typeDecNode) { 
     if(!typeDecNode.isInterface()) { 
      superTypes.add(typeDecNode.getSuperclassType()); 
      return true; 
     } 
    } 

    List<Type> getSuperTypes() { 
    return superTypes; 
    } 
} 

と一緒に使用

関連する問題