| /******************************************************************************* |
| * Copyright (c) 2017 Willink Transformations and others. |
| * 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 |
| * http://www.eclipse.org/legal/epl-v20.html |
| * |
| * Contributors: |
| * E.D.Willink - initial implementation |
| *******************************************************************************/ |
| import atlMM : 'platform:/resource/org.eclipse.m2m.atl.common/model/ATL.ecore#/0'; |
| import atloclMM : 'platform:/resource/org.eclipse.m2m.atl.common/model/ATL.ecore#/1'; |
| import atlprimsMM : 'platform:/resource/org.eclipse.m2m.atl.common/model/ATL.ecore#/2'; |
| --import atlMM : 'http://www.eclipse.org/gmt/2005/ATL'; |
| --import atloclMM : 'http://www.eclipse.org/gmt/2005/OCL'; |
| --import atlprimsMM : 'http://www.eclipse.org/gmt/2005/ATL-PrimitiveTypes'; |
| |
| import pivotMM : 'platform:/resource/org.eclipse.ocl.pivot/model/Pivot.ecore'::pivot; |
| import qvtbMM : 'platform:/resource/org.eclipse.qvtd.pivot.qvtbase/model/QVTbase.ecore'::qvtbase; |
| import qvttMM : 'platform:/resource/org.eclipse.qvtd.pivot.qvttemplate/model/QVTtemplate.ecore'::qvttemplate; |
| import qvtrMM : 'platform:/resource/org.eclipse.qvtd.pivot.qvtrelation/model/QVTrelation.ecore'::qvtrelation; |
| import qvttraceMM : 'platform:/resource/org.eclipse.qvtd.runtime/model/QVTtrace.ecore'::qvttrace; |
| |
| package org::eclipse::qvtd::atl::atl2qvtr { |
| /** |
| * Transform an ATL transformation to a QVTr transformation |
| */ |
| transformation ATL2QVTr(atl:{atlMM,atloclMM,atlprimsMM}, qvtr:{qvtrMM,qvttMM,qvtbMM,pivotMM}) |
| { |
| query getCommonType(type1 : pivotMM::Type[1], type2 : pivotMM::Type[1]) : pivotMM::Type[1] implementedby 'org.eclipse.qvtd.atl.atl2qvtr.utilities.Helper4getCommonType'; |
| |
| -- query getContextVariable(_transformation : qvtrMM::RelationalTransformation) : pivotMM::VariableDeclaration[1] implementedby 'org.eclipse.qvtd.atl.atl2qvtr.Helper4getContextVariable'; |
| |
| query getHelper(element : atlMM::LocatedElement[1]) : atlMM::Helper[?] { |
| let helpers = element->closure(e : ocl::OclElement | e.oclContainer())->selectByKind(atlMM::Helper) |
| in if helpers->notEmpty() then helpers->any(true) else null endif |
| } |
| -- query getHelper(element : atlMM::LocatedElement[1]) : atlMM::Helper[1] { |
| -- element->closure(e : ocl::OclElement | e.oclContainer())->selectByKind(atlMM::Helper)->any(true) |
| -- } |
| |
| query getModule(element : atlMM::LocatedElement) : atlMM::Module[1] implementedby 'org.eclipse.qvtd.atl.atl2qvtr.utilities.Helper4getModule'; |
| |
| query getOperation(type : pivotMM::Type[1], name : String[1]) : pivotMM::Operation[1] implementedby 'org.eclipse.qvtd.atl.atl2qvtr.utilities.Helper4getOperation'; |
| |
| query getPackage(atlModule : atlMM::Module[1], name : String[1]) : pivotMM::Package implementedby 'org.eclipse.qvtd.atl.atl2qvtr.utilities.Helper4getPackage'; |
| |
| query getProperty(type : pivotMM::Type[1], name : String[1]) : pivotMM::Property[1] implementedby 'org.eclipse.qvtd.atl.atl2qvtr.utilities.Helper4getProperty'; |
| |
| query getType(type : atloclMM::OclType[?]) : pivotMM::Class[1] implementedby 'org.eclipse.qvtd.atl.atl2qvtr.utilities.Helper4getType'; |
| -- query getType(type : atloclMM::OclType[1]) : pivotMM::Type[1] { |
| -- if type.oclIsKindOf(atloclMM::BooleanType[1]) then pivotMM::Boolean |
| -- elseif type.oclIsKindOf(atloclMM::IntegerType[1]) then pivotMM::Integer |
| -- elseif type.oclIsKindOf(atloclMM::RealType[1]) then pivotMM::Real |
| -- elseif type.oclIsKindOf(atloclMM::StringType[1]) then pivotMM::String |
| -- else pivotMM::OclInvalid |
| -- endif |
| -- } |
| |
| query getTypedModel(oclModel : atloclMM::OclModel[1], _transformation : qvtrMM::RelationalTransformation) : qvtbMM::TypedModel[1] implementedby 'org.eclipse.qvtd.atl.atl2qvtr.utilities.Helper4getTypedModel'; |
| -- query getTypedModel_IN(atlPattern : atlMM::InPattern[1], _relation : qvtrMM::Relation) : qvtbMM::TypedModel[1] implementedby 'org.eclipse.qvtd.atl.atl2qvtr.Helper4getTypedModel'; |
| -- query getTypedModel_OUT(atlPattern : atlMM::OutPattern[1], _relation : qvtrMM::Relation) : qvtbMM::TypedModel[1] implementedby 'org.eclipse.qvtd.atl.atl2qvtr.Helper4getTypedModel'; |
| |
| query getVariable(type : atloclMM::VariableDeclaration[1]) : pivotMM::Variable[1] implementedby 'org.eclipse.qvtd.atl.atl2qvtr.utilities.Helper4getVariable'; |
| |
| /** |
| * atl::Binding <=> qvtr::PropertyTemplateItem |
| */ |
| top relation mapBinding { |
| propertyName : String; |
| atlExpression : atloclMM::OclExpression; |
| atlOutPatternElement : atlMM::SimpleOutPatternElement; |
| qvtrExpression : pivotMM::OCLExpression; |
| qvtrTemplate : qvttMM::ObjectTemplateExp; |
| enforce domain atl atlBinding : Binding { |
| outPatternElement = atlOutPatternElement, |
| propertyName = propertyName, |
| value = atlExpression |
| }; |
| enforce domain qvtr qvtrPart : PropertyTemplateItem { |
| objContainer = qvtrTemplate, |
| value = qvtrExpression, |
| referredProperty = getProperty(qvtrTemplate.type, propertyName) |
| }; |
| when { |
| mapSimpleOutPatternElement(atlOutPatternElement, qvtrTemplate); |
| mapOclExpression(atlExpression, qvtrExpression); |
| } |
| } |
| |
| /** |
| * atl::Helper <=> qvtr::Function |
| */ |
| top abstract relation mapHelper { |
| enforce domain atl atlHelper : Helper {}; |
| enforce domain qvtr qvtrFunction : Function {}; |
| } |
| |
| /** |
| * atl::Helper/OclFeatureDefinition/Attribute <=> qvtr::Function |
| */ |
| top relation mapHelper_Attribute overrides mapHelper { |
| attributeName : String; |
| atlModule : atlMM::Module; |
| atlExpression : atloclMM::OclExpression; |
| atlType : atloclMM::OclType; |
| qvtrTransformation : qvtrMM::RelationalTransformation; |
| qvtrExpression : pivotMM::OCLExpression; |
| enforce domain atl atlHelper : Helper { |
| module = atlModule, |
| definition = atlDefinition : OclFeatureDefinition { |
| feature = atlFeature : Attribute { |
| name = attributeName, |
| type = atlType, |
| initExpression = atlExpression |
| } |
| } |
| }; |
| enforce domain qvtr qvtrFunction : Function { |
| name = attributeName, |
| owningClass = qvtrTransformation, |
| type = getType(atlType), |
| queryExpression = qvtrExpression |
| }; |
| when { |
| mapModule(atlModule, qvtrTransformation); |
| mapOclExpression(atlExpression, qvtrExpression); |
| } |
| where { |
| mapHelper_Context(atlHelper, qvtrFunction); |
| -- mapType(aType, returnType); |
| } |
| } |
| |
| relation mapHelper_Context { |
| enforce domain atl atlHelper : Helper { |
| definition = atlDefinition: OclFeatureDefinition { |
| context_ = atlContext : OclContextDefinition { |
| context_ = atlReturnType : OclType{} |
| } |
| } |
| }; |
| enforce domain qvtr qvtrFunction : Function { |
| ownedParameters = qvtrParameter : FunctionParameter { |
| name = 'self', |
| type = getType(atlContext.context_) |
| } |
| }; |
| where { |
| -- mapType(aType, returnType); |
| mapVariable(atlHelper, qvtrParameter); |
| } |
| } |
| |
| |
| /** |
| * atl::Helper/OclFeatureDefinition/Operation <=> qvtr::Function |
| */ |
| top relation mapHelper_Operation overrides mapHelper { |
| operationName : String; |
| atlModule : atlMM::Module; |
| atlExpression : atloclMM::OclExpression; |
| atlType : atloclMM::OclType; |
| qvtrTransformation : qvtrMM::RelationalTransformation; |
| qvtrExpression : pivotMM::OCLExpression; |
| enforce domain atl atlHelper : Helper { |
| module = atlModule, |
| definition = atlDefinition : OclFeatureDefinition { |
| feature = atlFeature : Operation { |
| name = operationName, |
| returnType = atlType, |
| body = atlExpression |
| } |
| } |
| }; |
| enforce domain qvtr qvtrFunction : Function { |
| name = operationName, |
| owningClass = qvtrTransformation, |
| type = getType(atlType), |
| queryExpression = qvtrExpression |
| }; |
| when { |
| mapModule(atlModule, qvtrTransformation); |
| mapOclExpression(atlExpression, qvtrExpression); |
| } |
| where { |
| mapHelper_Context(atlHelper, qvtrFunction); |
| -- mapType(aType, returnType); |
| } |
| } |
| |
| /** |
| * atl::InPattern <=> qvtr::RelationDomain (checkonly) |
| */ |
| top relation mapInPattern { |
| atlModule : atlMM::Module; |
| qvtrTypedModel : qvtbMM::TypedModel; |
| atlModel : atloclMM::OclModel = atlPattern.elements.type->selectByKind(atloclMM::OclModelElement)->any(true).model; |
| enforce domain atl atlPattern : InPattern { |
| rule = atlRule : MatchedRule{ |
| -- module = atlModule |
| } |
| } { atlModel.metamodel = null }; |
| enforce domain qvtr qvtrDomain : RelationDomain { |
| rule = qvtrRelation : Relation { |
| -- transformation = qvtrTransformation : RelationalTransformation{} |
| }, |
| isCheckable = true, |
| isEnforceable = false, |
| typedModel = qvtrTypedModel |
| -- typedModel = getTypedModel(atlPattern.elements.type->selectByKind(atloclMM::OclModelElement)->any(z | true).model, qvtrTransformation) |
| }; |
| when { |
| mapOclMetamodel(atlModel, qvtrTypedModel); |
| mapMatchedRule(atlRule, qvtrRelation); |
| -- mapOclMetamodel_IN(atlPattern.elements->any(true).type.model, qvtrTypedModel); |
| -- mapOclMetamodel_IN(atlPattern.elements->any(true).type.model, qvtrTypedModel); |
| } |
| } |
| |
| /** |
| * atl::InPattern filter <=> qvtr::RelationDomain when |
| */ |
| top relation mapInPattern_filter { |
| atlExpression : atloclMM::OclExpression; |
| qvtrExpression : pivotMM::OCLExpression; |
| enforce domain atl atlPattern : InPattern { |
| rule = atlRule : MatchedRule{}, |
| filter = atlExpression |
| }; |
| enforce domain qvtr qvtrDomain : RelationDomain { |
| rule = qvtrRelation : Relation { |
| when = w : Pattern{ |
| predicate = p : Predicate{ |
| conditionExpression = qvtrExpression |
| } |
| } |
| } |
| }; |
| when { |
| mapMatchedRule(atlRule, qvtrRelation); |
| mapInPattern(atlPattern, qvtrDomain); |
| mapOclExpression(atlExpression, qvtrExpression); |
| } |
| } |
| |
| /** |
| * atl::MatchedRule <=> qvtr::Relation |
| */ |
| top relation mapMatchedRule { |
| ruleName : String; |
| atlModule : atlMM::Module; |
| qvtrTransformation : qvtrMM::RelationalTransformation; |
| enforce domain atl matchedRule : MatchedRule { |
| module = atlModule, |
| name = ruleName, |
| outPattern = atlOutPattern : OutPattern {} |
| }; |
| enforce domain qvtr qvtrRelation : Relation { |
| name = ruleName, |
| isAbstract = matchedRule.isAbstract, |
| isTopLevel = true, |
| transformation = qvtrTransformation, |
| variable = :SharedVariable { |
| name = 'trace', |
| isImplicit = true, |
| type = qvttraceMM::TraceElement |
| } |
| }; |
| when { |
| mapModule(atlModule, qvtrTransformation); |
| } |
| } |
| |
| /** |
| * atl::MatchedRule super <=> qvtr::Relation overridden |
| */ |
| top relation mapMatchedRule_super { |
| enforce domain atl atlChildRule : MatchedRule { |
| superRule = atlSuperRule : MatchedRule{} |
| }; |
| enforce domain qvtr qvtrOverridesRelation : Relation { |
| overrides = qvtrOverriddenRelation:Relation{} |
| }; |
| when { |
| mapMatchedRule(atlSuperRule, qvtrOverriddenRelation); |
| mapMatchedRule(atlChildRule, qvtrOverridesRelation); |
| } |
| } |
| |
| /** |
| * atl::Module <=> qvtr::RelationModel/Package/RelationalTransformation |
| */ |
| top relation mapModule { |
| txName : String; |
| enforce domain atl atlModule : Module { |
| name = txName |
| }; |
| enforce domain qvtr qvtrTransformation : RelationalTransformation { |
| name = txName, |
| owningPackage = : Package { |
| name = '', |
| Model = : RelationModel { |
| -- name = null |
| } |
| }, |
| ownedContext = : pivotMM::Parameter { |
| name = 'this', |
| type = qvtrTransformation, |
| isRequired = true |
| }, |
| modelParameter = : qvtbMM::TypedModel { |
| isTrace = true, |
| name = 'middle' |
| } |
| }; |
| } |
| |
| /** |
| * atl::Module/atl::OclModel <=> qvtr::TypedModel (create) |
| */ |
| top relation mapOclMetamodel { |
| tmName : String; |
| enforce domain atl oclMetamodel : OclModel { |
| metamodel = null, |
| name = tmName |
| }; |
| enforce domain qvtr qvtrTypedModel : TypedModel { |
| name = tmName |
| }; |
| } |
| |
| /** |
| * atl::Module/atl::OclModel <=> qvtr::TypedModel (create) |
| */ |
| top relation mapOclModel_IN { |
| qvtrTransformation : qvtrMM::RelationalTransformation; |
| qvtrPackages : Set(pivotMM::Package); |
| enforce domain atl oclModel : OclModel { |
| metamodel = oclMetamodel : OclModel { |
| metamodel = null |
| }, |
| opposite(Module::inModels) = atlModule : Module {} |
| }; |
| enforce domain qvtr qvtrTypedModel : TypedModel { |
| transformation = qvtrTransformation, |
| usedPackage = qvtrPackages |
| } |
| default_values { |
| qvtrPackages = getPackage(atlModule, oclMetamodel.name).oclAsSet(); |
| }; |
| when { |
| mapModule(atlModule, qvtrTransformation); |
| mapOclMetamodel(oclMetamodel, qvtrTypedModel); |
| } |
| } |
| |
| /** |
| * atl::Module/atl::OclModel <=> qvtr::TypedModel (create) |
| */ |
| top relation mapOclModel_OUT { |
| qvtrTransformation : qvtrMM::RelationalTransformation; |
| qvtrPackages : Set(pivotMM::Package); |
| enforce domain atl oclModel : OclModel { |
| metamodel = oclMetamodel : OclModel { |
| metamodel = null |
| }, |
| opposite(Module::outModels) = atlModule : Module {} |
| }; |
| enforce domain qvtr qvtrTypedModel : TypedModel { |
| transformation = qvtrTransformation, |
| usedPackage = qvtrPackages |
| } |
| default_values { |
| qvtrPackages = getPackage(atlModule, oclMetamodel.name).oclAsSet(); |
| }; |
| when { |
| mapModule(atlModule, qvtrTransformation); |
| mapOclMetamodel(oclMetamodel, qvtrTypedModel); |
| } |
| } |
| |
| /** |
| * atl::StringExp <=> ocl::StringLiteralExp |
| */ |
| top relation mapOclType overrides mapOclExpression { |
| enforce domain atl atlExpression : OclType {}; |
| enforce domain qvtr; -- FIXME don't really want anything |
| } |
| |
| /** |
| * atl::SimpleInPatternElement <=> qvtr::DomainPattern,ObjectTemplateExp,TemplateVariable |
| */ |
| top relation mapSimpleInPatternElement { |
| elementName : String; |
| atlRule : atlMM::MatchedRule; |
| -- qvtrDomain : qvtrMM::RelationDomain; |
| qvtrRelation : qvtrMM::Relation; |
| enforce domain atl atlElement : atlMM::SimpleInPatternElement { |
| varName = elementName, |
| inPattern = atlPattern : InPattern{ |
| rule = atlRule |
| } |
| }; |
| enforce domain qvtr qvtrTemplate : ObjectTemplateExp{ |
| bindsTo = qvtrVariable : TemplateVariable{ |
| name = elementName, |
| type = getType(atlElement.type), |
| Relation = qvtrRelation, |
| RelationDomain = qvtrDomain : RelationDomain{ |
| --FIXME rule = qvtrRelation, |
| pattern = qvtrPattern : DomainPattern{ |
| templateExpression = qvtrTemplate |
| } |
| } |
| }, |
| referredClass = getType(atlElement.type), |
| type = getType(atlElement.type) |
| }; |
| when { |
| mapMatchedRule(atlRule, qvtrRelation); |
| mapInPattern(atlPattern, qvtrDomain); |
| -- mapOclExpression(atlExpression, qvtrExpression); |
| } |
| where { |
| mapVariable(atlElement, qvtrVariable); |
| } |
| } |
| |
| /** |
| * atl::SimpleOutPatternElement <=> qvtr::RelationDomain,DomainPattern,ObjectTemplateExp,TemplateVariable |
| */ |
| top relation mapSimpleOutPatternElement { |
| elementName : String; |
| qvtrType : pivotMM::Type; |
| enforce domain atl atlElement : atlMM::SimpleOutPatternElement { |
| varName = elementName, |
| type = atlType : OclModelElement{ |
| model = atlMetamodel : OclModel{ |
| metamodel = null |
| } |
| }, |
| outPattern = atlPattern : OutPattern{ |
| rule = atlRule : MatchedRule{} |
| } |
| }; |
| enforce domain qvtr qvtrTemplate : ObjectTemplateExp{ |
| DomainPattern = qvtrPattern : DomainPattern{ |
| relationDomain = qvtrDomain : RelationDomain{ |
| isCheckable = false, |
| isEnforceable = true, |
| typedModel = qvtrTypedModel : TypedModel{}, |
| rule = qvtrRelation : Relation{} |
| } |
| }, |
| bindsTo = qvtrVariable : TemplateVariable{ |
| name = elementName, |
| type = qvtrType, |
| RelationDomain = qvtrDomain, |
| Relation = qvtrRelation |
| }, |
| referredClass = qvtrType, |
| type = qvtrType |
| } |
| default_values { qvtrType = getType(atlType);}; |
| when { |
| mapOclMetamodel(atlMetamodel, qvtrTypedModel); |
| mapMatchedRule(atlRule, qvtrRelation); |
| } |
| where { |
| mapVariable(atlElement, qvtrVariable); |
| } |
| } |
| |
| /** |
| * atl::Module <=> qvtr::RelationModel/Package/RelationalTransformation |
| * |
| top relation mapType { |
| -- txName : String; |
| /*enforce* / domain atl atlType : StringType { |
| -- name = txName |
| }; |
| enforce domain qvtr qvtrType : Type { |
| }; |
| } */ |
| /************************************Expressions*********************************/ |
| /** |
| * atl::BooleanExp <=> ocl::BooleanLiteralExp |
| */ |
| top relation mapBooleanExp overrides mapOclExpression { |
| symbol : Boolean; |
| enforce domain atl atlExpression : BooleanExp { |
| booleanSymbol = symbol |
| }; |
| enforce domain qvtr qvtrExpression : BooleanLiteralExp { |
| booleanSymbol = symbol, |
| type = pivotMM::Boolean |
| }; |
| } |
| |
| /** |
| * atl::IfExp <=> ocl::IfExp |
| */ |
| top relation mapIfExp overrides mapOclExpression { |
| enforce domain atl atlExpression : IfExp { |
| condition = atlCondition : OclExpression{}, |
| thenExpression = atlThen : OclExpression{}, |
| elseExpression = atlElse : OclExpression{} |
| }; |
| enforce domain qvtr qvtrExpression : IfExp { |
| ownedCondition = qvtrCondition : OCLExpression{}, |
| ownedThen = qvtrThen : OCLExpression{}, |
| ownedElse = qvtrElse : OCLExpression{}, |
| type = getCommonType(qvtrThen.type, qvtrElse.type) |
| }; |
| when { |
| mapOclExpression(atlCondition, qvtrCondition); |
| mapOclExpression(atlThen, qvtrThen); |
| mapOclExpression(atlElse, qvtrElse); |
| } |
| } |
| |
| /** |
| * atl::IntegerExp <=> ocl::IntegerLiteralExp |
| */ |
| top relation mapIntegerExp overrides mapOclExpression { |
| symbol : Integer; |
| enforce domain atl atlExpression : IntegerExp { |
| integerSymbol = symbol |
| }; |
| enforce domain qvtr qvtrExpression : IntegerLiteralExp { |
| integerSymbol = symbol, |
| type = pivotMM::Integer |
| }; |
| } |
| |
| /** |
| * atl::NavigationOrAttributeCallExp <=> ocl::PropertyCallExp |
| */ |
| top abstract relation mapNavigationOrAttributeCallExp overrides mapOclExpression { |
| enforce domain atl atlExpression : NavigationOrAttributeCallExp {}; |
| enforce domain qvtr qvtrExpression : PropertyCallExp {}; |
| } |
| top relation mapNavigationOrAttributeCallExp_Helper overrides mapNavigationOrAttributeCallExp { |
| propertyName : String; |
| atlModule = getModule(atlExpression); |
| atlAttributes = atlModule.elements->selectByKind(atlMM::Helper)._definition.feature->selectByKind(atloclMM::Attribute)->select(name=propertyName); |
| qvtrTransformation : qvtrMM::RelationalTransformation; |
| qvtrOperation : pivotMM::Operation; |
| qvtrThisVariable = qvtrTransformation.ownedContext.oclAsType(pivotMM::VariableDeclaration[1]); |
| enforce domain atl atlExpression : NavigationOrAttributeCallExp { |
| source = atlSource : OclExpression{}, |
| name = propertyName |
| }; |
| enforce domain qvtr qvtrExpression : OperationCallExp { |
| ownedSource = qvtrSource : VariableExp{ |
| referredVariable = qvtrThisVariable, |
| type = qvtrThisVariable.type, |
| name = qvtrThisVariable.name -- debug/readability aid |
| }, |
| ownedArguments = qvtrSourceArgument : OCLExpression{}, |
| referredOperation = qvtrOperation, |
| type = qvtrOperation.type, |
| name = propertyName -- debug/readability aid |
| }; |
| when { |
| mapModule(atlModule, qvtrTransformation); |
| atlAttributes->notEmpty(); |
| mapHelper_Attribute(atlAttributes->any(true)._definition?.Helper, qvtrOperation); |
| mapOclExpression(atlSource, qvtrSourceArgument); |
| } |
| } |
| top relation mapNavigationOrAttributeCallExp_Property overrides mapNavigationOrAttributeCallExp { |
| propertyName : String; |
| atlModule : atlMM::Module = getModule(atlExpression); |
| atlAttributes : Sequence(atloclMM::Attribute); |
| qvtrProperty : pivotMM::Property[1] = getProperty(qvtrSource.type, propertyName); |
| enforce domain atl atlExpression : NavigationOrAttributeCallExp { |
| source = atlSource : OclExpression{}, |
| name = propertyName |
| } |
| default_values { |
| atlAttributes = Sequence{}; |
| }; |
| enforce domain qvtr qvtrExpression : PropertyCallExp { |
| ownedSource = qvtrSource : OCLExpression{}, |
| referredProperty = qvtrProperty, |
| type = qvtrProperty.type, |
| name = propertyName -- debug/readability aid |
| } |
| default_values { |
| atlAttributes = atlModule.elements->selectByKind(atlMM::Helper)._definition.feature->selectByKind(atloclMM::Attribute)->select(name=propertyName); |
| }; |
| when { |
| atlAttributes->isEmpty(); |
| mapOclExpression(atlSource, qvtrSource); |
| } |
| } |
| |
| /** |
| * atl::OclExpression <=> ocl::OCLExpression |
| */ |
| top abstract relation mapOclExpression { |
| enforce domain atl atlExpression : OclExpression {}; |
| enforce domain qvtr qvtrExpression : OCLExpression {}; |
| } |
| |
| /** |
| * atl::OperationCallExp <=> ocl::OperationCallExp |
| */ |
| top abstract relation mapOperationCallExp overrides mapOclExpression { |
| enforce domain atl atlExpression : OperationCallExp {}; |
| enforce domain qvtr qvtrExpression : OperationCallExp {}; |
| } |
| top relation mapOperationCallExp_Helper overrides mapOperationCallExp { |
| operationName : String; |
| atlModule = getModule(atlExpression); |
| atlOperations = atlModule.elements->selectByKind(atlMM::Helper)._definition.feature->selectByKind(atloclMM::Operation)->select(name=operationName); |
| qvtrTransformation : qvtrMM::RelationalTransformation; |
| qvtrOperation : pivotMM::Operation; |
| qvtrThisVariable = qvtrTransformation.ownedContext.oclAsType(pivotMM::VariableDeclaration[1]); |
| enforce domain atl atlExpression : OperationCallExp { |
| source = atlSource : OclExpression{}, |
| operationName = operationName |
| }; -- {not atlExpression.oclIsKindOf(OperatorCallExp)}; |
| enforce domain qvtr qvtrExpression : OperationCallExp { |
| ownedSource = qvtrSource : VariableExp{ |
| referredVariable = qvtrThisVariable, |
| type = qvtrThisVariable.type, |
| name = qvtrThisVariable.name -- debug/readability aid |
| }, |
| ownedArguments = qvtrSourceArgument : OCLExpression{}, |
| referredOperation = qvtrOperation, |
| type = qvtrOperation.type, |
| name = operationName -- debug/readability aid |
| }; |
| when { |
| mapModule(atlModule, qvtrTransformation); |
| atlOperations->notEmpty(); |
| mapHelper_Operation(atlOperations->any(true)._definition?.Helper, qvtrOperation); |
| mapOclExpression(atlSource, qvtrSourceArgument); |
| } |
| } |
| top relation mapOperationCallExp_Operation overrides mapOperationCallExp { |
| operationName : String; |
| atlModule : atlMM::Module; |
| atlOperations : Sequence(atloclMM::Operation); |
| qvtrOperation : pivotMM::Operation; |
| enforce domain atl atlExpression : OperationCallExp { |
| source = atlSource : OclExpression{}, |
| operationName = operationName |
| } --{not atlExpression.oclIsKindOf(OperatorCallExp)} |
| default_values { |
| atlOperations = Sequence{}; |
| }; |
| enforce domain qvtr qvtrExpression : OperationCallExp { |
| ownedSource = qvtrSource : OCLExpression{}, |
| referredOperation = qvtrOperation, |
| type = qvtrOperation.type, |
| name = operationName -- debug/readability aid |
| } |
| default_values { |
| atlModule = getModule(atlExpression); |
| atlOperations = atlModule.elements->selectByKind(atlMM::Helper)._definition.feature->selectByKind(atloclMM::Operation)->select(name=operationName); |
| qvtrOperation = getOperation(qvtrSource.type, operationName); |
| }; |
| when { |
| atlOperations->isEmpty(); |
| mapOclExpression(atlSource, qvtrSource); |
| } |
| } |
| |
| /** |
| * atl::OperationCallExp argument <=> ocl::OperationCallExp argument |
| */ |
| top relation mapOperationCallExp_argument { |
| enforce domain atl atlArgument : OclExpression { |
| parentOperation = atlParent : OperationCallExp{} |
| }; |
| enforce domain qvtr qvtrArgument : OCLExpression { |
| OperationCallExp = qvtrParent : OperationCallExp{} |
| }; |
| when { |
| mapOperationCallExp(atlParent, qvtrParent); |
| mapOclExpression(atlArgument, qvtrArgument); |
| } |
| } |
| |
| /** |
| * atl::OperatorCallExp <=> ocl::OperationCallExp |
| */ |
| top relation mapOperatorCallExp overrides mapOperationCallExp_Operation { |
| operationName : String; |
| -- atlModule : atlMM::Module = getModule(atlExpression); |
| -- qvtrTransformation : qvtrMM::RelationalTransformation; |
| qvtrOperation : pivotMM::Operation = getOperation(qvtrSource.type, operationName); |
| enforce domain atl atlExpression : OperatorCallExp { |
| source = atlSource : OclExpression{}, |
| operationName = operationName |
| }; |
| enforce domain qvtr qvtrExpression : OperationCallExp { |
| ownedSource = qvtrSource : OCLExpression{}, |
| referredOperation = qvtrOperation, |
| type = qvtrOperation.type, |
| name = operationName -- debug/readability aid |
| }; |
| when { |
| -- mapModule(atlModule, qvtrTransformation); |
| mapOclExpression(atlSource, qvtrSource); |
| } |
| } |
| |
| /** FIXME CG fails double => BigDecimal |
| * atl::RealExp <=> ocl::RealLiteralExp |
| * |
| top relation mapRealExp overrides mapOclExpression { |
| symbol : Real; |
| /*enforce* / domain atl atlExpression : RealExp { |
| realSymbol = symbol |
| }; |
| enforce domain qvtr qvtrExpression : RealLiteralExp { |
| realSymbol = symbol, |
| type = pivotMM::Real |
| }; |
| } */ |
| |
| /** |
| * atl::StringExp <=> ocl::StringLiteralExp |
| */ |
| top relation mapStringExp overrides mapOclExpression { |
| symbol : String; |
| enforce domain atl atlExpression : StringExp { |
| stringSymbol = symbol |
| }; |
| enforce domain qvtr qvtrExpression : StringLiteralExp { |
| stringSymbol = symbol, |
| type = pivotMM::String |
| }; |
| } |
| |
| /** |
| * atl::VariableDeclaration <=> ocl::VariableDeclaration |
| */ |
| relation mapVariable { |
| enforce domain atl atlVariable : LocatedElement {}; |
| enforce domain qvtr qvtrVariable : VariableDeclaration {}; |
| } |
| |
| /** |
| * atl::VariableExp <=> ocl::VariableExp |
| */ |
| top relation mapVariableExp overrides mapOclExpression { |
| varName : String; |
| enforce domain atl atlExpression : VariableExp { |
| referredVariable = atlVariable : VariableDeclaration{ |
| varName = varName |
| } |
| }; |
| enforce domain qvtr qvtrExpression : VariableExp { |
| name = varName |
| -- type = getType(atlExpression.referredVariable) |
| }; |
| where { |
| mapVariableExp_referredVariable(atlExpression, qvtrExpression); |
| } |
| } |
| |
| /** |
| * atl::VariableExp referredVariable <=> ocl::VariableExp referredVariable |
| */ |
| abstract relation mapVariableExp_referredVariable { |
| enforce domain atl atlExpression : VariableExp {}; |
| enforce domain qvtr qvtrExpression : VariableExp {}; |
| } |
| relation mapVariableExp_referredVariable_Helper overrides mapVariableExp_referredVariable { |
| atlHelper : atlMM::Helper; |
| enforce domain atl atlExpression : VariableExp { |
| referredVariable = atlVariable : VariableDeclaration{ |
| varName = 'self' |
| } |
| } {atlHelper = getHelper(atlExpression)}; |
| enforce domain qvtr qvtrExpression : VariableExp { |
| referredVariable = qvtrVariable : VariableDeclaration{}, |
| type = qvtrVariable.type, -- getType(atlHelper.definition.context_.context_), |
| name = 'self' |
| }; |
| when { |
| mapVariable(atlHelper, qvtrVariable); |
| } |
| } |
| relation mapVariableExp_referredVariable_VariableDeclaration overrides mapVariableExp_referredVariable { |
| enforce domain atl atlExpression : VariableExp { |
| referredVariable = atlVariable : PatternElement{} |
| }; |
| enforce domain qvtr qvtrExpression : VariableExp { |
| referredVariable = qvtrVariable : VariableDeclaration{}, |
| type = qvtrVariable.type, |
| name = qvtrVariable.name -- debug/readability aid |
| }; |
| when { |
| mapVariable(atlVariable, qvtrVariable); |
| } |
| } |
| } |
| |
| -- ActionBlock, BindingStat, ExpressionStat, IfStat, ForStat |
| -- CalledRule |
| -- DropPattern |
| -- ForEachOutPatternElement |
| -- LazyMatchedRule |
| -- Library, LibraryRef |
| -- Query |
| -- RuleVariableDeclaration |
| |
| -- BagExp, OrderedSetExp, SequenceExp, SetExp |
| -- BagType, OrderedSetType, SequenceType, SetType |
| -- BooleanType, IntegerType, ReakType, StringType |
| -- CollectionType |
| -- EnumLiteralExp |
| -- IterateExp, IteratorElement |
| -- Iterator |
| -- LetExp |
| -- MapExp, MapElement |
| -- MapType |
| -- OclAnyType |
| -- OclContextDefinition |
| -- OclFeatureDefinition |
| -- OclModelElement |
| -- OclType |
| -- OclUndefinedExp |
| -- Parameter |
| -- RealExp |
| -- SuperExp |
| -- TupleExp, TuplePart |
| -- TupleType, TupleTypeAttribute |
| } |