2013-08-22 10 views
5

Quelle che seguono sono le mie regole grammaticali:come ottenere la posizione (linea # -th) di EObject nel documento originale?

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

Voglio sapere ogni Stmt # è # esimo stmt a stmts e la loro esattamente posizione (# linea esimo nel documento originale). Tale che potrei indicare la posizione quando l'utente commette errori.

Sovrascrivo il costruttore del validatore e memorizzo un HashMap <Stmt, Integer> per ottenere ogni Stmt # è il # -st Stmt in stmts (Non sono sicuro se questo è il modo corretto per farlo però ...). Tuttavia non ho idea di come ottenere il loro numero di linea.

Qualsiasi aiuto?

risposta

4

Dato un oggetto EObject è possibile ottenere facilmente la posizione nel file di origine utilizzando org.eclipse.xtext.nodemodel.util.NodeModelUtils.getNode(EObject).

Ad esempio:

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

Se metto la prima linea in qualsiasi metodo annotato @Check Prendo '- Questa espressione non è consentito in questo contesto, dal momento che non è così causa effetti collaterali .', dove ho sbagliato? –

+0

Non so quale annotazione @Check hai inserito qui, ma penso di poter spiegare il messaggio di errore. Se metti solo la prima riga, stai solo leggendo un valore, ma non modificando nulla. Quindi la lettura è inutile, se non fai nulla con il valore che leggi. Inserisci entrambe le righe e l'errore dovrebbe andare via. –

+0

So cosa è successo ... Sto usando xtext 2.4 e il linguaggio predefinito di xtext validator è xtend non java. La prima riga in xtend dovrebbe essere 'val INode node = NodeModelUtils.getNode (o); 'Grazie Stefan, è esattamente quello che voglio. –

0

Per indicare gli errori, è sufficiente scrivere semplicemente un validatore dichiarativo: in tal caso, è sufficiente fornire Xtext EObject problematico e riesce a risalire all'origine. Inoltre, uno stub validatore viene generato nel tuo progetto di lingua.

Tuttavia, se è necessario eseguire manualmente il rintracciamento dei nodi, è disponibile il ILocationInFileProvider iniettabile che può essere d'aiuto.

Problemi correlati