query mm2loss = let modulename : String = 'face2loss' in let classifiers : Sequence(String) = ECORE!EClassifier.allInstancesFrom('IN').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.join(classifiers.union(linkRules), '\n').toString()).writeTo((modulename + '.atl').path); 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/' + 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' + '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 <- source.toString()' + '\n' + '\t' + ')' + '\n' + '}\n'; helper context ECORE!EClass def : toLink(source: ECORE!EClass) : String = 'lazy rule ' + self.sanitizedFullName + 'ReferenceToLink {' + '\n' + '\t' + 'from' + '\n' + '\t' + 'source : IN!"' + self.qualifiedName + '" in MM (source.oclIsTypeOf(IN!"' + self.qualifiedName + '"))\n' + '\t' + 'to' + '\n' + '\t' + 'link : OUT!Link ('+ '\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(it)))' else '.add(thisModule.ReferenceToLink(source.' + ref.name + '))' endif; helper context ECORE!EClass def : toRule() : String = 'rule CL' + self.sanitizedFullName.debug('class: ') + '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' + 'name <- source.toString(),' + '\n' + '\t\t' + 'primitives <- Set{}' + thisModule.join(self.eAllReferences->collect(ref | thisModule.referenceToPrimitive(ref)), '') + '\n' + '\t' + ')' + '\n' + '}\n'; -- toString().writeTo(output)