Größere Sprachverbreitung mit dem Language Server Protocol
Größere Sprachverbreitung mit dem Language Server Protocol
Es gibt derzeit viel Hype um das Language Server Protocol. In diesem Beitrag stellen wir einen einzelnen Sprachserver für die mit Xtext implementierte YANG-Sprache vor, der an drei verschiedene Client Frameworks angehängt ist: VSCode, Theia IDE und Eclipse. Sämtlicher Source-Code ist auf GitHub frei verfügbar.
Dieser Beitrag ist im Original auf dem Blog der TypeFox GmbH erschienen.
Das Language Server Protocol (LSP) erlaubt Tools zur Sprachimplementierung, den Editor-Support für die jeweilige Sprache in einen Server auszulagern, der mit mehreren Clients anhand eines JSON-basierten Protokolls kommunizieren kann. Obwohl das Language Server Protocol ursprünglich nur für Visual Studio Code entwickelt wurde, haben viele weitere Editor-Clients die Unterstützung hierfür eingerichtet, wodurch wiederum viele Sprachserver für verschiedenste Sprachen entstanden sind. Für die mit Xtext implementierte YANG-Sprache gibt es einen Sprachserver, drei Client Frameworks (VSCode, Theia IDE und Eclipse) sind mit ihm verbunden. Da Theia sowohl eine browserbasierte IDE als auch einen Electron-basierten Rich-Client zulässt, ergeben sich insgesamt vier verschiedene IDE-Arten.
YANG ist eine Datenmodellierungssprache, die zur Modellierung von Konfigurations- und Zustandsdaten, die zuvor durch das NETCONF-Protokoll, durch Remote-Procedure-Calls oder durch Notifications manipuliert wurden, verwendet wird.
Im yang-Isp-Projekt haben wir einen YANG-Sprachserver via Xtext implementiert. Wie Christian Schneider bereits in einem vorangegangenen Blogpost anmerkte, kann Xtext mit wenig Aufwand einen LSP generieren. Wie fast jede Sprache hat YANG allerdings auch einige Besonderheiten, die dafür sorgen, dass Services wie die Validierung, die Formatierung und das Scoping angepasst werden müssen. Um die User Experience zu verbessern, haben wir überdies einige Services der Language Server IDE, wie bspw. Content-Assist, CodeLense, Symbols und mehr, angepasst. Die Dependency Injection von Xtext macht solche Änderungen leicht, aber dennoch ist der Mehraufwand etwas, dass nicht für jede mögliche IDE mit der entsprechenden nativen API wiederholt werden will.
Der YANG-Sprachserver an sich ist in Xtend geschrieben, einem Java-Dialekt. Das bedeutet, dass Gradle für jeden Build ausgeführt werden muss. Da Sprachserver normalerweise in ihrem eigenen Prozess ausgeführt werden, erstellt der Build einige Skripte, um den Language Server starten zu können. Der laufende Server wird anschließend per Standard-I/O oder über einen Socket mit dem Client verbunden.
Der YANG-Editor in VSCode / Quelle: TypeFox
VSCode ist eine erweiterbare, leichtgewichtige Open Source IDE von Microsoft. Unter dem Namen yang-vscode haben wir eine Erweiterung für VSCode, basierend auf dem yang-Isp, implementiert. Sie besteht hauptsächlich aus
Für weitere Informationen empfehle ich Miro Spönemanns Blogpost über VSCode-Erweiterungen mit Xtext.
Die yang-Erweiterung lässt sich direkt über Microsofts Marketplace installieren. Wenn Sie die Erweiterung allerdings direkt aus dem Source Code selbst kompilieren wollen, müssen sie das Yang-Isp-Projekt ausgecheckt und in einem Ordner neben dem Yang-VSCode-Repository abgelegt haben. Letzteres wird nämlich während des Builds kopiert.
Der YANG-Editor in Theia (Browsermodus) / Quelle: TypeFox
Theia ist ein neues Framework für IDEs, die im Browser oder mit dem gleichen Code als Rich-Client laufen. Es ist in TypeScript geschrieben, hat erstklassigen Support für das LSP und nutzt Microsofts Editor-Widget Monaco. Offiziell wurde Theia noch nicht released, aber eine Beta 1.0 ist für Dezember 2017 geplant.
Das Projekt yangster enthält die Theia-Erweiterung für die YANG-Sprache. Es ist als Mono-Repository angelegt, enthält verschiedene npm-Pakete und verknüpft andere als Git-Submodule. Trotz dessen, dass dieses Setup auf den ersten Blick recht kompliziert anmutet, ermöglicht es gleichzeitige Arbeit mit YANG, Theia und sprotty. Der yang-Isp wird während des Build-Vorgangs von Jenkins kopiert.
Das Kernpaket besteht aus der theia-yang-Erweiterung. Sie verbindet YANG-spezifische Dienste mit Theias DI-Containern, registriert Kontextmenüs und konfiguriert das Syntax-Highlighting für das Frontend. Bei Bedarf startet sie auch den Sprachserver im Backend.
Die Pakete yangster-app
und yangster-app-electron
enthalten jeweils den Code, um Theia mit der YANG-Erweiterung als Browser-App oder wahlweise als Electron-Rich-Client auszuführen. Theia kommt mit einem Kommandozeilen-Tool, das diese Pakete während des Builds mit generiertem Code füllt.
Der YANG-Editor in Theia (Electron-Modus) / Quelle: TypeFox
Für Build-Anleitungen empfehlen wir die Readme des Projekts.
Last but not least, haben wir yang-Isp in Eclipse integriert. Wir verwenden dazu Isp4e, da es einem generischen Eclipse-Editor erlaubt, von einem Sprachserver supportet zu werden. Am einfachsten kann die Erweiterung über den Eclipse Marketplace installiert werden.
Das yang-eclipse-Projekt besteht hauptsächlich aus einem Plug-in, um Isp4e integrieren zu können, d.h.:
Wichtig ist: Obwohl der Client in Xtend/Java geschrieben ist, starten wir den Sprachserver in der gleichen Art und Weise wie zuvor weiter oben geschildert – in einem separaten Prozess.
Der YANG_Editor in Eclipse / Quelle: TypeFox
Xtext kann natürlich ebenso gut einen nativen Eclipse-Editor erzeugen, der in der Regel einige zusätzliche Features und eine leicht bessere User Experience ermöglichen würde. Wir haben im heutigen Beispiel allerdings auf diesen Ansatz verzichtet. Nicht nur, um einen LSP in Eclipse zu zeigen, sondern auch, weil wir einige IDE-Features mit nativen Eclipse-APIs neu hätten implementieren müssen. Damit wäre dann unsererseits doppelt so viel Code zu pflegen.
Wenn Sie sich die Screenshots genauer angesehen oder etwas im Code gestöbert haben, sind Sie womöglich über einige eigenartige Diagramme gestolpert. Um die Spannung zu halten, werde ich jene in einem separaten Artikel behandeln.
Im Beitrag haben Sie gesehen, wie ein in Xtext implementierter Single Language Server die YANG-Sprache für vier verschiedene IDEs supportet. Dafür wird wenig spezifischer Boilerplate-Code benötigt, hauptsächlich um den Server zu starten und um Client-seitige Services wie Syntax-Highlighting (bzw. Services, die vom LSP als „Client only“ angesehen werden) zu implementieren.
Wir haben nach vier IDEs aufgehört, aber es gibt auch LSP-Anbindungen für Sublime, Emacs, Vim und weitere Editoren. Es sollte nicht schwer sein, diese in der gleichen Art und Weise einzubinden.
Lesen Sie auch: „Theia ist für mich eine klassische IDE, die auf moderner Technologie beruht“
Ich hoffe, ich konnte Sie davon überzeugen, dass die Kombination von Xtext und LSP einen gangbaren Weg darstellt, um mehr als eine IDE mit Sprachunterstützung auszustatten.