我在哪里可以找到哪些匿名类在M3中实现了一个接口?

时间:2014-02-14 13:52:56

标签: rascal

我正在使用Rascal通过M3模型检测多态类型(具有> 1实现)。 在JHotDraw 6(http://www.jhotdraw.org/)中,有一个接口org::jhotdraw::framework::ViewChangeListener只能由匿名类实现,但JHotDraw的m3模型似乎不包含这些信息。

import lang::java::jdt::m3::Core;
import lang::java::m3::TypeHierarchy;
jhd6 = createM3FromEclipseProject(|project://jhotdraw60b1|);
vcl = |java+interface:///org/jhotdraw/framework/ViewChangeListener|;
invert(jhd6@implements)[vcl];

返回一个空集。

可以在m3模型中找到匿名类|java+anonymousClass:///org/jhotdraw/standard/AbstractTool/createViewChangeListener()/$anonymous1|,但不会将其识别为实现ViewChangeListener接口。

是否有可靠的方法来获取此信息?

1 个答案:

答案 0 :(得分:0)

M3本身没有此信息。模型中的实现关系仅包含在源中使用“implements”关键字的那些对。对于匿名类,情况并非如此。

此信息可在AST中找到。 AST中下面的newObject构造函数包括Declaration类中的匿名类,以及可以从Type \ type获取匿名类引用的类/接口。

\newObject(Expression expr, Type \type, list[Expression] args, Declaration class)

\newObject(Type \type, list[Expression] args, Declaration class)

也许在M3的@types关系中包含引用的类是有意义的。目前,如果我们查看类型关系,我们提供的示例

<|java+anonymousClass:///org/jhotdraw/standard/AbstractTool/createViewChangeListener()/$anonymous1|, |java+anonymousClass:///org/jhotdraw/standard/AbstractTool/createViewChangeListener()/$anonymous1|>

也许

<|java+anonymousClass:///org/jhotdraw/standard/AbstractTool/createViewChangeListener()/$anonymous1|,|java+interface:///org/jhotdraw/framework/ViewChangeListener|>

会更有意义。我会调查一下。