Codegenerierung mit Xtend 21. Januar 2015
Überblick Xtend bietet einen Template-basierten Ansatz zur Codegenerierung Xtend enthält eine spezielle Template-Sprache. Das Modell kann beliebig benutzt werden, um Informationen abzurufen. Die OCL-ähnliche Syntax von Xtend kann für komplexe Anfragen an das Modell verwendet werden. Weitere Informationen: Xtend: eclipse.org/xtend Xtend User Guide 2.7.0: eclipse.org/xtend/documentation/2.7.0/xtend%20user%20guide.pdf Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 248
Ein erstes Beispiel Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 249
Ein Codegenerator mit Xtend Im Paket org.xtext.example.mydsl.generator Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 250
Start der Codegenerierung Resource nach Einstiegspunkt(en) für die Codegenerierung filtern Im Beispiel: Entity, Enumeration Name der Java-Klasse festlegen, in die generiert wird Im Beispiel: e.fullyqualifiedname.tostring("/") + ".java Um fullyqualifiedname benutzen zu können, ist ein spezieller Service nötig, der über Dependency Injection mittels Google Guice bereitgestellt wird: import com.google.inject.inject @Inject extension IQualifiedNameProvider Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 251
Beispiel: Zwei Templates In MyClassModelgenerator.xtend: Guillements: Ctrl + < und Ctrl + > Syntaxvervollständigung: Ctrl + Space Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 252
Codegenerierungsprozess MWE2 Workflow: Grammatik in grammaruri Dateiendung in file.extensions Infrastrukturprojektname in projectname, Projekt in runtimeproject In Java geschriebener Generatorcode im Ordner xtend-gen: Codegenerierung im Anwendungsprojekt: Im Anwendungsprojekt: Erzeuge einen Source- Ordner src-gen Der generierte Code wird in diesen Ordner geschrieben. Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 253
Ein größeres Beispiel Code-Generierung aus einfachen Klassenmodellen Weitere Konzepte: Eine compile-methode pro Modellelementtyp Behandlung von Optionen Behandlung von Typvererbung im Modell Benutzung von Aufzählungen Erzeugung von Listen, z.b. Parameterlisten Navigation durch das Modell, um weitere Informationen zu sammeln Gut lesbaren Code erzeugen Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 254
Xtext-Grammatik für Klassenmodelle Taentzer 255
Beispiel: Entities mit Import u. Vererbung Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 256
Generierung aus einem Modell mit Vererbung Zwei verschiedene Arten von Dateien Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 257
Generierung aus einem Modell mit Vererbung - 2 Übergeordneter Container: econtainer Inhalt eines EObject: econtents Selektion anhand des Typs: <obj> instanceof <type> Verwendung eines EObject als bestimmter Typ: <obj> as <type> Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 258
Beispiel: Behandlung von Aufzählungen Das Template: und seine Verwendung: Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 259
Generierung von Listen mit speziellen Formaten FOR-Schleifen können speziell konfiguriert werden: BEFORE fügt Text vor einer Iteration ein. AFTER fügt Text nach einer Iteration ein. SEPARATOR fügt Text zwischen Iterationen ein. BEFORE und AFTER werden für mind. eine Iteration ausgeführt, SEPARATOR für mind. zwei. Beispiel für BEFORE u. AFTER: Öffnende und schließende Klammern um jede Iteration Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 260
Behandlung von Zwischenräumen in der Ausgabe Der generierte Code soll gut lesbar sein. Deshalb werden Zwischenräume mitgeneriert. Es soll möglich sein, gut lesbaren Text jeglichen Formats (nicht nur Java-Code) zu erzeugen. Aber auch der Template-Code soll gut lesbar sein. Einrückungen der Kontrollkonstrukte (z.b. FOR, IF) werden nicht berücksichtigt. Zeilen, die keinen statischen Text enthalten, sondern Kontrollstrukturen oder Aufrufe, die leere Strings erzeugen, erscheinen nicht in der Ausgabe. Zwischenräume zwischen statischen Texten werden ausgegeben. Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 261
Verwendung mehrerer Xtend-Klassen Variablendeklaration mit val Objekterzeugung mit new Aufruf der Methode Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 262
Beispiel: Einfügen eines Id-Felds In compile(entity e): Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 263
Beispiel-Codeerzeugung Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 264
Kontinuierliche Erweiterung des Codegenerators Entwicklung eines Codegenerators Referenzanwendung(en) abstrahieren generieren erweitern Entwicklung einer konkreten Anwendung 1. Generierung eines Prototyps, soweit möglich 2. manuelle Erweiterung des generierten Codes um das nächste Feature 3. Analyse des erweiterten Codes 4. Erweiterung des Generators und eventuell der DSL Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 265
Zusammenfassung Xtend eignet sich zur Codeerzeugung Zum Generieren von Code wird IGenerator implementiert. Die Methode dogenerate wird überschrieben Weitere Template-basierte Methoden werden hinzugefügt. Zur Definition von Templates hat Xtend einfache Kontrollkonstrukte: for, if elseif else Berechnungen aus Modellinformationen sollten in separaten Methoden durchgeführt werden. Zwischenräume können in den Templates explizit definiert werden. Taentzer Modellgetriebene Entwicklung von mobilen Anwendungen 266