Génération de Code avec Acceleo Conditions : [if]
Transcription
Génération de Code avec Acceleo Conditions : [if]
04/11/2010 Génération de Code avec Acceleo Cedric Dumoulin Conditions : [if] [if (condition)] (...) [/if] [if (condition)] (...) [else] (...) [/if] [if (condition)] (...) [elseif (condition)] (...) [elseif (condition)] (...) [/if] Pour spécifier une partie conditionnel dans un [template] condition – expression booléenne Peut avoir un [else] , des [elseif] 1 04/11/2010 Boucles [for] concepts avancés 2 syntaxes [for (iterator : Type | expression)] (...) [/for] [for (expression)] (...) [/for] version light Une variable ‘i’ est implicitement ajoutée dans la version light Expression – une expression dénotant une collection Boucles [for] concepts avancés Possibilité de spécifier un comportement à exécuter avant les itérations – before() entre les itérations – separator() après les itérations – after() Utile pour mettre des virgules entre des mots, mais pas a la fin Pour mettre un ; a la fin uniquement 2 04/11/2010 Boucles [for] concepts avancés [for (Sequence{1, 2, 3}) before ('sequence: ') separator (', ') after (';')] [i/] [/for] ou [for (Sequence{1, 2, 3}) before ('sequence: ') separator (', ') after (';')] [this/] [/for] produit : sequence: 1 ,2 ,3 ; Déclaration de variables [let] Let – permet de tester si un élément est d’un type particulier ET de déclarer une variable de ce type Si le test échoue, le bloc entre [let p1 : Property = p] et [/let] n’est pas exécuté. [template member2java(p : Member)] [let p1 : Property = p] member [p.visibility/] [p.type.name/] [p.name/] [/let] [/template] 3 04/11/2010 Modules [import] Un module peut importer des templates d’un autre modules [import qualified::name::of::imported::module /] Un module peut surcharger des templates importés Modules [import] - exemple [module main('http:///mjava.ecore')/] [module common('http:///mjava.ecore')/] [import pje::javagen::tests::common /] [template public a(ele : NamedElement)] template a from common [/template] [template public main(c : Class)] [comment @main /] [file (c.name, false, 'UTF-8')] [c.name/] [template public b(ele : NamedElement)] template b from common [/template] [a(c)/] [b(c)/] [/file] [/template] [template public b(ele : NamedElement) template b from main [/template] C1 template a from common template b from main 4 04/11/2010 Templates, post - traitement post() Il est possible d’effectuer un post-traitement après l’exécution du template, mais avant la génération du texte: [template public genName(ele : NamedElement) post (trim()) ] [if ( name <> null)] [ele.name/] [else] noNameDefined [/if] [/template] plusieurs traitements peuvent être enchainés: [template public a(ele : NamedElement) post (toUpper().trim())] Le traitement s’effectue sur un ‘String’ [template public a(ele : NamedElement) post (postTreatment())] ... [/template] [template public postTreatment(txt : String)] [toUpper().trim()/] [/template] Templates Initialisation de variables Un template, et tout bloc, peut définir et initialiser des variables : conseil : ne pas oublier le ‘;’ [template public main(c : Class) {javaName : String = c.genName();} ] [comment @main /] [file (c.name, false, 'UTF-8')] [c.name/] public class [javaName/] { } [/file] [/template] Il est possible d’en déclarer plusieurs : conseil : mettre en forme [template public main(c : Class) { javaName : String = c.genName(); qualifiedName : String = c.qualifiedName; } ] ... 5 04/11/2010 Queries Une query est utilisé pour extraire de l’information du modèle elle retourne généralement des objets du modèle [query public getPublicProperties(c : Classifier) : Set(Property) = c.properties->select(visibility = VisibilityKind.public) /] ou (la forme ci-dessus ne marche pas avec Acceleo) [query public getPublicProperties(c : Classifier) : Set(Property) = c.properties->select(visibility.toString() = 'public') /] Utilise le langage OCL notion de base dans: Help Contents -> Acceleo (…) -> OCL Operation References Queries Utilisation: [template public main(c : Class) {javaName : String = c.genName();} ] [comment @main /] [file (c.name, false, 'UTF-8')] [javaName/] { /* Public properties */ [for (p : Property | c.getPublicProperties())] public [p.genName()/]; [/for] } [/file] [/template] Query vs template un template génére du texte une query retourne des objets 6 04/11/2010 Tips and Tricks Utilisez trim() pour formater votre code [template public a(ele : NamedElement) post (trim())] Lors de l’utilisation du polymorphisme: écrivez un template pour le cas par défaut faite lui écrire un message d’erreur n’écrivez pas tous les cas à l’aide de [if] faite un template pour chaque sous-cas [template genJavaTypeName(c : Classifier) post (trim())] /* TODO Implement template genJavaTypeName for type [eClass().name/] */ [/template] [template genJavaTypeName(c : Class) post (trim())] [name.toUpperFirst()/] [/template] Tips and Tricks Utilisez plusieurs modules pour organiser votre code exemple: common, compilationUnit, classifier, … 7 04/11/2010 Bibliographie Standard OMG Aide Eclipse Help Contents -> Acceleo (…) -> Quick Start http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.ac celeo.doc/doc/overview.html Site Acceleo http://www.omg.org/spec/MOFM2T/1.0/ http://www.eclipse.org/acceleo/ http://www.eclipse.org/acceleo/documentation/ Tutorial Voir Help Contents -> Acceleo -> tuto 8