Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Rascal从Eclipse项目中提取类依赖项_Java_Rascal - Fatal编程技术网

Java 使用Rascal从Eclipse项目中提取类依赖项

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 =

我正在使用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 == "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
上遇到的问题,非常感谢!