blob: 251a712b8df9e32e9cddd9215fb42f180bd7a8d0 [file] [log] [blame]
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