| -- @atlcompiler atl2006 |
| --/******************************************************************************* |
| -- * Copyright (c) 2009 Ecole des Mines de Nantes. |
| -- * All rights reserved. This program and the accompanying materials |
| -- * are made available under the terms of the Eclipse Public License v2.0 |
| -- * which accompanies this distribution, and is available at |
| -- * https://www.eclipse.org/legal/epl-2.0/ |
| -- * |
| -- * Contributors: |
| -- * Kelly Garces - initial implementation and/or initial documentation |
| -- *******************************************************************************/ |
| module FlattenFeatures; |
| create OUT : EqualMM from IN : EqualMM, m1 : Metametamodel, m2 : Metametamodel; |
| |
| uses EqualMM; |
| |
| uses Metametamodel; |
| |
| uses EcoreMetametamodel; |
| |
| helper def: methodName : String = |
| 'Flatten Features'; |
| |
| helper context EqualMM!EqualClass def: equalSupertypes : Sequence(EqualMM!EqualClass) = |
| self.rightE('m2').allSupertypes->collect(e | |
| self.model.getCorrespondingEqualClass(e) |
| )->flatten()->asSet()->intersection(self.leftE('m1').allSupertypes->collect(e | |
| self.model.getCorrespondingEqualClass(e) |
| )->flatten()); |
| |
| abstract rule Link { |
| from |
| l : EqualMM!WLink |
| to |
| alink : EqualMM!WLink ( |
| name <- l.name, |
| model <- l.model, |
| child <- l.child |
| ) |
| } |
| |
| abstract rule Equal extends Link { |
| from |
| l : EqualMM!Equal |
| to |
| alink : EqualMM!Equal ( |
| left <- thisModule.leftElement(l.left), |
| right <- thisModule.rightElement(l.right), |
| similarity <- l.similarity |
| ) |
| } |
| |
| abstract rule Added extends Link { |
| from |
| l : EqualMM!Added |
| to |
| alink : EqualMM!Added ( |
| right <- thisModule.rightElement(l.right) |
| ) |
| } |
| |
| abstract rule Deleted extends Link { |
| from |
| l : EqualMM!Deleted |
| to |
| alink : EqualMM!Deleted ( |
| left <- thisModule.leftElement(l.left) |
| ) |
| } |
| |
| rule EqualClass extends Equal { |
| from |
| l : EqualMM!EqualClass |
| ( |
| not l.rightE('m2').isAbstract |
| ) |
| to |
| alink : EqualMM!EqualClass ( |
| child <- l.child->union(l.equalSupertypes->collect(s | |
| s.child |
| ))->flatten()->collect(e | |
| thisModule.link(e) |
| ) |
| ) -- do { |
| -- l.equalSupertypes; |
| -- } |
| -- do { |
| -- l.equalSupertypes; |
| -- } |
| |
| } |
| |
| rule IntroduceSuperClassWithRestrictedProperty extends EqualClass { |
| from |
| l : EqualMM!IntroduceSuperClassWithRestrictedProperty |
| to |
| alink : EqualMM!IntroduceSuperClassWithRestrictedProperty |
| } |
| |
| lazy abstract rule link { |
| from |
| l : EqualMM!WLink |
| to |
| t : EqualMM!WLink ( |
| name <- l.name, |
| model <- l.model |
| ) |
| } |
| |
| lazy rule EqualStructuralFeature extends link { |
| from |
| l : EqualMM!EqualStructuralFeature |
| to |
| t : EqualMM!EqualStructuralFeature ( |
| name <- l.name, |
| left <- thisModule.leftElement(l.left), |
| right <- thisModule.rightElement(l.right), |
| similarity <- l.similarity, |
| description <- l.description, |
| userAssistance <- l.userAssistance |
| ) |
| } |
| |
| lazy rule EqualReference extends EqualStructuralFeature { |
| from |
| l : EqualMM!EqualReference |
| to |
| t : EqualMM!EqualReference |
| } |
| |
| lazy rule EqualAttribute extends EqualStructuralFeature { |
| from |
| l : EqualMM!EqualAttribute |
| to |
| t : EqualMM!EqualAttribute |
| } |
| |
| lazy rule MovePropertyToOwner extends EqualStructuralFeature { |
| from |
| l : EqualMM!MovePropertyToOwner |
| to |
| t : EqualMM!MovePropertyToOwner ( |
| associatedReference <- thisModule.rightElement(l.associatedReference) |
| ) |
| } |
| |
| lazy rule MovePropertyToOwned extends EqualStructuralFeature { |
| from |
| l : EqualMM!MovePropertyToOwned |
| to |
| t : EqualMM!MovePropertyToOwned ( |
| associatedReference <- thisModule.leftElement(l.associatedReference) |
| ) |
| } |
| |
| lazy rule ExtractClass extends EqualStructuralFeature { |
| from |
| l : EqualMM!ExtractClass |
| to |
| t : EqualMM!ExtractClass ( |
| associatedReference <- thisModule.rightElement(l.associatedReference) |
| ) |
| } |
| |
| lazy rule InlineClass extends EqualStructuralFeature { |
| from |
| l : EqualMM!InlineClass |
| to |
| t : EqualMM!InlineClass ( |
| associatedReference <- thisModule.leftElement(l.associatedReference) |
| ) |
| } |
| |
| lazy rule PushProperty extends EqualStructuralFeature { |
| from |
| l : EqualMM!PushProperty |
| to |
| t : EqualMM!PushProperty |
| } |
| |
| lazy rule PullProperty extends EqualStructuralFeature { |
| from |
| l : EqualMM!PullProperty |
| to |
| t : EqualMM!PullProperty |
| } |
| |
| lazy rule FlattenProperty extends EqualStructuralFeature { |
| from |
| l : EqualMM!FlattenProperty |
| to |
| t : EqualMM!FlattenProperty |
| } |
| |
| lazy rule ExtractSuperClass extends EqualStructuralFeature { |
| from |
| l : EqualMM!ExtractSuperClass |
| to |
| t : EqualMM!ExtractSuperClass |
| } |
| |
| lazy rule RestrictTypeReference extends EqualReference { |
| from |
| l : EqualMM!RestrictTypeReference |
| to |
| t : EqualMM!RestrictTypeReference ( |
| description <- l.description |
| ) |
| } |
| |
| lazy rule RestrictTypeAttribute extends EqualAttribute { |
| from |
| l : EqualMM!RestrictTypeAttribute |
| to |
| t : EqualMM!RestrictTypeAttribute ( |
| description <- l.description |
| ) |
| } |
| |
| lazy rule RestrictMultiplicityReference extends EqualReference { |
| from |
| l : EqualMM!RestrictMultiplicityReference |
| to |
| t : EqualMM!RestrictMultiplicityReference ( |
| description <- l.description |
| ) |
| } |
| |
| lazy rule AddedStructuralFeature extends link { |
| from |
| l : EqualMM!AddedStructuralFeature |
| to |
| t : EqualMM!AddedStructuralFeature ( |
| right <- thisModule.rightElement(l.right) |
| ) |
| } |
| |
| lazy rule AddedAttribute extends AddedStructuralFeature { |
| from |
| l : EqualMM!AddedAttribute |
| to |
| t : EqualMM!AddedAttribute |
| } |
| |
| lazy rule AddedReference extends AddedStructuralFeature { |
| from |
| l : EqualMM!AddedReference |
| to |
| t : EqualMM!AddedReference |
| } |
| |
| lazy rule IntroducedRestrictedAttribute extends AddedAttribute { |
| from |
| l : EqualMM!IntroduceRestrictedProperty |
| to |
| t : EqualMM!IntroduceRestrictedProperty ( |
| description <- l.description |
| ) |
| } |
| |
| lazy rule DeletedStructuralFeature extends link { |
| from |
| l : EqualMM!DeletedStructuralFeature |
| to |
| t : EqualMM!DeletedStructuralFeature ( |
| left <- thisModule.leftElement(l.left) |
| ) |
| } |
| |
| lazy rule DeletedAttribute extends DeletedStructuralFeature { |
| from |
| l : EqualMM!DeletedAttribute |
| to |
| t : EqualMM!DeletedAttribute |
| } |
| |
| lazy rule DeletedReference extends DeletedStructuralFeature { |
| from |
| l : EqualMM!DeletedReference |
| to |
| t : EqualMM!DeletedReference |
| } |
| |
| rule AddedClass extends Added { |
| from |
| l : EqualMM!AddedClass |
| to |
| alink : EqualMM!AddedClass ( |
| child <- l.child->collect(e | |
| thisModule.link(e) |
| ) |
| ) |
| } |
| |
| rule DeletedClass extends Deleted { |
| from |
| l : EqualMM!DeletedClass |
| to |
| alink : EqualMM!DeletedClass ( |
| child <- l.child->collect(e | |
| thisModule.link(e) |
| ) |
| ) |
| } |
| |
| lazy rule EqualReferenceWOParent { |
| from |
| l : EqualMM!EqualReference -- ( |
| -- l.parent.oclIsUndefined() |
| -- ) |
| -- ( |
| -- l.parent.oclIsUndefined() |
| -- ) |
| |
| -- ( |
| -- l.parent.oclIsUndefined() |
| -- ) |
| -- ( |
| -- l.parent.oclIsUndefined() |
| -- ) |
| to |
| alink : EqualMM!EqualReference ( |
| name <- l.name, |
| left <- thisModule.leftElement(l.left), |
| right <- thisModule.rightElement(l.right), |
| similarity <- l.similarity |
| ) |
| } |
| |
| lazy rule EqualAttributeWOParent { |
| from |
| l : EqualMM!EqualAttribute -- ( |
| -- l.parent.oclIsUndefined() |
| -- ) |
| -- ( |
| -- l.parent.oclIsUndefined() |
| -- ) |
| |
| -- ( |
| -- l.parent.oclIsUndefined() |
| -- ) |
| -- ( |
| -- l.parent.oclIsUndefined() |
| -- ) |
| to |
| alink : EqualMM!EqualAttribute ( |
| name <- l.name, |
| left <- thisModule.leftElement(l.left), |
| right <- thisModule.rightElement(l.right), |
| similarity <- l.similarity |
| ) |
| } |
| |
| lazy rule leftElement { |
| from |
| mmw : EqualMM!LeftElement |
| to |
| out : EqualMM!LeftElement ( |
| name <- mmw.name, |
| element <- mmw.element |
| ) |
| } |
| |
| lazy rule rightElement { |
| from |
| mmw : EqualMM!RightElement |
| to |
| out : EqualMM!RightElement ( |
| name <- mmw.name, |
| element <- mmw.element |
| ) |
| } |
| |
| rule AddedReferenceAssociation { |
| from |
| mmw : EqualMM!AddedReferenceAssociation |
| to |
| out : EqualMM!AddedReferenceAssociation ( |
| model <- mmw.model, |
| associationEnd <- mmw.associationEnd |
| ) |
| } |
| |
| rule AssociationEnd { |
| from |
| mmw : EqualMM!AssociationEnd |
| to |
| out : EqualMM!AssociationEnd ( |
| name <- mmw.name, |
| relatedLink <- if mmw.relatedLink.oclIsUndefined() then |
| OclUndefined |
| else |
| if mmw.relatedLink.oclIsTypeOf(EqualMM!AddedClass) then |
| mmw.relatedLink |
| else |
| if mmw.relatedLink.oclIsTypeOf(EqualMM!EqualReference) then |
| thisModule.EqualReferenceWOParent(mmw.relatedLink) |
| else |
| thisModule.EqualAttributeWOParent(mmw.relatedLink) |
| endif |
| endif |
| endif |
| ) |
| } |
| |
| rule ElementRefs { |
| from |
| mmw : EqualMM!ElementRef |
| to |
| out : EqualMM!ElementRef ( |
| name <- mmw.name, |
| ref <- mmw.ref, |
| modelRef <- mmw.modelRef |
| ) |
| } |
| |
| rule matchmodel { |
| from |
| mmw : EqualMM!MatchModel |
| to |
| model : EqualMM!MatchModel ( |
| name <- mmw.name, |
| leftM <- mmw.leftM, |
| rightM <- mmw.rightM, |
| methods <- mmw.methods->union(Sequence {method}) |
| ), |
| method : EqualMM!Method ( |
| name <- thisModule.methodName |
| ) |
| } |
| |
| rule method { |
| from |
| mmw : EqualMM!Method |
| to |
| method : EqualMM!Method ( |
| name <- mmw.name |
| ) |
| } |
| |
| rule modelref { |
| from |
| mmw : EqualMM!ModelRef |
| to |
| out : EqualMM!ModelRef ( |
| name <- mmw.name, |
| ref <- mmw.ref |
| ) |
| } |