2013-08-22 9 views
5

Poniższe są moje zasady gramatyczne:jak uzyskać lokalizację (# -ty wiersz) obiektu EObject w oryginalnym dokumencie?

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

Chcę wiedzieć każdy stmt # jest # -tej stmt w stmts i dokładnie ich położenie (# -ty wiersz w oryginalnym dokumencie). Tak, że mogę wskazać lokalizację, gdy użytkownik popełnia błędy.

Zastępuję konstruktor walidatora i przechowuje HashMap <Stmt, Integer>, aby uzyskać wszystkie Stmt # # -th Stmt w stmts (Nie jestem pewien, czy jest to prawidłowy sposób, ale ...). Jednak nie mam pojęcia, jak zdobyć numer linii.

Każda pomoc?

Odpowiedz

4

Przy danym EObject można łatwo uzyskać pozycję w pliku źródłowym przy użyciu org.eclipse.xtext.nodemodel.util.NodeModelUtils.getNode(EObject).

Na przykład:

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

Jeśli mogę umieścić pierwszy wiersz w każdym @Check adnotacjami metody Wezmę '- To wyrażenie nie jest dozwolone w tym kontekście, ponieważ nie powoduje żadnych skutków ubocznych . "Gdzie popełniłem błąd? –

+0

Nie wiem, którą adnotację @Check tu umieściłeś, ale myślę, że mogę wyjaśnić komunikat o błędzie. Jeśli wstawisz tylko pierwszy wiersz, czytasz tylko wartość, ale niczego nie zmieniasz. Czytanie nie ma sensu, jeśli nie robisz nic z wartością, którą czytasz. Wstaw obie linie, a błąd powinien zniknąć. –

+0

Wiem, co się stało ... Używam xtext 2.4, a domyślnym językiem weryfikatora xtext jest xtend, a nie java. Pierwszą linią w xtend powinien być "val INode node = NodeModelUtils.getNode (o);" Dziękuję Stefan, właśnie tego chcę. –

0

Za wskazanie błędów lepiej jest napisać deklaratywny weryfikator - w tym przypadku wystarczy podać Xtext problematyczny EObject i udaje się go prześledzić z powrotem do źródła. Co więcej, w twoim projekcie językowym generowany jest skrót weryfikatora.

Jednakże, jeśli musisz ręcznie prześledzić z powrotem węzłów, istnieje Injectable ILocationInFileProvider, które mogą ci pomóc.

Powiązane problemy