Xtext 2.9格式化枚举

时间:2016-04-19 15:30:24

标签: java eclipse enums xtext

我有一个由Xtext支持的DSL,我目前正在新的Formatter 2.9 API下设置格式化程序。它到目前为止工作得很好,但我试图使其详尽无遗(因此所有空格都被格式化)但我无法格式化我的RelationalOperators,因为它们被定义为枚举:

enum RelationalOperator:
   EQUALS='=' | LESS='<' | GREATER='>' | LESS_EQUAL='<=' | GREATER_EQUAL='>=' | UNEQUAL='!='
;

通常的方法是对AST中的每个eObject调用一个方法。 问题是,对于枚举,没有这样的对象,我不想在使用关系运算符的每个对象中定义格式。将它们格式化为关键字也不起作用。

然而,我可以访问&#39; EnumRule&#39;但我不知道如何从那里到文本区域。

2 个答案:

答案 0 :(得分:0)

优良作法是为对象包含的空白配置格式,但不为该对象的 空白配置格式。这有助于避免与格式规范冲突。

对于枚举,这意味着无所事事,因为枚举文字不包含任何空格。您必须格式化在元模型中使用的任何位置的RelationalOperator,例如在运营商之前和之后放置oneSpace。您可以将其解压缩到单独的方法,以便重用某些格式代码。

答案 1 :(得分:0)

这是一个用Xtend编写的超级hacky解决方法,如果它与enum-element具有相同的文本,则会格式化文档中的每个语义区域。超低优先级,因此不会与任何其他格式冲突。

protected def formatRelationalOperators(XtextRoot root, extension IFormattableDocument document) {
    val relationalOperatorLiterals = RelationalOperator.values.map[literal]
    val regions = root.allSemanticRegions.filter[relationalOperatorLiterals.contains(text)]
    val superLow = IHiddenRegionFormatter.LOW_PRIORITY - 1
    regions.forEach[surround[oneSpace; priority = superLow]]
}

XtextRoot只是AST的根实体。