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
