2017-02-24 11 views
0

プログラムのカスタム 'オブジェクト指向'表現を構築するために、Googleクローズコンパイラを使用して特定のES6ソースファイルを解析したいと思います。この表現には、ソースファイル内のすべてのクラスの詳細と、それらのクラスに含まれるメソッドおよび変数が含まれます。私はAntlrを使用したJavaプログラムのためにこのタスクを完了しました。適切なgrammarを取得したら、実装をかなり単純明快にした任意の文法ルール(クラス宣言、メソッド宣言など)に対して入力リスナーと終了リスナーを登録できます。私は、ソースコードに関する類似の情報を抽出するために、Googleクロージャコンパイラを使用してJavaScriptコードを解析できるように助けていただきありがとうございます。Googleクローズコンパイラを使用してjavascriptソースを解析する

これまでのところ、私は与えられたjavascriptのソースファイル解析する次のコードを持っている:

Compiler compiler = new Compiler(); 
CompilerOptions options = new CompilerOptions(); 
options.setIdeMode(true); 
compiler.initOptions(options); 
Node root = new JsAst(SourceFile.fromCode(file.name(), file.content())).getAstRoot(compiler); 
NodeTraversal.traverseEs6(compiler, root, new JavaScriptParsePass()); 

JavaScriptParsePassクラスは、単純に処理され、すべてのノードの種類や修飾名を出力し、それは次のようになります。

を入力にこのプログラムを実行する
public class JavaScriptParsePass extends AbstractPostOrderCallback implements CompilerPass { 

    @Override 
    public void process(Node externs, Node root) { 
    } 

    @Override 
    public void visit(NodeTraversal t, Node n, Node parent) { 
     System.out.println(n.getType() + ": " + n.getQualifiedName()); 
    } 
} 

class Model { constructor(properties) { this.properties = properties; }

は出力を生成します。

38: Model 
124: null 
38: null 
38: properties 
83: null 
42: this 
40: null 
33: this.properties 
38: properties 
86: null 
130: null 
125: null 
105: null 
160: null 
159: null 
158: null 
132: null` 

発注とヌルが元の問題に取り組むための方法上の任意の一般的なガイダンスと一緒に私には意味がありませんように私は、この出力の説明をいただければ幸いです。

答えて

0

n.getQualifiedName()は名前ノードのみを対象としているため、nullが返されています。これには、変数名、関数名、クラス名、およびプロパティが含まれます。ほとんどのASTノードタイプでは意味のあるデータは表示されません。

+0

私は与えられたノードがいずれかのクラスであるかどうかを見つけ出すだろうか名前、関数名、または変数名?さらに、クラス名ノードを見つけたら、このノードが意味論的に表現するクラスの解析が完了したときはどうすればわかりますか?私が探すことができる特別な「出口」ノードはありますか、これを行う別の方法がありますか? –

+0

AST全体を見る必要があります。コンパイラには、良い例を作るASTを分析する多くのパスがあります。ここに1つあります:https:// github。co.jp/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/ProcessCommonJSModules.java#L257 –

0

次のコードは、特定のJavaScriptプログラムのすべてのメソッドとクラスを表示し、GoogleクローズコンパイラのJava APIを使用してJavaScriptコードを解析するための基本的な方法の概要を示しています。詳細はthis postを参照してください。

まず、解析ツリーのノードを反復処理する方法を提供するAbstractShallowCallbackクラスを拡張する必要があります。私たちは、それは我々が興味を持っているノードである場合、出力ノードの値意志訪問メソッドの実装を提供する。

public class JavaScriptAnalyzer extends AbstractShallowCallback { 

@Override 
    public void visit(NodeTraversal t, Node n, Node parent) { 
     if (n.isClass()) { 
      System.out.println(n.getFirstChild().getString()); 
     } 
     if (n.isMemberFunctionDef() || n.isGetterDef() || n.isSetterDef()) { 
      System.out.println(n.getString()); 
     } 
     if (n.isFunction()) { 
      System.out.println(n.getFirstChild().getString()); 
     } 
     // there is more work required to detect all types of methods that 
     // has been left out for brevity... 
    } 
} 

次の私たちは、コンパイラを初期化し、与えられたJavaScriptのソースファイル上で、当社の作成したJavaScriptの解析を実行します。以下のソースファイルに上記のコード実行

public void parse(String jsFileContent, String jsName) throws Exception { 
    Compiler compiler = new Compiler(); 
    CompilerOptions options = new CompilerOptions(); 
    options.setIdeMode(true); 
    compiler.initOptions(options); 
    Node root = new JsAst(SourceFile.fromCode(jsName, jsFileContent)).getAstRoot(compiler); 
    JavaScriptAnalyzer jsListener = new JavaScriptAnalyzer(); 
    NodeTraversal.traverseEs6(compiler, root, jsListener); 
} 

:予想通り

class Polygon { 
    constructor(height, width) {} 
    logWidth() {} 
    set width(value) {} 
    get height(value) {} 
} 

は、次の出力を生成します。

constructor 
logWidth 
width 
height 
Polygon 
関連する問題