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: Taentzer Guillements: Ctrl + „<„ und Ctrl + „>“ Syntaxvervollständigung: Ctrl + Space 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: Taentzer Codegenerierung im Anwendungsprojekt: Im Anwendungsprojekt: Erzeuge einen SourceOrdner src-gen Der generierte Code wird in diesen Ordner geschrieben. 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