2016-04-19 23 views
0

私はXtextで動くDSLを持っています。私は現在、新しいFormatter 2.9 APIの下でフォーマッターを設定しています。それは、これまで素晴らしい仕事が、私はそれを徹底的に作ってみました(ので、すべての空白がフォーマットされた)が、それらは列挙型として定義されているように私は私のRelationalOperatorsをフォーマットすることはできません。Xtext 2.9書式設定列挙型

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

通常のアプローチは、各eObjectのためということですASTではメソッドが呼び出されます。 問題は、列挙型の場合はそのようなオブジェクトがないため、関係演算子を使用するすべてのオブジェクトで書式設定を定義したくないということです。また、それらをキーワードとしてフォーマットしても機能しません。

しかし、私は 'EnumRule'にアクセスすることはできますが、そこからテキスト領域にどのようにアクセスできるかわかりません。

答えて

0

は、オブジェクトによってではなく、オブジェクトを、前後の空白ためが含まれる空白文字の書式を設定することをお勧めします。これにより、書式指定の仕様との競合を避けることができます。

enumリテラルに空白が含まれていないため、列挙型の場合は何もしません。 RelationalOperatorは、メタモデルで使用されている任意の場所にフォーマットする必要があります。オペレータの前後にoneSpaceを入れてください。いくつかの書式設定コードを再利用するために、これを別のメソッドに抽出することができます。

+0

ありがとう、私の場合、それは本当に悪い練習になるでしょう。私が扱っている文法には、関係演算子を使用する複数の仕様言語が含まれています。常に演算子を同じように扱いたいと思っています。それらを単一のスペースで囲みます。したがって、あなたのアプローチに従えば、大規模な繰り返しが発生し、維持することが難しくなります。 – dohamann

0

Xtendで書かれたスーパーハックの回避策は、文書内のすべてのセマンティック領域を、enum要素と同じテキストにする場合にフォーマットします。他のフォーマットと競合しないようにSuperlow優先順位。

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のルートエンティティです。