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