1

我正在使用 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];

返回一个空集。

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

有没有可靠的方法来获取这些信息?

4

1 回答 1

0

M3 本身没有此信息。模型中的 implements 关系仅包含那些在源代码中使用“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|>

会更有意义。我会仔细看看的。

于 2014-02-14T19:33:24.633 回答