blob: d5f7db6576f4f50580dee6206ff90696be945ddc [file] [log] [blame]
-- @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
)
}