2016-04-07 12 views
0

Ich bin Xtend/Xtext Neuling. Derzeit arbeite ich mit neuem Formatierungsprogramm-API und ich Format Regel versuchen, die wie folgt aussieht:Xtext 2.8 + Formatierer, Formatierung einfache Regel

Expression: 
    Error|Warning|Enum|Text 
; 

mit xtend Versandweg wie dieses

def dispatch void format(Expression e){ 
     if (e instanceof ErrorImpl) 
      ((ErrorImpl)e).format 
} 

Problem ist, dass Art des Ausdruck e uncovertable ist, ich bin recieving diesen Fehler

Type mismatch: cannot convert from Class<ErrorImpl> to Expression 

, warum ich nicht diese Umwandlung tun kann (vermuten i xTend Semantik natürlich) (sogar Eclipse sagt mir, dass Expression nur eine Schnittstelle ist, aus der Kinder erstellt werden.) und wie kann ich Format Methode für jedes Kind dieser Regel aufrufen? Vielen Dank.

enter image description here

Antwort

3

Die Syntax von Xtend für Typ wirft anders: statt (ErrorImpl) e Sie e as ErrorImpl schreiben. In diesem Fall ist der Typ Fall auch gar nicht nötig: aufgrund der vorhergehenden instanceof Prüfung, die Variable e implizit ErrorImpl gegossen wird, so können Sie den gleichen Code schreiben, wie

def dispatch void format(Expression e) { 
    if (e instanceof ErrorImpl) 
     e.format 
} 

würde jedoch dazu führen, diesen Code einen Stapel Überlauf, weil die format(EObject) Methode rekursiv mit der gleichen Eingabe aufgerufen wird. Um die Leistung der Versandmethoden richtig auszunutzen, sollten Sie Ihren Code wie folgt schreiben:

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 
} 

Dies erzeugt eine Methode format(Expression), die zu den spezielleren Methoden je nach Argument Typ automatisch auslöst.

Beachten Sie, dass Formatierer Versandverfahren auch ein zweites Argument vom Typ IFormattableDocument müssen, so sollten sie aussehen

def dispatch void format(Error error, extension IFormattableDocument document) { 
    // Code for handling Errors 
} 
...