2017-10-03 8 views
2

私は、別のスコープのクラスで使用されている変数宣言またはメソッド宣言を見つけるためのデータ構造を構築する機能を提供するライブラリまたはツールを探しています。Rascalを使ったJavaのメソッド/変数宣言

コード例:

class A 
{ 
    public void methodA() 
    { 
     B external = new B(); 
     external.methodB(); // I would like to know the name/location where this method is declared. something like: classB.java ... line 3 
    } 
} 

class B 
{ 
    public void methodB() 
    { 

    } 
}` 

ラスカルは、この種の情報を取得するための良い候補でしょうか?私は以前にこのツールを使っていました。私が知る限り、私はASTを作成することができますが、これは特定の変数/メソッドが宣言されている範囲を決定するのに十分な情報を持っていません。 これが適切な候補でない場合、代替案に関するアイデアはありますか?現在私が探している候補者リストは次のとおりです:Antlr/symtab; JavaParser/JavaSymbolSolver;スプーン;ラスカル; JDT

答えて

0

はい、確かに何かが宣言されている場所を見つけるためのいくつかのオプションがあります。

最初の答えは、例えば、そのようAST内の任意のノードからdecl情報を取得することです:

rascal>myTree.decl 
loc: |java+parameter:///myClass/fac(int)/n| 

あなたは、これがfacという名前のメソッドでnという名前のパラメータであることがわかりロケーション値から、クラスmyClassにあります。

今、あなたはmyTree.decl.pathなどのように、場所のアクセスフィールドや機能を使用して、親を探しに行くために場所をdisectしたり、ASTビルダも構築できM3モデルにさらにあなたの情報を見つけることができます。

rel[loc, loc] containment、すべてここで定義された:

あなたはこの試みることができる包含関係で両親を見つけるには:逆引き用

model.containment[myTree.decl] 

またはこれを:あなたの特定の質問については

invert(model.containment)[myTree.decl] 

rel[loc src, loc name] uses関係完全に修飾された宣言の名前をソースの場所の使用にマップすることもかなり面白く、修飾された名前をwにマップするrel[loc name, loc src] declarationsここで彼らは宣言されています。

+0

私は自分の例で答えを試しましたが、いくつかのことは私にはあまり明確ではありません。あなたはmyTreeに何を入れましたか?そしてmyTree.declはどういう仕組みになっていますか?あなたの例に最も近いのは、[email protected]です。unitは、createAstsFromEclipseProjectから来るコンパイルユニットです。 これで私はmodel @ containmentを行うことができました[unit @ decl] これはあなたが上で説明したものになります。 なぜフィールド演算子(。)i.s.oを使用できるのか説明できますか?私が使っている注釈。 – Patrick

+0

私は最新の連続ビルドを使用していると思います。古い安定版を使用している可能性があります。私たちはM3モデルを最近アノテーションを「キーワードフィールド」に切り替えたので、 '@ 'から' .'に移動しました。 – jurgenv