Rascal を使用して Eclipse Java プロジェクトを分析し、このプロジェクトのクラスの依存関係を特定しています。より正確に言うと、クラス A がクラス B に依存するのは、(1) タイプ B のパラメーターを使用するか、(2) タイプ B のローカル変数を使用するメソッドがクラス A にある場合のみです。ここでは、依存関係のみに関心があります。ここで、A と B は両方とも私のプロジェクト内のクラスであり、両方とも異なるクラスです。私はすでに Eclipse プロジェクトから M3 モデルを作成しており、以下を使用して (タイプ B の) 必要なパラメーターを特定できました。
{ <e.name, f> | e <- model@declarations, e.name.scheme == "java+parameter", f <- model@typeDependency[e.name], !(/java/ := f.path), f.scheme != "java+primitiveType" }
ここでは、M3 モデルのすべての宣言を取得し、パラメーターをフィルター処理し、@typeDependency
注釈を使用して対応する型を取得します (代わりに使用するときに取得した情報を操作する方法がわかりませんでした@types
)。最後に、最後の 2 つのステートメントを使用して、型がプロジェクト内のクラスに関連していないすべてのパラメーター (String パラメーターや Integer パラメーターなど) を除外します。私は Rascal にまったく慣れていないので、これを達成する別の方法を思いつきませんでした。
私の質問は次のとおりです。プロジェクトのタイプ B のローカル変数を取得するにはどうすればよいですか? スキーム"java+variable"
を と組み合わせて使用するだけでは不十分です@typeDependency
。これには、プロジェクト内の他のクラスと依存関係があるタイプ Iterator または String の変数も含まれており、これらのタイプの変数には興味がないからです。さらに、結果のセットには次のような変数が含まれます
B b = field.method();
wherefield
はそのクラス内のグローバル変数です。このため、クラス自体に型の依存関係が存在しb
、これらも結果から除外したいと思います。ですから、それでは@typeDependency
必要な情報が得られないと思います。
Rascal でローカル変数を扱っていると思われるこの関連記事を見つけましたが、M3 ではなく AST を使用しています。この設定で AST を使用する方法がわかりません (私が言ったように、私は Rascal の初心者です)。M3 でできるかどうか疑問に思っていました。どのように進めればよいですか?
編集:私が達成したいことを明確にするために、小さな例を挙げます。私のプロジェクトには と の 2 つのクラスがA
ありB
、B
いくつかのメソッド ( methodB1
、methodB2
、 ...) が含まれているとします。さらに、クラスA
には次の構造があります。
class A {
void methodA1(){
B importantVar;
importantVar.methodB1();
...
String someVar1 = importantVar.methodB2();
int someVar2 = importantVar.methodB3();
}
void methodA2(){
A someVar3;
...
}
}
取得できるようにしたい変数は ですimportantVar
。これはローカル変数であり、タイプB
(プロジェクト内のクラス) であるためです。と には興味がありませんsomeVar1
。someVar2
なぜなら、それらは私のプロジェクトに関連しない型を持つローカル変数だからです。前に示したパラメーターのコード例では、最後の 2 つのステートメントでこれらの型を除外しました。さらに、 にも興味がありません。someVar3
型A
があり、この同じクラス内で発生するからです。
を使用して必要なローカル変数を取得できるはずだと思いますが、@types
方法がわかりません。を使用@types
すると が得られ、TypeSymbol
このデータ型の定義を調べて、それを操作する方法を確認しました。内のほとんどのデータ型にTypeSymbol
は という名前の場所がありdecl
、その操作方法を私は知っています。ただし、問題は、たとえば\int()
や など、この場所を持たないタイプも受け取ることです。\array(..)
これらの場合、場所decl
は未定義です。