import  qvtocs : '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.xtext.base/model/BaseCS2AS.ocl'
import '/resource/org.eclipse.qvto.examples.pivot.qvtoperational/model/QVTOperationalCS2ASHelpers.ocl' -- Moved to the AS project
import '/resource/org.eclipse.qvto.examples.pivot.qvtoperational/model/QVTOperationalCS2ASLookup.ocl'  -- Moved to the AS project
import 'QVTOperationalCS2ASDisambiguation.ocl'
package qvtocs

/*context TopLevelCS
def : ast() : ocl::Model =
	ocl::Model {
		ownedPackages = let dummyPackage  = ocl::Package{
					-- Part temporarily addded by hand
					name = '',
					ownedClasses = ownedTypes.ast().oclAsType(ocl::Class) -- FIXME
				}
		in dummyPackage->includingAll(ownedPackages.ast())
	}
context QVToClassCS
def : ast() : ocl::Class =
	ocl::Class {
		name = name, 
	ownedProperties = ownedProperties.ast().oclAsType(ocl::Property), 
	ownedOperations = ownedOperations.ast() 
	}
context MetamodelCS
def : ast() : ocl::Package =
	ocl::Package {
		name = name, 
	nsPrefix = name, 
	URI = name, 
	ownedClasses = ownedClasses.ast() 
	}
context ModelTypeCS
def : ast() : qvto::ModelType =
	qvto::ModelType {
		name = name 
	}
context ClassifierPropertyCS
def : ast() : ocl::Property =
	ocl::Property {
		name = name, 
	isComposite = qualifiers->exists(x | x =  'composite') 
	}
context MappingOperationCS
def : ast() : qvto::MappingOperation =
	qvto::MappingOperation {
		name = name, 
	ownedParameters = ownedParameters.ast() 
	}
context TransformationCS
def : ast() : qvto::OperationalTransformation =
	qvto::OperationalTransformation {
		name = name, 
	modelParameter = ownedParameters.ast().oclAsType(qvto::ModelParameter), 
	ownedOperations = ownedOperations.ast(), 
	isBlackbox = ownedQualifiers->exists(x | x = QualifierKindCS::blackbox), 
	isAbstract = ownedQualifiers->exists(x | x = QualifierKindCS::abstract) 
	}
context ParameterDeclarationCS
def : ast() : qvto::VarParameter =
	if containedInModule()
	then qvto::ModelParameter {
		name = name, 
	type = ast().lookupModelType(self.ownedType.oclAsType(TypedTypeRef2CS).ownedPathName) 
	}
	else
		if notContainedInModule()
		then qvto::VarParameter {
			name = name 
		}
		else
			invalid
		endif
	endif
context QVToLibraryCS
def : ast() : qvto::Library =
	qvto::Library {
		name = name, 
	ownedOperations = ownedOperations.ast(), 
	usedModelType = ownedParameters->collect(x | ast().lookupModelType(x.ownedType.oclAsType(TypedTypeRef2CS).ownedPathName)), 
	isBlackbox = ownedQualifiers->exists(x | x = QualifierKindCS::blackbox) 
	} */
endpackage
