import '/resource/org.eclipse.ocl.pivot/model/Lookup.ecore'
import '/resource/org.eclipse.ocl.pivot/model/Pivot.ecore'
import '/resource/org.eclipse.ocl.pivot/model/PivotLookup.ocl'
import '/resource/org.eclipse.qvto.examples.pivot.imperativeocl/model/ImperativeOCL.ecore'
import '/resource/org.eclipse.qvto.examples.xtext.qvtoperational/model/QVTOperationalCS.ecore'
import 'QVTOperational.ecore'

package pivot

-- Lookup operations

context Visitable

def : _lookupModelType(env : lookup::LookupEnvironment, path : qvtoperationalcs::PathElement2CS, local : Boolean) : qvtoperational::ModelType[?] =
	let foundElements = env.namedElements->selectByKind(qvtoperational::ModelType)->select(name = path.name) 
	in  if foundElements->isEmpty() and not (env.parentEnv = null) and not local 
		then _lookupModelType(env.parentEnv, path, local)
		else foundElements->any(true)
		endif
		
def : _lookupModelType(path : qvtoperationalcs::PathElement2CS, local : Boolean) : qvtoperational::ModelType[?] =
	let	foundElements = _lookupModelType(env(), path, local)
	in	if foundElements->isEmpty()
		then null
		else foundElements->any(true) -- LookupVisitor will report ambiguous result
		endif
		
def : lookupModelType(typedRef : qvtoperationalcs::TypedTypeRef2CS) : qvtoperational::ModelType[?] =
	let pathSeq = typedRef.ownedPathName.ownedPathElements2 -- 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(), false)
		else null
		endif
		
endpackage

package qvtoperational
		
-- Enviroment configuration operations
context Module
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv().nestedEnv()		
			.addElementsOf(self.moduleImport.module)
			.nestedEnv()			
			.addElements(self.ownedProperties)
			-- .addElements(self.ownedOperations->excluding(self.ownedOperations->any(oclIsKindOf(EntryOperation)))) -- To discuss, can entry main() operation be called ?
			.addElements(self.ownedOperations) 
			--.addElements(self.ownedClasses) No Package anymore
			--.addElements(self.ownedPackages) No Package anymore
			--.addElements(self.ownedTag)
			.addElements(self.ownedVariable)

context ModuleImport
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()	

context OperationalTransformation
def : _env(child : pivot::Element) : lookup::LookupEnvironment =

	if self.modelParameter->includes(child) then
		parentEnv().nestedEnv()
			.addElementsOf(self.moduleImport.module)
			.nestedEnv()
			.addElements(self.ownedProperties)
			-- .addElements(self.ownedOperations->excluding(self.ownedOperations->any(oclIsKindOf(EntryOperation)))) -- To discuss, can entry main() operation be called ?
			.addElements(self.ownedOperations) 
			--.addElements(self.ownedClasses) No Package anymore
			--.addElements(self.ownedPackages) No Package anymore
			--.addElements(self.ownedTag)
			.addElements(self.ownedVariable)
	else
		parentEnv().nestedEnv()
			.addElementsOf(self.moduleImport.module)
			.nestedEnv()			
			.addElements(self.ownedProperties)
			-- .addElements(self.lookup::s->excluding(self.ownedOperations->any(oclIsKindOf(EntryOperation)))) -- To discuss, can entry main() operation be called ?
			.addElements(self.ownedOperations)
			--.addElements(self.ownedClasses) No Package anymore
			--.addElements(self.ownedPackages) No Package anymore
			--.addElements(self.ownedTag)
			.addElements(self.ownedVariable)
			.addElements(self.modelParameter)
	endif



context Library
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
		parentEnv().nestedEnv()
			.addElementsOf(self.moduleImport.module)
			.nestedEnv()			
			.addElements(self.ownedProperties)
			-- .addElements(self.lookup::s->excluding(self.ownedOperations->any(oclIsKindOf(EntryOperation)))) -- To discuss, can entry main() operation be called ?
			.addElements(self.ownedOperations)
			--.addElements(self.ownedClasses) No Package anymore
			--.addElements(self.ownedPackages) No Package anymore
			--.addElements(self.ownedTag)
			.addElements(self.ownedVariable)



