| import 'BaseCS.ecore' |
| import '/resource/org.eclipse.ocl.pivot/model/Pivot.ecore' |
| |
| package basecs |
| |
| context TypedElementCS |
| def : isRequired() : Boolean = |
| let typeMultiplicity = ownedType.ownedMultiplicity |
| in |
| if typeMultiplicity = null |
| then false |
| else |
| if typeMultiplicity.getUpper() = 1 |
| then typeMultiplicity.getLower() = 1 |
| else false |
| endif |
| endif |
| |
| context TypedRefCS |
| def : isMultiple() : Boolean = |
| ownedMultiplicity.getUpper() > 1 |
| |
| def : multiplicityType(type : ocl::Type) : ocl::Type = |
| if not isMultiple() |
| then type |
| else |
| let ordered = if oclContainer().oclIsKindOf(TypedElementCS) |
| then oclContainer().oclAsType(TypedElementCS).qualifiers->includes('ordered') |
| else false |
| endif, |
| unique = if oclContainer().oclIsKindOf(TypedElementCS) |
| then oclContainer().oclAsType(TypedElementCS).qualifiers->includes('unique') |
| else false |
| endif, |
| superType = ocl::CollectionType { |
| name = 'Collection', |
| elementType = type, |
| superClasses = Set{OclAny} -- FIXME lookup |
| } |
| in |
| if unique |
| then |
| if ordered |
| then ocl::OrderedSetType { |
| name = 'OrderedSet', |
| elementType = type, |
| superClasses = Set{superType} |
| } |
| else ocl::SetType { |
| name = 'Set', |
| elementType = type, |
| superClasses = Set{superType} |
| } |
| endif |
| else |
| if ordered |
| then ocl::SequenceType { |
| name = 'Sequence', |
| elementType = type, |
| superClasses = Set{superType} |
| } |
| else ocl::BagType { |
| name = 'Bag', |
| elementType = type, |
| superClasses = Set{superType} |
| } |
| endif |
| endif |
| endif |
| |
| context TypedTypeRefCS |
| |
| def : specializeType(tBinding : ocl::TemplateBinding) : ocl::Class = |
| let type = referredType -- FIME type lookup |
| in ocl::Class { |
| name = type.name, |
| unspecializedElement = type, |
| ownedBindings = tBinding |
| } |
| |
| context WildcardTypeRefCS |
| def : wildcardType() : ocl::WildcardType = |
| ocl::WildcardType { |
| name = '?'--, |
| -- lowerBound = OclAny FIXME lookup |
| -- upperBound = OclVoid FIXME lookup |
| } |
| |
| def : wildcardTypeExtends(_extends : ocl::Class ) : ocl::WildcardType = |
| ocl::WildcardType { |
| name = '?', |
| lowerBound = _extends |
| -- upperBound = OclVoid FIXME lookup |
| } |
| def : wildcardTypeSuper(super : ocl::Class) : ocl::WildcardType = |
| ocl::WildcardType { |
| name = '?', |
| -- lowerBound = OclAny FIXME lookup |
| upperBound = super |
| } |
| endpackage |