我有一个由Xtext支持的DSL,我目前正在新的Formatter 2.9 API下设置格式化程序。它到目前为止工作得很好,但我试图使其详尽无遗(因此所有空格都被格式化)但我无法格式化我的RelationalOperators,因为它们被定义为枚举:
enum RelationalOperator:
EQUALS='=' | LESS='<' | GREATER='>' | LESS_EQUAL='<=' | GREATER_EQUAL='>=' | UNEQUAL='!='
;
通常的方法是对AST中的每个eObject调用一个方法。 问题是,对于枚举,没有这样的对象,我不想在使用关系运算符的每个对象中定义格式。将它们格式化为关键字也不起作用。
然而,我可以访问&#39; EnumRule&#39;但我不知道如何从那里到文本区域。答案 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的根实体。