context ModelType
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	if self.additionalCondition->includes(child) then
		parentEnv().nestedEnv()
			.addElements(self.metamodel) -- Note this plays the role of the "import package" in OCL/QVTd 
			-- .addElement(ADD SELF VAR FROM WHERE ???? -> OMG fix)
	else
		parentEnv().nestedEnv()
			.addElements(self.metamodel)
	endif

-- Overwritten. This will be autogenerated	
context VarParameter
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()

context ImperativeOperation
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	if (self._body = child) then
		parentEnv().nestedEnv()
			.addElement(self._context)
			.addElements(self.result)
			.addElements(self.ownedParameters)
	else -- any other 
		parentEnv()
	endif

-- Overwritten. This will be autogenerated	
context EntryOperation
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()

-- Overwritten. This will be autogenerated	
context Helper
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()

-- Overwritten. This will be autogenerated	
context Constructor
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()

-- Overwritten. This will be autogenerated	
context ContextualProperty
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()

context  MappingOperation
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	if (self._body = child) then
		parentEnv().nestedEnv()
		.addElement(self._context)
		.addElements(self.result)
		.addElements(self.ownedParameters)
	else if (self.when = child) then
		parentEnv().nestedEnv()
		.addElement(self._context)
		.addElements(self.ownedParameters)
	else if (self.where = child) then
		parentEnv().nestedEnv()
		.addElement(self._context)
		.addElements(self.ownedParameters)
		.addElements(self.result)
	else
		parentEnv()
	endif endif endif
	
-- Overwritten. This will be autogenerated	
context MappingParameter
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()
	

context OperationBody
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	if self.content->includes(child) then
		parentEnv().nestedEnv()
			.addElements(self.variable)
			.addElements(self.content->select(x | self.content->indexOf(x) < self.content->indexOf(child))
									->selectByKind(imperativeocl::VariableInitExp).referredVariable)
	else
		parentEnv()
	endif

-- Overwritten. This will be autogenerated	
context ConstructorBody
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	if self.content->includes(child) then
		parentEnv().nestedEnv()
			.addElements(self.variable)
			.addElements(self.content->select(x | self.content->indexOf(x) < self.content->indexOf(child))
									->selectByKind(imperativeocl::VariableInitExp).referredVariable)
	else
		parentEnv()
	endif

context MappingBody
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	if self.content->includes(child) then
		parentEnv().nestedEnv()
			.addElements(self.variable)
			.addElements(self.content->select(x | self.content->indexOf(x) < self.content->indexOf(child))
									->selectByKind(imperativeocl::VariableInitExp).referredVariable)
	else if self.initSection->includes(child) then
		parentEnv().nestedEnv()
			.addElements(self.variable)
			.addElements(self.content->select(x | self.initSection->indexOf(x) < self.initSection->indexOf(child))
									->selectByKind(imperativeocl::VariableInitExp).referredVariable)
	else if self.endSection->includes(child) then
		parentEnv().nestedEnv()
			.addElements(self.variable)
			.addElements(self.content->select(x | self.endSection->indexOf(x) < self.endSection->indexOf(child))
									->selectByKind(imperativeocl::VariableInitExp).referredVariable)
	else									
		parentEnv()
	endif endif endif
	

-- Overwritten. This will be autogenerated	
context ImperativeCallExp
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()
	

-- Overwritten. This will be autogenerated	
context MappingCallExp
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()
	
context ResolveExp
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	if self.condition = child then
		parentEnv().nestedEnv()
			.addElement(self.target)
	else
		parentEnv()
	endif

-- Overwritten. This will be autogenerated	
context ResolveInExp
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()

-- Overwritten. This will be autogenerated	
context ObjectExp
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()

-- Overwritten. This will be autogenerated	
context DummyRelation
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()
	
-- Overwritten. This will be autogenerated		
context DummyRelationalTransformation
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()
	
-- Overwritten. This will be autogenerated	
context DummyRelationDomain
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()
	
-- Overwritten. This will be autogenerated	
context Tag
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()
	
-- Overwritten. This will be autogenerated	
context ModelParameter
def : _env(child : pivot::Element) : lookup::LookupEnvironment =
	parentEnv()
		
endpackage