2016-11-29 7 views
3

Java M3モデルからタイプ宣言に関するいくつかの事実を抽出しようとしています。宣言されていない変数:M3モデルからファクトを抽出する

を:種類

をその後、私はちょうど使用して、メソッドからの事実を入手しようとした私が得たもののM3ファイルのセットから、私はそのような

> [type(m) | m <- models]; 

として、理解を使用しようとしました

> [methods(m) | m <- models]; 

ドキュメントの説明どおりです。それにもかかわらず、私は次のようなものを得ました:

|std:///lang/java/m3/Core.rsc|(8877,1,<186,52>,<186,53>): NoSuchAnnotation("declarations") 

したがって、セットM3モデルでナビゲートする正しいアプローチは何ですか? M3モデルのクラスとインタフェースに関する情報を入手するにはどうすればよいですか?

私は、createM3FromProjectJars関数を使用してM3ファイルを構築しました。

+0

plsの異なる定義plsは受け入れる。乾杯! – jurgenv

答えて

2

良い質問;これに関する文書はまだ不足しています。最良の例によるコードはここにある:http://tutor.rascal-mpl.org/Recipes/Recipes.html#/Recipes/Metrics/MeasuringJava/MeasuringJava.html

M3モデルのソースコードはここに多くのことを説明することができます:

例えば後者は、これらの定義が含まれています:

anno rel[loc from, loc to] [email protected];   // classes extending classes and interfaces extending interfaces 
anno rel[loc from, loc to] [email protected];   // classes implementing interfaces 
anno rel[loc from, loc to] [email protected]; // methods calling each other (including constructors) 
anno rel[loc from, loc to] [email protected];  // code using data (like fields) 
anno rel[loc from, loc to] [email protected];  // using a type literal in some code (types of variables, annotations) 
anno rel[loc from, loc to] [email protected]; // which method override which other methods 
anno rel[loc declaration, loc annotation] [email protected]; 

前者はこれらが含まれています:

anno rel[loc name, loc src]  [email protected];   // maps declarations to where they are declared. contains any kind of data or type or code declaration (classes, fields, methods, variables, etc. etc.) 
anno rel[loc name, TypeSymbol typ] [email protected];     // assigns types to declared source code artifacts 
anno rel[loc src, loc name]  [email protected];     // maps source locations of usages to the respective declarations 
anno rel[loc from, loc to]   [email protected];    // what is logically contained in what else (not necessarily physically, but usually also) 
anno list[Message]     [email protected];    // error messages and warnings produced while constructing a single m3 model 
anno rel[str simpleName, loc qualifiedName] [email protected];   // convenience mapping from logical names to end-user readable (GUI) names, and vice versa 
anno rel[loc definition, loc comments]  [email protected]; // comments and javadoc attached to declared things 
anno rel[loc definition, Modifier modifier] [email protected];  // modifiers associated with declared things 

これらの定義は正確に一緒にJavaのM3のためのモデルを文書化します。 jarファイルからM3モデルを直接生成すると、この情報の量がどれくらいあるか分かりません。 Eclipseソースプロジェクトから、これらのテーブルがすべて埋められます。

することができますあなたのクエリを実装するには、次の

  • [ [email protected] | m <- models]を。リストを生成する[rel [loc name、TypeSymbol typ]
  • { *[email protected] | m <- models}; a rel [loc name、TypeSymbol typ]すべての型のすべての型テーブルの和集合
  • { t | m <- models, t <- [email protected]};あなたはそれが好きな場合、前の
+0

上記のオプションを試しましたが、NoSuchAnnotation( "types")を取得しました。おそらく何かをインポートするのを忘れていました。テストするために、私はインポートしました:import lang :: java :: m3 :: Core;インポートlang :: java :: jdt :: m3 ::コア;インポートlang :: java :: jdt :: m3 :: AST;他に何かありますか?もう1つの可能性は、createM3FromProjectJarsがすべてのM3情報をロードしないことです。 –

+1

例外は本当に値に注釈がないことです。だから、瓶抜き器はこれをまだ生産していません。ノードライブラリでは、関数topは、あなたが持っているものを見るためのマップとしてすべての注釈を取得します。 – jurgenv

+0

ありがとうございます。もう1つの質問は、M3の内容を印刷することです。<!java + class:/// br/unb/cic/Rascal/Main |、|プロジェクト:// JavaSamples/src/br/unb/cic/Rascal/Main。java |(552,675,<30,0>、<64,1>)>。私は指定子java +クラスを使用してクラス名を参照することが可能かどうか疑問に思っています。出来ますか? –