Chapitre 6: Interfaces conviviales d’utilisation de Wright2Ada
6.2. Modèle Wright vers texte Ada : extraction via Xpand
6.2.1 La sémantique statique d‟Ada
La sémantique statique d‟Ada est décrite à l‟aide des contraintes OCL attachées au méta-modèle partiel d‟Ada (voir chapitre 4). Ces contraintes sont réécrites en Check et attachées au méta-modèle partiel d‟Ada.
Les contraintes Check données ci-dessous seront évaluées sur les modèles Ada conformes au méta-modèle Ada. Ensuite, ces modèles seront transformés en code Ada moyennant le moteur workflow (voir section 6.2.3) qui utilise les templates Xpand (voir section 6.2.2).
Les contraintes relatives à la partie déclarative d‟un sous-programme en Ada :
context subprogram_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+specif.designator+" les
identificateurs des spécifications des tâches et des sous-programmes ne sont pas deux à deux différents":
declarations.typeSelect(subprogram_specification).collect(e|e.designator) .intersect(declarations.typeSelect(single_task_declaration).collect(e|e.i dentifier)).isEmpty;
context subprogram_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+specif.designator+" les
identificateurs des implémentations des tâches et les spécifications des sous-programmes ne sont pas deux à deux différents":
declarations.typeSelect(subprogram_specification).collect(e|e.designator) .intersect(declarations.typeSelect(task_body).collect(e|e.identifier)).is Empty;
context subprogram_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+specif.designator+" les
identificateurs des spécifications des tâches et des implémentations des sous-programmes ne sont pas deux à deux différents":
declarations.typeSelect(subprogram_body).collect(e|e.specif.designator).i ntersect(declarations.typeSelect(single_task_declaration).collect(e|e.ide ntifier)).isEmpty;
context subprogram_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+specif.designator+" les
identificateurs des implémentations des tâches et des sous-programmes ne sont pas deux à deux différents":
declarations.typeSelect(subprogram_body).collect(e|e.specif.designator).i ntersect(declarations.typeSelect(task_body).collect(e|e.identifier)).isEm pty;
context subprogram_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+specif.designator+" les
identificateurs des implémentations des tâches et les spécifications des tâches ne sont pas égaux":
declarations.typeSelect(single_task_declaration).collect(e|e.identifier)=
=declarations.typeSelect(task_body).collect(e|e.identifier);
context subprogram_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+specif.designator+" les
spécifications des sous-programmes doivent avoir des identificateurs différents" :
declarations.typeSelect(subprogram_specification).forAll(e1|
declarations.typeSelect(subprogram_specification).notExists(e2|e1!=e2 &&
e1.designator==e2.designator));
context subprogram_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+specif.designator+" les
implémentations des sous-programmes doivent avoir des identificateurs différents" :
declarations.typeSelect(subprogram_body).forAll(e1|
declarations.typeSelect(subprogram_body).notExists(e2|e1!=e2 &&
e1.specif.designator==e2.specif.designator));
context subprogram_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+specif.designator+" les
spécifications des tâches doivent avoir des identificateurs différents" : declarations.typeSelect(single_task_declaration).forAll(e1|
declarations.typeSelect(single_task_declaration).notExists(e2|e1!=e2 &&
e1.identifier==e2.identifier));
context subprogram_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+specif.designator+" les implémentations des tâches doivent avoir des noms différents" : declarations.typeSelect(task_body).forAll(e1|
declarations.typeSelect(task_body).notExists(e2|e1!=e2 &&
e1.identifier==e2.identifier));
Les contraintes relatives à la partie déclarative d‟une tâche en Ada :
context task_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+identifier+" les identificateurs des spécifications des tâches et des sous-programmes ne sont pas deux à deux différents":
declarations.typeSelect(subprogram_specification).collect(e|e.designator) .intersect(declarations.typeSelect(single_task_declaration).collect(e|e.i dentifier)).isEmpty;
context task_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+identifier+" les identificateurs des parties implémentations des tâches et les spécifications des sous-programmes ne sont pas deux à deux différents":
declarations.typeSelect(subprogram_specification).collect(e|e.designator) .intersect(declarations.typeSelect(task_body).collect(e|e.identifier)).is Empty;
context task_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+identifier+" les identificateurs des parties spécifications des tâches et des implémentations des sous-programmes ne sont pas deux à deux différents":
declarations.typeSelect(subprogram_body).collect(e|e.specif.designator).i ntersect(declarations.typeSelect(single_task_declaration).collect(e|e.ide ntifier)).isEmpty;
context task_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+identifier+" les identificateurs des implémentations des tâches et des sous-programmes ne sont pas deux à deux différents":
declarations.typeSelect(subprogram_body).collect(e|e.specif.designator).i ntersect(declarations.typeSelect(task_body).collect(e|e.identifier)).isEm pty;
context task_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+identifier+" les identificateurs des implémentations des tâches et les spécifications des tâches ne sont pas égaux":
declarations.typeSelect(single_task_declaration).collect(e|e.identifier)=
=declarations.typeSelect(task_body).collect(e|e.identifier);
context task_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+identifier+" les sous-programmes doivent avoir des identificateurs différents" :
declarations.typeSelect(subprogram_specification).forAll(e1|
declarations.typeSelect(subprogram_specification).notExists(e2|e1!=e2 &&
e1.designator==e2.designator));
context task_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+identifier+" les déclarations des tâches doivent avoir des identificateurs différents" :
declarations.typeSelect(single_task_declaration).forAll(e1|
declarations.typeSelect(single_task_declaration).notExists(e2|e1!=e2 &&
e1.identifier==e2.identifier));
context task_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+identifier+" les implémentations des tâches doivent avoir des identificateurs différents" :
declarations.typeSelect(task_body).forAll(e1|
declarations.typeSelect(task_body).notExists(e2|e1!=e2 &&
e1.identifier!=e2.identifier));
context task_body if ! declarations.isEmpty ERROR
"Au sein de la partie déclarative de "+identifier+" les implémentations des sous-programmes doivent avoir des identificateurs différents" : declarations.typeSelect(subprogram_body).forAll(e1|
declarations.typeSelect(subprogram_body).notExists(e2|e1!=e2 &&
e1.specif.designator==e2.specif.designator));
Les contraintes relatives à la partie comportementale d‟un sous-programme en Ada :
context subprogram_body if specif.metaType==procedure_specification WARNING
"La procédure "+specif.designator+" contient une (des) instruction(s) return.":
statements.notExists(e|e.metaType==return_statement);
context subprogram_body if specif.metaType==function_specification ERROR
"La fonction "+specif.designator+" contient plus qu'une instruction return.":
statements.collect(e|e.metaType==return_statement).size>=1;
context subprogram_body ERROR
"Le sous-programme "+specif.designator+" contient une (des) instruction(s) accept.":
statements.notExists(e|e.metaType==simple_accept_statement);
context subprogram_body ERROR
"Le sous-programme "+specif.designator+" contient une (des) instruction(s) select.":
statements.notExists(e|e.metaType==select_or);
Les contraintes relatives à la partie comportementale d‟une tâche en Ada :
context task_body ERROR
"La tâche "+identifier+" ne peut pas contenir une (des) instruction(s) return.":
statements.notExists(e|e.metaType==return_statement);
context task_body ERROR
"la tâche "+identifier+" ne peut pas accepter un rendez-vous non disponible parmi sa liste d'entrée":
statements.typeSelect(single_task_declaration).collect(e|e.entryDec).coll ect(e|e.identifier).containsAll(statements.typeSelect(simple_accept_state ment).collect(e|e.direct_name));