我是Xtend / Xtext新手。目前我正在使用新的格式化程序API,我正在尝试格式化规则,如下所示:
/* These values are extracted from the decimal representation of the instructions
* of a hello world program written in asm, that gdb provides.
*/
const int main[] = {
-443987883, 440, 113408, -1922629632,
4149, 899584, 84869120, 15544,
266023168, 1818576901, 1461743468, 1684828783,
-1017312735
};
使用像这样的xtend调度方法
Expression:
Error|Warning|Enum|Text
;
问题是,那种表达方式e是不可动摇的,我收到了这个错误
def dispatch void format(Expression e){
if (e instanceof ErrorImpl)
((ErrorImpl)e).format
}
为什么我不能进行这种转换(我怀疑当然是xTend语义)(甚至Eclipse告诉我Expression只是创建子项的接口。)以及如何我可以为此规则的每个孩子调用 format 方法吗?感谢。
答案 0 :(得分:3)
类型强制转换的Xtend语法不同:您编写(ErrorImpl) e
而不是e as ErrorImpl
。在这种情况下,甚至不需要类型情况:由于前面的instanceof
检查,变量e
被隐式地转换为ErrorImpl
,因此您可以编写与
def dispatch void format(Expression e) {
if (e instanceof ErrorImpl)
e.format
}
但是,此代码会导致堆栈溢出,因为format(EObject)
方法是使用相同的输入递归调用的。为了正确利用调度方法的强大功能,您应该编写如下代码:
def dispatch void format(Error error) {
// Code for handling Errors
}
def dispatch void format(Warning warning) {
// Code for handling Warnings
}
def dispatch void format(Enum enum) {
// Code for handling Enums
}
def dispatch void format(Text text) {
// Code for handling Texts
}
这将生成一个方法format(Expression)
,该方法根据参数类型自动分派给更具体的方法。
请注意,格式化程序调度方法还需要IFormattableDocument类型的第二个参数,因此它们应该看起来像
def dispatch void format(Error error, extension IFormattableDocument document) {
// Code for handling Errors
}
...