カテゴリー: JDT

「Eclipse JDT – Abstract Syntax Tree (AST) and the Java Model – Tutorial」を翻訳した(3)


www.vogella.comのhttp://www.vogella.com/tutorials/EclipseJDT/article.html
紹介されていたチュートリアルを翻訳した。

ちなみASTのところは興味がなかったので試していない(ノ∀`)


5. ASTの使い方


以下の内容はワークスペース内の各ソースファイル用のASTを作成し、ASTを使用して各メソッドの名前と戻り値を出力します。

“Hello world”テンプレートを使用して、新しいプラグインプロジェクト
“de.vogella.jdt.astsimple”を作成します。

以下のプラグインの依存関係を整備します。


ASTについて情報を取得するには、あなたはVisitorパターンを使うことが出来ます。これはあなたが特定の要素用のASTへビジターを追加することを可能にします。このビジター内であなたはそのオブジェクトについての情報を捕捉し、ASTを処理した後にそれを戻すことが出来ます。この次のクラスを作成します。

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;
  }
} 

新しいコマンド”de.vogella.jdt.astsimple.GetInfo”を追加し、それをメニューへ入れます。

このコマンド用の以下のハンドラを作成します。

package de.vogella.jdt.astsimple.handler;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.MethodDeclaration;

public class GetInfo extends AbstractHandler {

  private static final String JDT_NATURE = "org.eclipse.jdt.core.javanature";

  @Override
  public Object execute(ExecutionEvent event) throws ExecutionException {
    IWorkspace workspace = ResourcesPlugin.getWorkspace();
    IWorkspaceRoot root = workspace.getRoot();
    // ワークスペース内の全てのプロジェクトを取得します。
    IProject[] projects = root.getProjects();
    // 全てのプロジェクトで繰り返します。
    for (IProject project : projects) {
      try {
        if (project.isNatureEnabled(JDT_NATURE)) {
          analyseMethods(project);
        }
      } catch (CoreException e) {
        e.printStackTrace();
      }
    }
    return null;
  }

  private void analyseMethods(IProject project) throws JavaModelException {
    IPackageFragment[] packages = JavaCore.create(project)
        .getPackageFragments();
    // parse(JavaCore.create(project));
    for (IPackageFragment mypackage : packages) {
      if (mypackage.getKind() == IPackageFragmentRoot.K_SOURCE) {
        createAST(mypackage);
      }

    }
  }

  private void createAST(IPackageFragment mypackage)
      throws JavaModelException {
    for (ICompilationUnit unit : mypackage.getCompilationUnits()) {
      // 今、ICompilationUnits用のASTを作成します。
      CompilationUnit parse = parse(unit);
      MethodVisitor visitor = new MethodVisitor();
      parse.accept(visitor);

      for (MethodDeclaration method : visitor.getMethods()) {
        System.out.print("Method name: " + method.getName()
            + " Return type: " + method.getReturnType2());
      }

    }
  }

  
/**
   * ICompilationUnitを読取り、
   * Javaソース・ファイル操作用のAST DOMを作成します。
   * 
   * @param unit
   * @return
   */


  private static CompilationUnit parse(ICompilationUnit unit) {
    ASTParser parser = ASTParser.newParser(AST.JLS3);
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setSource(unit);
    parser.setResolveBindings(true);
    return (CompilationUnit) parser.createAST(null); // パース
  }
} 

あなたのメニューへコマンドを追加します。あなたの新しいプラグインを実行し、新しいJavaプロジェクトを作成し、コマンドを選択します。
あなたが新しいプラグインを開始したIDE内でメソッドについての情報が出力されるはずです。

(後略)


サンプルの完全版等は元々のwww.vogella.comを参照のこと。
英語だけど読みやすく色々な種類のチュートリアルがあるので勉強するにはいいかも(・∀・)