我正在尝试编写一个分析来检查一个类是否实现了|java+method:///java/lang/Comparable/compareTo(T)|. Comparable.compareTo
我试着玩M3但是使用下面的代码,methodOverrides根本不包含compareTo。
//Geometric.java
public interface Geometric extends Comparable<Geometric> {
public double area();
}//Circle.java
public class Circle implements Geometric {
private double r;
private double x;
private double y;
public Circle(double x, double y, double r) {
this.x = x;
this.y = y;
this.r = r;
}
@Override
public double area() {
return Math.PI * Math.pow(r, 2);
}
@Override
public int compareTo(Geometric o) {
return (int) (area() - o.area());
}
@Override
public String toString() {
return "Circle...";
}
}当使用createM3FromDirectory加载这些文件时,M3方法覆盖只包含一个条目:
<|java+method:///Circle/area()|,|java+method:///Geometric/area()|>在M3中,是否有一种方法可以利用某些关系的传递闭包来得出结论:|java+method:///Circle/compareTo(Geometric)|覆盖了|java+method:///java/lang/Comparable/compareTo(T)|
发布于 2019-08-19 11:48:41
我不敢相信我所看到的。我刚试了一次,现在起作用了。
//Main.rsc
module Main
import IO;
import lang::java::m3::Core;
void main(list[str] args)
{
loc projectDir = |file:///| + args[0];
M3 model = createM3FromDirectory(projectDir);
for( ov <- model.methodOverrides ) { println(ov); }
}内食无赖控制台:
rascal>main(["/home/mkl/radboud/src/java-feedback/java-feedback-rascal/test-data/assignment03-override-not-detected"]);
Reloading module Main
<|java+method:///Circle/toString()|,|java+method:///java/lang/Object/toString()|>
<|java+method:///Circle/area()|,|java+method:///Geometric/area()|>
<|java+method:///Circle/compareTo(Geometric)|,|java+method:///java/lang/Comparable/compareTo(T)|>就是:循环实际上实现了Comparable.compareTo。<|java+method:///Circle/compareTo(Geometric)|,|java+method:///java/lang/Comparable/compareTo(T)|>
我想问题是我用了两种不同版本的流氓。Rascal,似乎是一个较旧的版本,给出了不同的结果。
使用流氓壳:
$ java -Xmx1G -Xss32m -jar ~/tmp/rascal-shell-stable.jar Main.rsc /home/mkl/radboud/src/java-feedback/java-feedback-rascal/test-data/assignment03-override-not-detected
Version: unknown
<|java+method:///Circle/area()|,|java+method:///Geometric/area()|>我想我只是在耍流氓。当从内部eclipse运行时,它会给出正确的结果。
据我所知,它如预期的那样起作用。
我知道M3只记录即时的事实,在需要的时候我必须自己计算传递闭包。
发布于 2019-08-17 09:18:25
目前,M3只存储与直接超类和接口相关的方法重写。如果在项目中声明了传递接口和超级类型,则可以使用implements和extends关系的传递闭包,然后对declarations和containment关系进行交叉检查。但是,您需要注意的是,在外部依赖项(例如Comparable<T>)的情况下,您不会在M3中获得所有所需的信息。因此,这并不是解决所有案件的一般解决办法。如果仍然希望检查项目实体的方法重写,请考虑以下步骤(这只是一个可能的解决方案):
implements关系的传递闭包。extends关系的传递闭包。transImpl[|java+class://main/MyClass|] + transExt[|java+class://main/MyClass|]),对这两个关系进行支持。containment关系中与MyClass类型及其传递父类型相关的方法。MyClass方法的签名与传递父类型方法进行比较(请注意每个方法的可见性;应该只考虑protected和public方法)。无论如何,我们已经在Rascal存储库中打开了一个新的问题,以进一步分析您的查询。谢谢你的报道。
https://stackoverflow.com/questions/57525714
复制相似问题