| import qvtocs : '/resource/org.eclipse.qvto.examples.xtext.qvtoperational/model/QVTOperationalCS.ecore#/' |
| import basecs : '/resource/org.eclipse.ocl.xtext.base/model/BaseCS.ecore#/' |
| import qvto : '/resource/org.eclipse.qvto.examples.pivot.qvtoperational/model/QVTOperational.ecore#/' |
| import ocl : '/resource/org.eclipse.ocl.pivot/model/Pivot.ecore#/' |
| import '/resource/org.eclipse.ocl.pivot/model/Lookup.ecore' |
| import 'QVTOperationalCS2ASHelpers.ocl' |
| |
| package ocl |
| ---- Default Environment related functionality |
| context OclElement |
| -- |
| def : env() : lookup::LookupEnvironment[1] = |
| _env(null) |
| |
| def : _env(child : OclElement) : lookup::LookupEnvironment[1] = |
| parentEnv() |
| |
| def : _exported_env(importer : OclElement) : lookup::LookupEnvironment[1] = |
| lookup::LookupEnvironment { } |
| |
| def : parentEnv() : lookup::LookupEnvironment[1] = |
| let parent = oclContainer() in if parent = null then lookup::LookupEnvironment { } else parent._env(self) endif |
| endpackage |
| |
| package lookup |
| context LookupEnvironment |
| def : nestedEnv() : LookupEnvironment[1] = |
| LookupEnvironment { |
| parentEnv = self |
| } |
| endpackage |
| |
| package qvto |
| |
| |
| context OperationalTransformation |
| def : _env(child : ocl::OclElement) : lookup::LookupEnvironment = |
| if modelParameter->includes(child) |
| then parentEnv().nestedEnv() |
| .addElements(ownedProperties) |
| .addElements(ownedOperations) |
| .addElements(--ownedOperations->excluding(ownedOperations->any(oclIsKindOf(EntryOperation)))) -- To discuss, can entry main() operation be called ? |
| --ownedClasses No Package anymore |
| --ownedPackages No Package anymore |
| --ownedTag |
| ownedVariable) |
| else parentEnv().nestedEnv() |
| .addElements(ownedProperties) |
| .addElements(ownedOperations) |
| .addElements(--ownedOperations->excluding(ownedOperations->any(oclIsKindOf(EntryOperation)))) -- To discuss, can entry main() operation be called ? |
| --ownedClasses No Package anymore |
| --ownedPackages No Package anymore |
| --ownedTag |
| ownedVariable) |
| .addElements(modelParameter) |
| endif |
| |
| context Library |
| def : _env(child : ocl::OclElement) : lookup::LookupEnvironment = |
| parentEnv().nestedEnv() |
| .addElements(ownedProperties) |
| .addElements(ownedOperations) |
| .addElements(--ownedOperations->excluding(ownedOperations->any(oclIsKindOf(EntryOperation)))) -- To discuss, can entry main() operation be called ? |
| --ownedClasses No Package anymore |
| --ownedPackages No Package anymore |
| --ownedTag |
| ownedVariable) |
| |
| context ModelType |
| def : _env(child : ocl::OclElement) : lookup::LookupEnvironment = |
| if additionalCondition->includes(child) |
| then parentEnv().nestedEnv() |
| .addElements(metamodel) |
| else parentEnv().nestedEnv() |
| .addElements(metamodel) |
| endif |
| |
| context ImperativeOperation |
| def : _env(child : ocl::OclElement) : lookup::LookupEnvironment = |
| if _body->includes(child) |
| then parentEnv().nestedEnv() |
| .addElement(_context) |
| .addElements(result) |
| .addElements(ownedParameters) |
| else parentEnv() |
| endif |
| |
| context MappingOperation |
| def : _env(child : ocl::OclElement) : lookup::LookupEnvironment = |
| if _body->includes(child) |
| then parentEnv().nestedEnv() |
| .addElement(_context) |
| .addElements(result) |
| .addElements(ownedParameters) |
| else if _when->includes(child) |
| then parentEnv().nestedEnv() |
| .addElement(_context) |
| .addElements(ownedParameters) |
| else parentEnv() |
| endif |
| endif |
| |
| context OperationBody |
| def : _env(child : ocl::OclElement) : lookup::LookupEnvironment = |
| if content->includes(child) |
| then parentEnv().nestedEnv() |
| .addElements(variable) |
| .addElements(content->selectByKind(imperativeocl::VariableInitExp).referredVariable->select(x | self.content->indexOf(x) < self.content->indexOf(child))) |
| else parentEnv() |
| endif |
| |
| context ConstructorBody |
| def : _env(child : ocl::OclElement) : lookup::LookupEnvironment = |
| if content->includes(child) |
| then parentEnv().nestedEnv() |
| .addElements(variable) |
| .addElements(content->selectByKind(imperativeocl::VariableInitExp).referredVariable->select(x | self.content->indexOf(x) < self.content->indexOf(child))) |
| else parentEnv() |
| endif |
| |
| context MappingBody |
| def : _env(child : ocl::OclElement) : lookup::LookupEnvironment = |
| if content->includes(child) |
| then parentEnv().nestedEnv() |
| .addElements(variable) |
| .addElements(content->selectByKind(imperativeocl::VariableInitExp).referredVariable->select(x | self.content->indexOf(x) < self.content->indexOf(child))) |
| else if initSection->includes(child) |
| then parentEnv().nestedEnv() |
| .addElements(variable) |
| .addElements(initSection->selectByKind(imperativeocl::VariableInitExp).referredVariable->select(x | self.initSection->indexOf(x) < self.initSection->indexOf(child))) |
| else parentEnv() |
| endif |
| endif |
| |
| context ResolveExp |
| def : _env(child : ocl::OclElement) : lookup::LookupEnvironment = |
| if condition->includes(child) |
| then parentEnv().nestedEnv() |
| .addElement(_target) |
| else parentEnv() |
| endif |
| |
| endpackage |
| |
| package pivot |
| context Visitable |
| -- ModelType lookup |
| def : _lookupModelType(env : lookup::LookupEnvironment, mName : String) : OrderedSet(qvtoperational::ModelType) = |
| let foundModelType = env.namedElements->selectByKind(qvtoperational::ModelType)->select(name = mName) |
| in if foundModelType->isEmpty() and not (env.parentEnv = null) |
| then _lookupModelType(env.parentEnv, mName) |
| else foundModelType |
| endif |
| |
| -- Note: when calling this method, the source element of the argument passed to this method, will be the contextual |
| -- object on which error reports will be handled |
| def : _lookupModelType(mName : String) : qvtoperational::ModelType[?] = |
| let foundModelType = _lookupModelType(env(), mName) |
| in if foundModelType->isEmpty() |
| then null |
| else foundModelType->first() -- LookupVisitor will report ambiguous result |
| endif |
| |
| -- FIXME manually added |
| |
| def : lookupModelType(aPathElementCS : qvtoperationalcs::PathElement2CS) : qvtoperational::ModelType[?] = |
| _lookupModelType(aPathElementCS.name) |
| |
| |
| -- QN Package lookup |
| def : lookupModelType(aPathNameCS : qvtoperationalcs::PathName2CS) : qvtoperational::ModelType[?] = |
| lookupModelType(aPathNameCS .ownedPathElements2) |
| |
| def : lookupModelType(segments : OrderedSet(qvtoperationalcs::PathElement2CS)) : qvtoperational::ModelType[?] = |
| if segments->size() = 1 |
| then lookupModelType(segments->first()) |
| else lookupModelType(segments->last()) -- TODO what if there is more than one? |
| -- let qualifierSegments = segments->subOrderedSet(1,segments->size()-1), |
| -- qualifier = lookupPackage(qualifierSegments) |
| -- in qualifier?.lookupQualifiedModelType(segments->last()) |
| endif |
| |
| --def : lookupModelType(typedRef : qvtoperationalcs::TypedTypeRef2CS) : qvtoperational::ModelType[?] = |
| -- lookupModelTlet pathSeq = typedRef.ownedPathName -- FIXME, safe-navigation produce CollectionValues instead of Ecore_Collections |
| -- in |
| -- if pathSeq <> null |
| -- then -- TODO What if there is more than one ? |
| -- _lookupModelType(pathSeq->last().name) |
| -- else null |
| -- endif |
| |
| -- ENDOF manual add |
| |
| endpackage |