2016-04-21 15 views
0

Ich bin mit Xtext 2.9 Formatierer und ich versuche zu Format hiddenRegion dieKommentar enthält. Hier ist ein Teil meiner Dokumentenregion i Format versuchen:Xtext 2.8+ Formatierer, Formatierung HiddenRegion mit Kommentaren

Columns: 1:offset 2:length 3:kind 4: text 5:grammarElement 
Kind: H=IHiddenRegion S=ISemanticRegion B/E=IEObjectRegion 

35 0 H 
35 15 S ""xxx::a::b""  Refblock:namespace=Namespace 
50 0 H 
50 1 S "}"     Refblock:RCBRACKET 
     E Refblock    PackageHead:Block=Refblock path:PackageHead/Block=Package'xxx_constants'/head=Model/packages[0] 
51 0 H 
51 1 S ":"     PackageHead:COLON 
     E PackageHead   Package:head=PackageHead path:Package'xxx_constants'/head=Model/packages[0] 
52 >>>H "\n "    Whitespace:TerminalRule'WS' 
     "# asd"    Comment:TerminalRule'SL_COMMENT' 
    15 "\n "    Whitespace:TerminalRule'WS'<<< 
     B Error'ASSD'   Package:expressions+=Expression path:Package'xxx_constants'/expressions[0]=Model/packages[0] 
67 5 S "error"    Error:'error' 
72 1 H " "     Whitespace:TerminalRule'WS' 

und entsprechenden Teil der Grammatik

Model: 
    {Model} 
    (packages+=Package)*; 

Expression: 
    Error | Warning | Enum | Text; 

Package: 
    {Package} 
    'package' name=Name head=PackageHead 
    (BEGIN 
    (imports+=Import)* 
    (expressions+=Expression)* 
    END)?; 

Error: 
    {Error} 
    ('error') name=ENAME parameter=Parameter COLON 
    (BEGIN 
    (expressions+=Estatement)+ 
    END)?; 

PackageHead: 
    Block=Refblock COLON; 

Problem ist, dass wenn ich versuche prepend einige Zeichen vor dem Fehler Stichwort zum Beispiel

error.regionFor.keyword('error').prepend[setSpace("\n ")] 

Diese Einrückung ist vor dem Kommentar vorangestellt und nicht dahinter. Dies führt zu einer falschen Formatierung im Fall eines einzeiligen Kommentars vor dem Schlüsselwort 'error'.

mehr Klarheit, hier Beispielcode aus meiner Grammatik und Beschreibung des gewünschten Verhaltens ist:

Dieses
package xxx_constants {namespace="xxx::a::b"}: 
    # asd 
    error ASSD {0}: 
     Hello {0,world} 

ist erwartetes Ergebnis: (ein Feld nach links)

package xxx_constants {namespace="xxx::a::b"}: 
    # asd 
    error ASSD {0}: 
     Hello {0,world} 

und das ist das tatsächliche Ergebnis mit Voranstellungsmethode

package xxx_constants {namespace="xxx::a::b"}: 
    # asd 
error ASSD {0}: 
     Hello {0,world} 

Da die Dokumentstruktur sagt, die HiddenRegion in diesem Fall ist die Aussage:

# asd 
    error 

Wie kann ich meine Charaktere prepend direkt vor dem Stichwort ‚Fehler‘ und nicht vor dem Kommentar? Danke.

Antwort

1

Ich nehme an, dass Sie eine eindrucksensitive Sprache erstellen, da Sie explizit BEGIN und END aufrufen.

Für Vertiefung sensible Sprache meine Antwort ist: Sie werden

org.eclipse.xtext.formatting2.internal.HiddenRegionReplacer.applyHiddenRegionFormatting(List<ITextReplacer>) 

Die Methoden anhängen [] und prepend [] Sie verwenden sind überschrieben werden soll Agnostiker Kommentare und zu einem späteren Zeitpunkt applyHiddenRegionFormatting () wird aufgerufen zu entscheiden, wie diese Formatierung zwischen Kommentaren gewebt wird.

Um Xtext Ihre eigene Unterklasse von HiddenRegionReplacer verwenden zu machen, überschreibt

org.eclipse.xtext.formatting2.AbstractFormatter2.createHiddenRegionReplacer(IHiddenRegion, IHiddenRegionFormatting) 

Für Sprachen, die nicht tun Leerzeichen empfindliches lexing tun/Parsen (das ist die Standardeinstellung) ist die Antwort auf nicht Anruf setspace() um Einrückungen oder Zeilenumbrüche zu erzeugen.

Stattdessen tun

pkg.interior[indent] 
pkg.regionFor.keyword(":").append[newLine] 
pkg.append[newLine] 
+0

Danke, zwingende org.eclipse.xtext.formatting2.internal.HiddenRegionReplacer.applyHiddenRegionFormatting (Liste ) hat gearbeitet. – Smarty77