2013-08-22 6 views
5

Die folgenden sind meine Grammatikregeln:Wie bekomme ich die Position (# -te Zeile) von EObject im Originaldokument?

Stmts: (stmts += Stmt ';')* ; 
Stmt: Stmt1 | Stmt2 | Stmt3 ... ; 

ich jede Stmt # # -te Anw in stmts und ihre genau Lage (# -te Zeile in Originaldokument) ist wissen wollen. So dass ich auf den Ort hinweisen könnte, wenn Benutzer Fehler machen.

Ich überschreibe den Validator Konstruktor und speichern ein HashMap <Stmt, Integer>, um jedes Stmt # ist das # -te Stmt in Stmts (Nicht sicher, ob dies der richtige Weg ist zu tun, obwohl ...). Ich habe jedoch keine Ahnung, wie ich ihre Zeilennummer bekommen soll.

Irgendwelche Hilfe?

Antwort

4

Bei einem EObject können Sie die Position in der Quelldatei mithilfe von org.eclipse.xtext.nodemodel.util.NodeModelUtils.getNode(EObject) leicht ermitteln.

Zum Beispiel:

INode node = NodeModelUtils.getNode(o); 
    System.out.println(String.format("Node goes from line %s to line %s",node.getStartLine(), node.getEndLine())); 
+0

Wenn ich die ersten Zeile in jedem @Check kommentierten Methode habe ich bekommen würde '- Dieser Ausdruck wird in diesem Zusammenhang nicht erlaubt, da es nicht Ursache ist von Nebenwirkungen .', wo habe ich falsch gemacht? –

+0

Ich weiß nicht, welche @Check-Annotation Sie hier einfügen, aber ich denke, dass ich die Fehlermeldung erklären kann. Wenn Sie nur die erste Zeile eingeben, lesen Sie nur einen Wert, ändern aber nichts. Das Lesen ist sinnlos, wenn Sie nichts mit dem Wert tun, den Sie lesen. Setze beide Zeilen ein und der Fehler sollte verschwinden. –

+0

Ich weiß, was passiert ist ... Ich benutze Xtext 2.4 und Standardsprache von Xtext Validator ist xtend nicht Java. Die erste Zeile in xtend sollte 'val INode knoten = NodeModelUtils.getNode (o) sein;' Danke Stefan, das ist genau was ich will. –

0

Zum Aufzeigen von Fehlern ist einfach das Schreiben eines deklarativen Validators besser geeignet - in diesem Fall geben Sie Xtext einfach ein problematisches EObject und es schafft es, es zurück zur Quelle zu verfolgen. Außerdem wird in Ihrem Sprachprojekt ein Validator-Stub generiert.

Wenn Sie jedoch die Knoten manuell zurückverfolgen müssen, gibt es den Injectable ILocationInFileProvider, der Ihnen helfen kann.