| modeltype ECORE "strict" uses ecore('http://www.eclipse.org/emf/2002/Ecore'); |
| |
| library VisitorPatternLibrary; |
| |
| helper EPackage::findClass(in visitorName : String, in visitorQualifiedName : String) : EClass |
| { |
| return self ->closure(self.eSubpackages) |
| ->including(self) |
| ->collectOne( |
| self.eClassifiers![name = visitorName |
| and oclIsKindOf(EClass) |
| and oclAsType(EClass).instanceClassName = visitorQualifiedName].oclAsType(EClass)); |
| } |
| |
| helper createAcceptMethod(in visitorClass : EClass) : EOperation { |
| |
| return object EOperation { |
| name := 'accept'; |
| var typeParameter = object ETypeParameter { |
| name := visitorClass.eTypeParameters->first().name; |
| }; |
| eTypeParameters += typeParameter; |
| eGenericType := object EGenericType { |
| eTypeParameter := typeParameter; |
| }; |
| |
| eParameters += object EParameter { |
| name := "v"; |
| eGenericType := object EGenericType { |
| eClassifier := visitorClass; // Derived Visitor Class ? |
| eTypeArguments := object EGenericType { |
| eTypeParameter := typeParameter; |
| } |
| } |
| } |
| }; |
| } |
| |
| helper createGenModelAnnotation(in annotationValue :String) : EAnnotation { |
| |
| return object EAnnotation { |
| source := "http://www.eclipse.org/emf/2002/GenModel"; |
| details += object EStringToStringMapEntry { |
| key := "body"; |
| value := annotationValue; |
| } |
| }; |
| } |