1

我正在使用 Rascal 分析一个 Eclipse Java 项目并识别该项目中的类依赖项。更准确地说:A 类依赖于 B 类当且仅当 A 类有一个方法,该方法 (1) 使用 B 类型的参数或 (2) 使用 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 类型的局部变量?与 结合使用该方案"java+variable"是不够的@typeDependency,因为这还包括类型为 Iterator 或 String 的变量,它们与我的项目中的其他类有依赖关系,我对这些类型的变量不感兴趣。此外,结果集包含变量,如

B b = field.method(); 

wherefield是该类中的全局变量。因此,b类本身存在类型依赖关系,我也想将这些从我的结果中排除。所以,我相信这@typeDependency并没有给我我需要的信息。

我发现这个相关的帖子似乎用 Rascal 处理局部变量,但它使用 AST 而不是 M3。我不确定如何在此设置中使用 AST(就像我说的,我只是 Rascal 的初学者)并且想知道是否可以使用 M3 来完成。我应该如何进行?

编辑:为了明确我想要实现的目标,我将举一个小例子。假设我的项目有两个类,Aand 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是未定义的。

4

2 回答 2

3

如果您只想分析特定的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]}; 
于 2014-02-21T08:41:37.457 回答
1

您可以使用containmentM3 模型中的关系。所有局部变量都在declarations关系中声明,但它们也出现在containment. 如果要获取方法中的所有变量m,可以查看containment[m]并过滤该java+variable方案。

有趣的极端情况是方法包含匿名类。containment如果您还需要过滤匿名嵌套类中使用的嵌套变量,则必须进一步研究(如传递闭包)。

顺便说一句,M3 模型有实用谓词isVariable,isClass等 , 还有classes(M3), 等等。

于 2014-02-18T19:06:24.300 回答