blob: 3b456acdecd642123d6740a3214eebbd1802683c [file] [log] [blame]
import cs : 'ClassesCS.ecore#/'
import as : 'Classes.ecore#/'
import 'EnvExample2.ecore'
package ocl
context OclElement
-- Domain specific default functionality
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_Class(child : OclElement) : lookup::LookupEnvironment[1] =
parentEnv_Class()
def : _unqualified_env_Package(child : OclElement) : lookup::LookupEnvironment[1] =
parentEnv_Package()
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 : _qualified_env_Class(qualifier : OclElement) : lookup::LookupEnvironment[1] =
lookup::LookupEnvironment { }
def : _qualified_env_Package(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 Root
def : _unqualified_env_Package(child : ocl::OclElement) : lookup::LookupEnvironment =
parentEnv_Package().nestedEnv()
.addElements(ownedPackages)
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.name)
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.name)
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 Visitable
-- Package 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(aPathElementCS : cs::PathElementCS) : Package[?] =
_lookupUnqualifiedPackage(aPathElementCS.name)
-- QN Package lookup
def : lookupPackage(aPathNameCS : cs::PathNameCS) : Package[?] =
lookupPackage(aPathNameCS .path)
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
-- Class 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(aPathElementCS : cs::PathElementCS) : Class[?] =
_lookupUnqualifiedClass(aPathElementCS.name)
-- QN Class lookup
def : lookupClass(aPathNameCS : cs::PathNameCS) : Class[?] =
lookupClass(aPathNameCS .path)
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
endpackage