Codegenerierung mit Xtend - Uni

Werbung
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
Herunterladen
Explore flashcards