Java 使用Rascal从Eclipse项目中提取类依赖项
我正在使用Rascal分析EclipseJava项目,并确定该项目中的类依赖关系。更准确地说:类A依赖于类B当且仅当类A有一个方法(1)使用类型B的参数或(2)使用类型B的局部变量时。在这里,我只对依赖关系A->B感兴趣,其中A和B在我的项目中都是类,并且都是不同的类。我已经从我的Eclipse项目中创建了一个M3模型,并且能够使用以下方法识别所需的参数(类型B):Java 使用Rascal从Eclipse项目中提取类依赖项,java,rascal,Java,Rascal,我正在使用Rascal分析EclipseJava项目,并确定该项目中的类依赖关系。更准确地说:类A依赖于类B当且仅当类A有一个方法(1)使用类型B的参数或(2)使用类型B的局部变量时。在这里,我只对依赖关系A->B感兴趣,其中A和B在我的项目中都是类,并且都是不同的类。我已经从我的Eclipse项目中创建了一个M3模型,并且能够使用以下方法识别所需的参数(类型B): { <e.name, f> | e <- model@declarations, e.name.scheme =
{ <e.name, f> | e <- model@declarations, e.name.scheme == "java+parameter", f <- model@typeDependency[e.name], !(/java/ := f.path), f.scheme != "java+primitiveType" }
其中,字段
是该类中的全局变量。因此,从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
未定义。您可以使用M3模型中的包容关系。所有局部变量都在声明
关系中声明,但它们也出现在包含
中。如果要获取方法m
中的所有变量,可以查看containment[m]
并在java+变量
方案上进行筛选
有趣的情况是当一个方法包含一个匿名类时。如果需要筛选在中使用的嵌套变量,则必须进一步查看包含
(如传递闭包)
匿名嵌套类也是如此
顺便说一下,M3模型具有效用谓词isVariable
,isClass
,以及classes(M3)
,等等。您可以使用M3模型中的包容关系。所有局部变量都在声明
关系中声明,但它们也出现在包含
中。如果要获取方法m
中的所有变量,可以查看containment[m]
并在java+变量
方案上进行筛选
有趣的情况是当一个方法包含一个匿名类时。如果需要筛选在中使用的嵌套变量,则必须进一步查看包含
(如传递闭包)
匿名嵌套类也是如此
顺便说一下,M3模型有实用谓词isVariable
,isClass
等,还有classes(M3)
等。如果您只想分析特定的类型符号
,请使用模式匹配。这里有一个例子
TypeSymbol t;
if (class(l,_) := t) {
println(l);
}
或者在理解中
{ l | <_,class(l,_)> <- m3@types};
{l |如果您只想分析特定的类型符号
,请使用模式匹配。下面是一个示例
TypeSymbol t;
if (class(l,_) := t) {
println(l);
}
或者在理解中
{ l | <_,class(l,_)> <- m3@types};
{l|我知道包含关系可以在这个设置中使用,但它也给了我不想要的变量。例如,我得到了像String x=…
这样的局部变量,我只对查找依赖关系A->B感兴趣,其中A和B都是我项目中的类。因此,我想排除这个e> x
来自我的结果。如果我的问题不清楚,我很抱歉,我现在已经更新了它,将其包括在内。好的。我相信下面Davy的答案应该会有所帮助!我知道包含关系可以在这个设置中使用,但它也给了我不想要的变量。例如,我得到了一些局部变量,如字符串x=…
返回,我只对查找依赖关系A->B感兴趣,其中A和B都是我项目中的类。因此,我想从我的结果中排除这个x
。很抱歉,如果我的问题不清楚,我现在已经将其更新为包含这个。好的。我相信Davy下面的答案应该会有所帮助!这确实解决了问题我在@types
上遇到的问题,非常感谢!这确实解决了我在@types
上遇到的问题,非常感谢!