blob: 30a41ac80354826440412e228035d25944a8cf67 [file] [log] [blame]
import cs : 'generated/MiniOCLCS.ecore#/'
import as : '/resource/org.eclipse.qvtd.doc.miniocl/model/MiniOCL.ecore#/'
import '/resource/org.eclipse.qvtd.doc.miniocl/model/Lookup.ecore'
import 'MiniOCLCS2ASHelpers.ocl'
package ocl
-- Domain specific default functionality
context OclElement
def : unqualified_env_Class() : lookup::LookupEnvironment[1] =
_unqualified_env_Class(null)
def : unqualified_env_Package() : lookup::LookupEnvironment[1] =
_unqualified_env_Package(null)
def : unqualified_env_Operation() : lookup::LookupEnvironment[1] =
_unqualified_env_Operation(null)
def : unqualified_env_Variable() : lookup::LookupEnvironment[1] =
_unqualified_env_Variable(null)
def : unqualified_env_NamedElement() : lookup::LookupEnvironment[1] =
_unqualified_env_NamedElement(null)
def : unqualified_env_Property() : lookup::LookupEnvironment[1] =
_unqualified_env_Property(null)
def : _unqualified_env_Class(child : OclElement) : lookup::LookupEnvironment[1] =
parentEnv_Class()
def : _unqualified_env_Package(child : OclElement) : lookup::LookupEnvironment[1] =
parentEnv_Package()
def : _unqualified_env_Operation(child : OclElement) : lookup::LookupEnvironment[1] =
parentEnv_Operation()
def : _unqualified_env_Variable(child : OclElement) : lookup::LookupEnvironment[1] =
parentEnv_Variable()
def : _unqualified_env_NamedElement(child : OclElement) : lookup::LookupEnvironment[1] =
parentEnv_NamedElement()
def : _unqualified_env_Property(child : OclElement) : lookup::LookupEnvironment[1] =
parentEnv_Property()
def : parentEnv_Class() : lookup::LookupEnvironment[1] =
let parent = oclContainer() in if parent = null then lookup::LookupEnvironment { } else parent._unqualified_env_Class(self) endif
def : parentEnv_Package() : lookup::LookupEnvironment[1] =
let parent = oclContainer() in if parent = null then lookup::LookupEnvironment { } else parent._unqualified_env_Package(self) endif
def : parentEnv_Operation() : lookup::LookupEnvironment[1] =
let parent = oclContainer() in if parent = null then lookup::LookupEnvironment { } else parent._unqualified_env_Operation(self) endif
def : parentEnv_Variable() : lookup::LookupEnvironment[1] =
let parent = oclContainer() in if parent = null then lookup::LookupEnvironment { } else parent._unqualified_env_Variable(self) endif
def : parentEnv_NamedElement() : lookup::LookupEnvironment[1] =
let parent = oclContainer() in if parent = null then lookup::LookupEnvironment { } else parent._unqualified_env_NamedElement(self) endif
def : parentEnv_Property() : lookup::LookupEnvironment[1] =
let parent = oclContainer() in if parent = null then lookup::LookupEnvironment { } else parent._unqualified_env_Property(self) endif
def : _exported_env_Property(importer : OclElement) : lookup::LookupEnvironment[1] =
lookup::LookupEnvironment { }
def : _exported_env_Package(importer : OclElement) : lookup::LookupEnvironment[1] =
lookup::LookupEnvironment { }
def : _exported_env_Operation(importer : OclElement) : lookup::LookupEnvironment[1] =
lookup::LookupEnvironment { }
def : _qualified_env_Class(qualifier : OclElement) : lookup::LookupEnvironment[1] =
lookup::LookupEnvironment { }
def : _qualified_env_Package(qualifier : OclElement) : lookup::LookupEnvironment[1] =
lookup::LookupEnvironment { }
def : _qualified_env_Operation(qualifier : OclElement) : lookup::LookupEnvironment[1] =
lookup::LookupEnvironment { }
def : _qualified_env_Property(qualifier : OclElement) : lookup::LookupEnvironment[1] =
lookup::LookupEnvironment { }
-- End of domain specific default functionality
endpackage
package lookup
-- Some common lookup functionality
context LookupEnvironment
def : nestedEnv() : LookupEnvironment[1] =
LookupEnvironment {
parentEnv = self
}
-- End of common lookup functionality
endpackage
package as
context Visitable
-- NamedElement unqualified lookup
def : _lookupNamedElement(env : lookup::LookupEnvironment, nName : String) : OrderedSet(NamedElement) =
let foundNamedElement = env.namedElements->selectByKind(NamedElement)->select(name = nName)
in if foundNamedElement->isEmpty() and not (env.parentEnv = null)
then _lookupNamedElement(env.parentEnv, nName)
else foundNamedElement
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 : _lookupUnqualifiedNamedElement(nName : String) : NamedElement[?] =
let foundNamedElement = _lookupNamedElement(unqualified_env_NamedElement(), nName)
in if foundNamedElement->isEmpty()
then null
else foundNamedElement->first() -- LookupVisitor will report ambiguous result
endif
def : lookupNamedElement(nName : String) : NamedElement[?] =
_lookupUnqualifiedNamedElement(nName)
def : lookupNamedElement(aPathElementCS : cs::PathElementCS) : NamedElement[?] =
_lookupUnqualifiedNamedElement(aPathElementCS.elementName)
-- End of NamedElement unqualified lookup
context Package
def : _lookupQualifiedPackage(pName : String) : Package[?] =
let foundPackage = _lookupPackage(_qualified_env_Package(), pName)
in if foundPackage->isEmpty()
then null
else foundPackage->first()
endif
def : _qualified_env_Package() : lookup::LookupEnvironment =
let env = lookup::LookupEnvironment{}
in env
.addElements(ownedPackages)
def : lookupQualifiedPackage(aPathElementCS : cs::PathElementCS) : Package[?] =
_lookupQualifiedPackage(aPathElementCS.elementName)
def : _lookupQualifiedClass(cName : String) : Class[?] =
let foundClass = _lookupClass(_qualified_env_Class(), cName)
in if foundClass->isEmpty()
then null
else foundClass->first()
endif
def : _qualified_env_Class() : lookup::LookupEnvironment =
let env = lookup::LookupEnvironment{}
in env
.addElements(ownedClasses)
def : lookupQualifiedClass(aPathElementCS : cs::PathElementCS) : Class[?] =
_lookupQualifiedClass(aPathElementCS.elementName)
context Visitable
-- Package unqualified lookup
def : _lookupPackage(env : lookup::LookupEnvironment, pName : String) : OrderedSet(Package) =
let foundPackage = env.namedElements->selectByKind(Package)->select(name = pName)
in if foundPackage->isEmpty() and not (env.parentEnv = null)
then _lookupPackage(env.parentEnv, pName)
else foundPackage
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 : _lookupUnqualifiedPackage(pName : String) : Package[?] =
let foundPackage = _lookupPackage(unqualified_env_Package(), pName)
in if foundPackage->isEmpty()
then null
else foundPackage->first() -- LookupVisitor will report ambiguous result
endif
def : lookupPackage(pName : String) : Package[?] =
_lookupUnqualifiedPackage(pName)
def : lookupPackage(aPathElementCS : cs::PathElementCS) : Package[?] =
_lookupUnqualifiedPackage(aPathElementCS.elementName)
-- End of Package unqualified lookup
-- Package qualified-name lookup
def : lookupPackage(aPathNameCS : cs::PathNameCS) : Package[?] =
lookupPackage(aPathNameCS .pathElements)
def : lookupPackage(segments : OrderedSet(cs::PathElementCS)) : Package[?] =
if segments->size() = 1
then lookupPackage(segments->first())
else let qualifierSegments = segments->subOrderedSet(1,segments->size()-1),
qualifier = lookupPackage(qualifierSegments)
in qualifier?.lookupQualifiedPackage(segments->last())
endif
context Class
def : _lookupQualifiedOperation(oName : String, args : OrderedSet(OCLExpression)) : Operation[?] =
let foundOperation = _lookupOperation(_qualified_env_Operation(), oName, args)
in if foundOperation->isEmpty()
then null
else foundOperation->first()
endif
def : _qualified_env_Operation() : lookup::LookupEnvironment =
let env = lookup::LookupEnvironment{}
in env
.addElements(ownedOperations)
def : lookupQualifiedOperation(aPathElementCS : cs::PathElementCS, args : OrderedSet(OCLExpression)) : Operation[?] =
_lookupQualifiedOperation(aPathElementCS.elementName, args)
def : _lookupQualifiedProperty(pName : String) : Property[?] =
let foundProperty = _lookupProperty(_qualified_env_Property(), pName)
in if foundProperty->isEmpty()
then null
else foundProperty->first()
endif
def : _qualified_env_Property() : lookup::LookupEnvironment =
let env = lookup::LookupEnvironment{}
in env
.addElements(ownedProperties)
def : lookupQualifiedProperty(aPathElementCS : cs::PathElementCS) : Property[?] =
_lookupQualifiedProperty(aPathElementCS.elementName)
context Visitable
-- Class unqualified lookup
def : _lookupClass(env : lookup::LookupEnvironment, cName : String) : OrderedSet(Class) =
let foundClass = env.namedElements->selectByKind(Class)->select(name = cName)
in if foundClass->isEmpty() and not (env.parentEnv = null)
then _lookupClass(env.parentEnv, cName)
else foundClass
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 : _lookupUnqualifiedClass(cName : String) : Class[?] =
let foundClass = _lookupClass(unqualified_env_Class(), cName)
in if foundClass->isEmpty()
then null
else foundClass->first() -- LookupVisitor will report ambiguous result
endif
def : lookupClass(cName : String) : Class[?] =
_lookupUnqualifiedClass(cName)
def : lookupClass(aPathElementCS : cs::PathElementCS) : Class[?] =
_lookupUnqualifiedClass(aPathElementCS.elementName)
-- End of Class unqualified lookup
-- Class qualified-name lookup
def : lookupClass(aPathNameCS : cs::PathNameCS) : Class[?] =
lookupClass(aPathNameCS .pathElements)
def : lookupClass(segments : OrderedSet(cs::PathElementCS)) : Class[?] =
if segments->size() = 1
then lookupClass(segments->first())
else let qualifierSegments = segments->subOrderedSet(1,segments->size()-1),
qualifier = lookupPackage(qualifierSegments)
in qualifier?.lookupQualifiedClass(segments->last())
endif
context Operation
def : _appliesFilter_Operation(args : OrderedSet(OCLExpression)) : Boolean =
args->size() = ownedParameters->size()
context Visitable
-- Operation unqualified lookup
def : _lookupOperation(env : lookup::LookupEnvironment, oName : String, args : OrderedSet(OCLExpression)) : OrderedSet(Operation) =
let foundOperation = env.namedElements->selectByKind(Operation)->select(name = oName)
->select(_appliesFilter_Operation(args))
in if foundOperation->isEmpty() and not (env.parentEnv = null)
then _lookupOperation(env.parentEnv, oName, args)
else foundOperation
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 : _lookupUnqualifiedOperation(oName : String, args : OrderedSet(OCLExpression)) : Operation[?] =
let foundOperation = _lookupOperation(unqualified_env_Operation(), oName, args)
in if foundOperation->isEmpty()
then null
else foundOperation->first() -- LookupVisitor will report ambiguous result
endif
def : lookupOperation(oName : String, args : OrderedSet(OCLExpression)) : Operation[?] =
_lookupUnqualifiedOperation(oName, args)
def : lookupOperation(aPathElementCS : cs::PathElementCS, args : OrderedSet(OCLExpression)) : Operation[?] =
_lookupUnqualifiedOperation(aPathElementCS.elementName, args)
-- End of Operation unqualified lookup
-- Operation qualified-name lookup
def : lookupOperation(aPathNameCS : cs::PathNameCS, args : OrderedSet(OCLExpression)) : Operation[?] =
lookupOperation(aPathNameCS .pathElements, args)
def : lookupOperation(segments : OrderedSet(cs::PathElementCS), args : OrderedSet(OCLExpression)) : Operation[?] =
if segments->size() = 1
then lookupOperation(segments->first(), args)
else let qualifierSegments = segments->subOrderedSet(1,segments->size()-1),
qualifier = lookupClass(qualifierSegments)
in qualifier?.lookupQualifiedOperation(segments->last(), args)
endif
context Visitable
-- Property unqualified lookup
def : _lookupProperty(env : lookup::LookupEnvironment, pName : String) : OrderedSet(Property) =
let foundProperty = env.namedElements->selectByKind(Property)->select(name = pName)
in if foundProperty->isEmpty() and not (env.parentEnv = null)
then _lookupProperty(env.parentEnv, pName)
else foundProperty
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 : _lookupUnqualifiedProperty(pName : String) : Property[?] =
let foundProperty = _lookupProperty(unqualified_env_Property(), pName)
in if foundProperty->isEmpty()
then null
else foundProperty->first() -- LookupVisitor will report ambiguous result
endif
def : lookupProperty(pName : String) : Property[?] =
_lookupUnqualifiedProperty(pName)
def : lookupProperty(aPathElementCS : cs::PathElementCS) : Property[?] =
_lookupUnqualifiedProperty(aPathElementCS.elementName)
-- End of Property unqualified lookup
-- Property qualified-name lookup
def : lookupProperty(aPathNameCS : cs::PathNameCS) : Property[?] =
lookupProperty(aPathNameCS .pathElements)
def : lookupProperty(segments : OrderedSet(cs::PathElementCS)) : Property[?] =
if segments->size() = 1
then lookupProperty(segments->first())
else let qualifierSegments = segments->subOrderedSet(1,segments->size()-1),
qualifier = lookupClass(qualifierSegments)
in qualifier?.lookupQualifiedProperty(segments->last())
endif
context Visitable
-- Variable unqualified lookup
def : _lookupVariable(env : lookup::LookupEnvironment, vName : String) : OrderedSet(Variable) =
let foundVariable = env.namedElements->selectByKind(Variable)->select(name = vName)
in if foundVariable->isEmpty() and not (env.parentEnv = null)
then _lookupVariable(env.parentEnv, vName)
else foundVariable
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 : _lookupUnqualifiedVariable(vName : String) : Variable[?] =
let foundVariable = _lookupVariable(unqualified_env_Variable(), vName)
in if foundVariable->isEmpty()
then null
else foundVariable->first() -- LookupVisitor will report ambiguous result
endif
def : lookupVariable(vName : String) : Variable[?] =
_lookupUnqualifiedVariable(vName)
def : lookupVariable(aPathElementCS : cs::PathElementCS) : Variable[?] =
_lookupUnqualifiedVariable(aPathElementCS.elementName)
-- End of Variable unqualified lookup
context Root
def : _unqualified_env_Package(child : ocl::OclElement) : lookup::LookupEnvironment =
parentEnv_Package()
.addElements(ownedPackages)
def : _exported_env_Package(importer : ocl::OclElement) : lookup::LookupEnvironment =
let env = lookup::LookupEnvironment {}
in env
.addElements(ownedPackages)
def : _lookupExportedPackage(importer : ocl::OclElement, pName : String) : Package[?] =
let foundPackage = _lookupPackage(_exported_env_Package(importer), pName)
in if foundPackage->isEmpty()
then null
else foundPackage->first()
endif
def : lookupExportedPackage(importer : ocl::OclElement, aPathElementCS : cs::PathElementCS) : Package[?] =
_lookupExportedPackage(importer, aPathElementCS.elementName)
context Visitable
-- Root exports Package
def : lookupPackageFrom(exporter : Root, aPathElementCS : cs::PathElementCS) : Package[?] =
exporter.lookupExportedPackage(self, aPathElementCS)
def : lookupPackageFrom(exporter : Root, aPathNameCS : cs::PathNameCS) : Package[?] =
lookupPackageFrom(exporter, aPathNameCS.pathElements)
def : lookupPackageFrom(exporter : Root, segments : OrderedSet(cs::PathElementCS)) : Package[?] =
if segments->size() = 1
then lookupPackageFrom(exporter, segments->first())
else let qualifierSegments = segments->subOrderedSet(1,segments->size()-1),
qualifier = lookupPackage(qualifierSegments)
in qualifier?.lookupQualifiedPackage(segments->last())
endif
context Package
def : _unqualified_env_Package(child : ocl::OclElement) : lookup::LookupEnvironment =
parentEnv_Package().nestedEnv()
.addElements(ownedPackages)
def : _unqualified_env_Class(child : ocl::OclElement) : lookup::LookupEnvironment =
parentEnv_Class().nestedEnv()
.addElements(ownedClasses)
context Class
def : _unqualified_env_Operation(child : ocl::OclElement) : lookup::LookupEnvironment =
let superClasses = self->closure(superClasses)
in
parentEnv_Operation().nestedEnv()
.addElements(superClasses.ownedOperations)
.nestedEnv()
.addElements(ownedOperations)
def : _unqualified_env_Property(child : ocl::OclElement) : lookup::LookupEnvironment =
let superClasses = self->closure(superClasses)
in
parentEnv_Property().nestedEnv()
.addElements(superClasses.ownedProperties)
.nestedEnv()
.addElements(ownedProperties)
def : _exported_env_Operation(importer : ocl::OclElement) : lookup::LookupEnvironment =
let superClasses = self->closure(superClasses)
in
let env = lookup::LookupEnvironment {}
in env
.addElements(ownedOperations)
def : _exported_env_Property(importer : ocl::OclElement) : lookup::LookupEnvironment =
let superClasses = self->closure(superClasses)
in
let env = lookup::LookupEnvironment {}
in env
.addElements(ownedProperties)
def : _lookupExportedOperation(importer : ocl::OclElement, oName : String, args : OrderedSet(OCLExpression)) : Operation[?] =
let foundOperation = _lookupOperation(_exported_env_Operation(importer), oName, args)
in if foundOperation->isEmpty()
then null
else foundOperation->first()
endif
def : lookupExportedOperation(importer : ocl::OclElement, aPathElementCS : cs::PathElementCS, args : OrderedSet(OCLExpression)) : Operation[?] =
_lookupExportedOperation(importer, aPathElementCS.elementName, args)
def : _lookupExportedProperty(importer : ocl::OclElement, pName : String) : Property[?] =
let foundProperty = _lookupProperty(_exported_env_Property(importer), pName)
in if foundProperty->isEmpty()
then null
else foundProperty->first()
endif
def : lookupExportedProperty(importer : ocl::OclElement, aPathElementCS : cs::PathElementCS) : Property[?] =
_lookupExportedProperty(importer, aPathElementCS.elementName)
context Visitable
-- Class exports Operation
def : lookupOperationFrom(exporter : Class, aPathElementCS : cs::PathElementCS, args : OrderedSet(OCLExpression)) : Operation[?] =
exporter.lookupExportedOperation(self, aPathElementCS, args)
def : lookupOperationFrom(exporter : Class, aPathNameCS : cs::PathNameCS, args : OrderedSet(OCLExpression)) : Operation[?] =
lookupOperationFrom(exporter, aPathNameCS.pathElements, args)
def : lookupOperationFrom(exporter : Class, segments : OrderedSet(cs::PathElementCS), args : OrderedSet(OCLExpression)) : Operation[?] =
if segments->size() = 1
then lookupOperationFrom(exporter, segments->first(), args)
else let qualifierSegments = segments->subOrderedSet(1,segments->size()-1),
qualifier = lookupClass(qualifierSegments)
in qualifier?.lookupQualifiedOperation(segments->last(), args)
endif
-- Class exports Property
def : lookupPropertyFrom(exporter : Class, aPathElementCS : cs::PathElementCS) : Property[?] =
exporter.lookupExportedProperty(self, aPathElementCS)
def : lookupPropertyFrom(exporter : Class, aPathNameCS : cs::PathNameCS) : Property[?] =
lookupPropertyFrom(exporter, aPathNameCS.pathElements)
def : lookupPropertyFrom(exporter : Class, segments : OrderedSet(cs::PathElementCS)) : Property[?] =
if segments->size() = 1
then lookupPropertyFrom(exporter, segments->first())
else let qualifierSegments = segments->subOrderedSet(1,segments->size()-1),
qualifier = lookupClass(qualifierSegments)
in qualifier?.lookupQualifiedProperty(segments->last())
endif
context Operation
def : _unqualified_env_Variable(child : ocl::OclElement) : lookup::LookupEnvironment =
parentEnv_Variable().nestedEnv()
.addElements(ownedParameters)
context ExpressionInOCL
def : _unqualified_env_Variable(child : ocl::OclElement) : lookup::LookupEnvironment =
parentEnv_Variable().nestedEnv()
.addElements(ownedSelfVar)
endpackage