Vous êtes sur la page 1sur 8

04/11/2010

Gnration de Code
avec Acceleo
Cedric Dumoulin

Conditions : [if]
[if (condition)]
(...)
[/if]

[if (condition)]
(...)
[else]
(...)
[/if]

[if (condition)]
(...)
[elseif (condition)]
(...)
[elseif (condition)]
(...)
[/if]

Pour spcifier une partie conditionnel dans


un [template]
condition expression boolenne
Peut avoir un [else] , des [elseif]

04/11/2010

Boucles [for]
concepts avancs

2 syntaxes

[for (iterator : Type | expression)]


(...)
[/for]

[for (expression)]
(...)
[/for]
version light

Une variable i est implicitement ajoute


dans la version light
Expression une expression dnotant
une collection

Boucles [for]
concepts avancs

Possibilit de spcifier un comportement


excuter

avant les itrations before()


entre les itrations separator()
aprs les itrations after()

Utile

pour mettre des virgules entre des mots, mais


pas a la fin
Pour mettre un ; a la fin uniquement

04/11/2010

Boucles [for]
concepts avancs
[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
;

Dclaration de variables
[let]

Let permet de tester si un lment est dun type particulier ET


de dclarer une variable de ce type
Si le test choue, le bloc entre
[let p1 : Property = p] et [/let] nest pas excut.

[template member2java(p : Member)]


[let p1 : Property = p]
member [p.visibility/] [p.type.name/] [p.name/]
[/let]
[/template]

04/11/2010

Modules
[import]

Un module peut importer des templates


dun autre modules

[import qualified::name::of::imported::module /]

Un module peut surcharger des


templates imports

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

04/11/2010

Templates, post - traitement


post()

Il est possible deffectuer un post-traitement aprs lexcution


du template, mais avant la gnration du texte:
[template public genName(ele : NamedElement) post (trim()) ]
[if ( name <> null)]
[ele.name/]
[else]
noNameDefined
[/if]
[/template]

plusieurs traitements peuvent tre enchains:


[template public a(ele : NamedElement) post (toUpper().trim())]

Le traitement seffectue 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 dfinir 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 den dclarer plusieurs :

conseil : mettre en forme

[template public main(c : Class)


{
javaName : String = c.genName();
qualifiedName : String = c.qualifiedName;
} ]
...

04/11/2010

Queries

Une query est utilis pour extraire de linformation du modle

elle retourne gnralement des objets du modle

[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 gnre du texte


une query retourne des objets

04/11/2010

Tips and Tricks

Utilisez trim() pour formater votre code


[template public a(ele : NamedElement) post (trim())]

Lors de lutilisation du polymorphisme:

crivez un template pour le cas par dfaut

faite lui crire un message derreur

ncrivez pas tous les cas laide 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,

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