Xtext 2.8+格式化程序,格式化简单规则

时间:2016-04-07 12:37:39

标签: xtext xtend

我是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 方法吗?感谢。

enter image description here

1 个答案:

答案 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
}
...