95 lines
4.3 KiB
Plaintext
95 lines
4.3 KiB
Plaintext
query mm2loss =
|
|
let modulename : String = thisModule.inname + '2loss' in -- inname from Config
|
|
let classifiers : Sequence(String) = thisModule.packageNames->collect( it | ECORE!EClassifier.allInstancesFrom(it) )->iterate( it ; acc : Set(ECORE!EClassifier) = Set{} | acc.union(it) ).asSet()->collect(item | item.toRule()) in
|
|
let linkRules : Sequence(String) = ECORE!EClass.allInstancesFrom('IN').asSet()->collect(cl | cl.toLink()) in
|
|
('module ' + modulename + ';\n\ncreate LOSS : OUT from MM : IN;\n\n' + thisModule.toLink + '\n' + thisModule.join(classifiers.union(linkRules), '\n').toString()).writeTo((modulename + '.atl').path);
|
|
|
|
uses Config;
|
|
|
|
helper def : join(seq : Sequence(String), separator : String) : String =
|
|
seq->iterate(el ; acc : String = '' | if acc = '' then el else acc + separator + el endif);
|
|
|
|
helper context String def : path : String =
|
|
('/fr.tpt.mem4csd.loss.mm2loss/transformations-gen/' + self);
|
|
|
|
helper context ECORE!EClassifier def : qualifiedName : String =
|
|
self.ePackage.qualifiedName + '::' + self.name;
|
|
|
|
helper context ECORE!EPackage def : qualifiedName : String =
|
|
if self.eSuperPackage.oclIsUndefined()
|
|
then self.name
|
|
else self.eSuperPackage.qualifiedName + '::' + self.name
|
|
endif;
|
|
|
|
helper context ECORE!EClassifier def : sanitizedFullName : String = self.qualifiedName.replaceAll('::', '_');
|
|
|
|
helper context ECORE!EDataType def : toRule() : String =
|
|
'lazy rule DT' + self.sanitizedFullName + '2Prim {\n' +
|
|
'\t' + 'from' + '\n' +
|
|
'\t' + 'attrName : String' + ',\n' +
|
|
'\t' + 'source : IN!"' + self.qualifiedName + '" in MM\n' + -- NOTE: DataTypes don't inherit'" (source.oclIsTypeOf(IN!"' + self.qualifiedName + '"))\n' +
|
|
'\t' + 'to' + '\n' +
|
|
'\t' + 'prim : OUT!Primitive (' + '\n' +
|
|
'\t\t' + 'name <- attrName' + ',\n' +
|
|
'\t\t' + 'className <- \'' + self.qualifiedName + '\'\n' +
|
|
'\t' + ')' + '\n' +
|
|
'}\n';
|
|
|
|
helper context ECORE!EClass def : toLink(source: ECORE!EClass) : String =
|
|
'lazy rule ' + self.sanitizedFullName + 'ReferenceToLink {' + '\n' +
|
|
'\t' + 'from' + '\n' +
|
|
'\t' + 'refName : String' + ',\n' +
|
|
'\t' + 'source : IN!"' + self.qualifiedName + '" in MM (source.oclIsTypeOf(IN!"' + self.qualifiedName + '"))\n' +
|
|
'\t' + 'to' + '\n' +
|
|
'\t' + 'link : OUT!Link ('+ '\n' +
|
|
'\t\t' + 'name <- refName' + ',\n' +
|
|
'\t\t' + 'referenceTo <- source' + '\n' +
|
|
'\t' + ')' + '\n' +
|
|
'}\n';
|
|
|
|
helper def : toLink : String =
|
|
'lazy rule ReferenceToLink {' + '\n' +
|
|
'\t' + 'from' + '\n' +
|
|
'\t' + 'refName : String' + ',\n' +
|
|
'\t' + 'source : OclAny' + '\n' +
|
|
'\t' + 'to' + '\n' +
|
|
'\t' + 'link : OUT!Link ('+ '\n' +
|
|
'\t\t' + 'name <- refName' + ',\n' +
|
|
'\t\t' + 'referenceTo <- source' + '\n' +
|
|
'\t' + ')' + '\n' +
|
|
'}\n';
|
|
|
|
helper def : referenceToPrimitive ( ref : ECORE!EReference ) : String =
|
|
if ref.many
|
|
then '.union(source.' + ref.name + '->collect(it | thisModule.ReferenceToLink(\'' + ref.name + '\', it)))'
|
|
else
|
|
'.union(Set{source.' + ref.name + '}->select( e | not e.oclIsUndefined())->collect(it | thisModule.ReferenceToLink(\'' + ref.name + '\', it)) )'
|
|
-- '.including(thisModule.ReferenceToLink(\'' + ref.name + '\', source.' + ref.name + '))'
|
|
endif;
|
|
|
|
helper def : attributeToPrimitive ( attr : ECORE!EAttribute ) : String =
|
|
if attr.many
|
|
then '.union(source.' + attr.name + '->collect(it | thisModule.DT' + attr.eAttributeType.sanitizedFullName + '2Prim(\'' + attr.name + '\', it)))'
|
|
else '.including(thisModule.DT' + attr.eAttributeType.sanitizedFullName + '2Prim(\'' + attr.name + '\', source.' + attr.name + '))'
|
|
endif;
|
|
|
|
helper context ECORE!EClass def : toRule() : String =
|
|
let noname : Boolean = self.getEStructuralFeature('name').oclIsUndefined() in
|
|
'rule CL' + self.sanitizedFullName + '2Complex {\n' +
|
|
'\t' + 'from' + '\n' +
|
|
'\t' + 'source : IN!"' + self.qualifiedName + '" in MM (source.oclIsTypeOf(IN!"' + self.qualifiedName + '"))\n' +
|
|
'\t' + 'to' + '\n' +
|
|
'\t' + 'prim : OUT!Complex (' + '\n' +
|
|
'\t\t' + 'reference <- source' + ',\n' +
|
|
if noname
|
|
then '\t\t' + 'name <- \'NoName\'' + ',\n'
|
|
else '\t\t' + 'name <- source.name' + ',\n'
|
|
endif +
|
|
'\t\t' + 'className <- \'' + self.qualifiedName + '\',\n' +
|
|
'\t\t' + 'primitives <- Set{}' +
|
|
thisModule.join(self.eAllAttributes->collect(attr | thisModule.attributeToPrimitive(attr)), '') +
|
|
thisModule.join(self.eAllReferences->collect(ref | thisModule.referenceToPrimitive(ref)), '') + '\n' +
|
|
'\t' + ')' + '\n' +
|
|
'}\n';
|
|
|
|
-- toString().writeTo(output) |