blob: d83dd8cfd0b54b76050578c51765bd5c4fba5d6a [file] [log] [blame]
import 'Lookup.ecore'
import 'Pivot.ecore'
package pivot
context OclElement
def: parentEnv() : lookup::LookupEnvironment =
let parent = oclContainer() in if parent = null then lookup::LookupEnvironment { } else parent._env(self) endif
def : env() : lookup::LookupEnvironment =
_env(null)
def : _env(child : OclElement) : lookup::LookupEnvironment =
parentEnv()
def : _exported_env(importer : OclElement) : lookup::LookupEnvironment =
lookup::LookupEnvironment { }
def : lookupVariables(vName : String) : OrderedSet(Variable) =
self._env(null).namedElements->selectByKind(Variable)->select(name = vName)
def : lookupVariable(vName : String) : Variable =
null -- TODO
endpackage
package lookup
context LookupEnvironment
def : nestedEnv() : LookupEnvironment =
LookupEnvironment {
parentEnv = self
}
-- Workaround. Despite having 'addElements' as LookupEnvironment EOperations, This is added because the addElements
-- EOperation only accepts OrderedSet arguments, producing an error in this description when passing properties which
-- are not *Unique and Ordered*, which required an ->asOrderedSet() invocation
-- FIXME F1 for the time being, this is commented out because we still need to introduce the ->asOrderdSet() to
-- generate free of error code
--def : addElements(element : Collection(ocl::NamedElement)) : LookupEnvironment =
-- let newEnv = element._env(null)
-- in LookupEnvironment {
-- namedElements = self.namedElements->including(newEnv.namedElements)
-- }
def : addElementsOf(element : ocl::OclElement) : LookupEnvironment =
let newEnv = element._env(null)
in LookupEnvironment {
namedElements = self.namedElements->including(newEnv.namedElements)
}
def : addElementsOf(elements : Collection(ocl::OclElement)) : LookupEnvironment =
elements->iterate(element ; acc : LookupEnvironment = self
| acc.addElementsOf(element))
endpackage
package pivot
context Class
def : _env(child : Element) : lookup::LookupEnvironment =
let superClasses : Set(Class) = self->closure(superClasses) in
parentEnv().nestedEnv()
-- .addElements(self.ownedTemplateSignature.ownedParameter.parameteredElement->selectByKind(Type)) FIXME badOclOperation ???
.addElements(superClasses.ownedProperties->select(not isStatic))
.addElements(superClasses.ownedOperations->select(not isStatic))
.addElements(superClasses.ownedBehaviors)
context DataType
def : _env(child : Element) : lookup::LookupEnvironment =
let superClasses : Set(Class) = self->closure(c : Class | c.superClasses) in
parentEnv().nestedEnv()
.addElements(superClasses.ownedProperties->select(not isStatic))
.addElements(superClasses.ownedOperations->select(not isStatic))
-- .addElements(self.ownedTemplateSignature.ownedParameter.parameteredElement->selectByKind(Type)) FIXME badOclOperation ???
context Element
def: _env(child : Element) : lookup::LookupEnvironment =
parentEnv()
context Enumeration
def : _env(child : Element) : lookup::LookupEnvironment =
parentEnv().nestedEnv()
-- .addElements(self.ownedTemplateSignature.ownedParameter.parameteredElement->selectByKind(Type)) FIXME badOclOperation ???
.addElements(self.ownedLiterals)
.addElements(self.ownedProperties->select(not isStatic))
.addElements(self.ownedOperations->select(not isStatic))
.addElements(self.ownedBehaviors)
context ExpressionInOCL
def : _env(child : Element) : lookup::LookupEnvironment =
parentEnv().nestedEnv()
.addElement(self.ownedContext)
.addElements(self.ownedParameters)
.addElement(self.ownedResult)
context IterateExp
def : _env(child : Element) : lookup::LookupEnvironment =
if child = ownedResult
then parentEnv().nestedEnv().addElements(self.ownedIterators)
else let index = ownedIterators->indexOf(child) in
if index > 1
then parentEnv().nestedEnv().addElements(self.ownedIterators->subOrderedSet(1, index-1))
else parentEnv().nestedEnv().addElements(self.ownedIterators).addElement(ownedResult)
endif
endif
context IteratorExp
def : _env(child : Element) : lookup::LookupEnvironment =
let index = ownedIterators->indexOf(child) in
if index > 1
then parentEnv().nestedEnv().addElements(self.ownedIterators->subOrderedSet(1, index-1))
else parentEnv().nestedEnv().addElements(self.ownedIterators)
endif
context LetExp
def : _env(child : Element) : lookup::LookupEnvironment =
if child = ownedIn
then parentEnv().nestedEnv().addElement(self.ownedVariable)
else parentEnv()
endif
context Library
def : _env(child : Element) : lookup::LookupEnvironment =
parentEnv().nestedEnv()
.addElements(self.ownedPackages)
.addElements(self.ownedClasses)
.addElements(self.ownedPrecedences)
context Operation
def : _env(child : Element) : lookup::LookupEnvironment =
if ownedParameters->includes(child)
then parentEnv().nestedEnv()
-- .addElements(self.ownedTemplateSignature.ownedParameter.parameteredElement->selectByKind(Type)) FIXME badOclOperation ???
else parentEnv().nestedEnv()
.addElements(self.ownedParameters)
-- .addElements(self.ownedTemplateSignature.ownedParameter.parameteredElement->selectByKind(Type)) FIXME badOclOperation ???
endif
context Package
def : _env(child : Element) : lookup::LookupEnvironment =
parentEnv().nestedEnv()
.addElements(self.ownedPackages)
.addElements(self.ownedClasses)
context Model
def : _env(child : Element) : lookup::LookupEnvironment =
parentEnv()
.addElements(self.ownedImports)
.addElements(self.ownedPackages)
endpackage