[英]Extracting class dependencies from Eclipse project using Rascal
我正在使用Rascal來分析Eclipse Java項目並確定該項目中的類依賴關系。 更准確地說:當且僅當類A具有(1)使用類型B的參數或(2)使用類型B的局部變量的方法時,類A才依賴於類B。這里,我僅對依賴項感興趣關系A - > B,其中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
時獲得的信息)。 最后,我使用最后兩個語句過濾掉類型與我的項目中的類無關的所有參數,例如String和Integer參數。 由於我是Rascal的新手,所以我想不出另一種方法來實現這一目標。
我現在的問題是:如何為我的項目檢索類型B的局部變量? 與@typeDependency
結合使用方案"java+variable"
是不夠的,因為它還包括Iterator或String類型的變量,這些變量與項目中的其他類具有依賴性,因此我對這些類型的變量不感興趣。 此外,結果集包含諸如
B b = field.method();
其中field
是該類中的全局變量。 因此,從b
到類本身存在類型依賴關系,我也想從我的結果中排除它們。 因此,我相信@typeDependency
不會給我所需的信息。
我發現這篇相關的文章似乎用Rascal處理局部變量,但是它使用AST而不是M3。 我不確定如何在此設置中使用AST(就像我說的那樣,我只是Rascal的初學者),並且想知道是否可以使用M3來完成。 我應該如何進行?
編輯:為了澄清我想確切實現的目標,我將舉一個小例子。 假設我的項目有兩個類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
不感興趣,因為它們是具有與我的項目無關的類型的局部變量。 在前面給出的參數代碼示例中,我用最后兩個語句過濾掉了這些類型。 而且,我對someVar3
也不感興趣,因為它的類型為A
並且發生在同一類中。
我認為我應該能夠使用@types
檢索我想要的局部變量,但是我不確定如何。 使用@types
,我得到一個TypeSymbol
並且我已經研究了此數據類型的定義,以了解如何操作它。 TypeSymbol
大多數數據類型都有一個名為decl
的位置,我知道如何操作它。 但是問題是,我還會收到一些沒有此位置的類型,例如\\int()
和\\array(..)
。 在這些情況下,未定義位置decl
。
如果只想分析特定的TypeSymbol
,請使用模式匹配。 這是一個例子。
TypeSymbol t;
if (class(l,_) := t) {
println(l);
}
或理解
{ l | <_,class(l,_)> <- m3@types};
或作為理解中的一部分:
{ <v, l> | <_,v> <- m3@containment, isVariable(v), class(l,_) <- m3@types[v]};
您可以使用M3模型中的containment
關系。 所有局部變量都在declarations
關系中declarations
,但它們也出現在containment
。 如果要在方法m
獲取所有變量,可以查看containment[m]
並在java+variable
方案上進行過濾。
有趣的極端情況是方法包含匿名類。 如果您還需要過濾匿名嵌套類中使用的嵌套變量,則必須進一步研究containment
(例如傳遞閉包)。
順便說一下,M3模型具有效用謂詞isVariable
, isClass
等,還有classes(M3)
等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.