簡體   English   中英

使用Rascal從Eclipse項目中提取類依賴關系

[英]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來完成。 我應該如何進行?

編輯:為了澄清我想確切實現的目標,我將舉一個小例子。 假設我的項目有兩個類AB ,並且B包含一些方法( methodB1methodB2等)。 此外, A類具有以下結構:

class A {

   void methodA1(){
        B importantVar;
        importantVar.methodB1();
        ...
        String someVar1 = importantVar.methodB2();
        int someVar2 = importantVar.methodB3();
   }

   void methodA2(){
        A someVar3;
        ...
   }

}

我希望能夠檢索到的變量是importantVar ,因為它是一個局部變量,並且是類型B (我項目中的類)。 我對someVar1someVar2不感興趣,因為它們是具有與我的項目無關的類型的局部變量。 在前面給出的參數代碼示例中,我用最后兩個語句過濾掉了這些類型。 而且,我對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模型具有效用謂詞isVariableisClass等,還有classes(M3)等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM