© DrHitch/Shutterstock.com
DSL mit Xtext/Xtend

3 Das Luecken(x)text-Modul, eine DSL mit Unterstützung


Im zweiten Kapitel haben wir uns die Implementierung für den Zugriff auf ein flexibles Vorlageverzeichnis sowie die Bereitstellung einer Liste der in einer Vorlagedatei enthaltenen Platzhalternamen erarbeitet. Diese Hilfsroutinen haben wir dann sowohl beim „Content Assist“ als auch beim „Quickfix“ benutzt. Allerdings machen diese rein technischen Hilfskonstruktionen den jeweiligen Xtend-Code sehr unübersichtlich. Um den Fokus auf die veränderlichen Teile unserer DSL wiederzugewinnen, werden wir die Routinen zum Auflisten der Dateien im Vorlageverzeichnis, dem Einlesen einer Vorlagedatei, sowie dem Auflisten bzw. Ersetzen der Platzhalter in ein eigenes Modul auslagern und sehen, wie wir diese in unserer DSL nutzen.

LxtCore: Möglichkeiten der Unterstützung für den DSL-Entwickler

Alles, was wir mit den externen Dateien und deren Inhalt machen, hat mit der eigentlichen Xtext/Xtend-Entwicklung einer DSL nichts zu tun. Es bietet sich daher an, all diese Routinen in eine eigene statische Klasse auszulagern. In unserem Projekt de.ulrichmerkel.lueckenxtext.lxt3 erstellen wir im src-Verzeichnis ein neues Paket de.ulrichmerkel.lueckenxtext.util, in dem wir die Datei LxtCore.xtend anlegen. Die dorthin übertragenen Routinen sind alle mit dem Präfix lxt versehen. Zugleich wurden zusätzliche Routinen geschaffen, die die Gültigkeit von Verzeichnisangaben prüfen.

Die Details sind im Kasten „LxtCore: Auslagerung der Routinen für Vorlagedateien“ dargestellt.

Lxt3: gleiche Funktionen wie bei Lxt2, aber jetzt mit der Nutzung von LxtCore

Die Auslagerung vereinfacht wieder die Erstellung unserer DSL-Unterstützung. Durch die Kapselung werden die einzelnen Bauteile kleiner und übersichtlicher. Außerdem erlaubt sie uns eine recht flexible Modifikation. Solange wir den „Contract“ mit unseren Anwendern einhalten, haben wir alle Freiheiten zur Optimierung der Routinen.

Wir müssen lediglich unsere Klasse importieren und können dann durch ein vorangestelltes LxtCore:: auf die statischen Routinen zugreifen (Listing 3.1, diese Grammatik weicht von der aus Java gewohnten ab).

/*
* generated by Xtext: Lxt3Generator.xtend
*/
package de.ulrichmerkel.lueckenxtext.lxt3.generator
import de.ulrichmerkel.lueckenxtext.lxt3.lxt3.Entity

<SNIP>

import de.ulrichmerkel.lueckenxtext.lxt3.util.LxtCore
<SNIP>

def makeTheCodeAutocopy(Model sm) '''
«LxtCore::lxtSetClipboard(makeTheCode(sm).toString)»
'''

def addMergeFile(Mergefile mf) {
LxtCore::loadLxtWorkText(mf.name)
for (KeyValuePair kvp : mf.placeholderPairs)...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang