| library Parsers; |
| |
| import ValueExpressions; |
| |
| modeltype GMFMAP uses mappings('http://www.eclipse.org/gmf/2006/mappings'); |
| modeltype GMFGEN uses gmfgen('http://www.eclipse.org/gmf/2009/GenModel'); |
| modeltype ECORE uses ecore('http://www.eclipse.org/emf/2002/Ecore'); |
| modeltype GENMODEL uses genmodel('http://www.eclipse.org/emf/2002/GenModel'); |
| |
| -- |
| -- Parsers |
| -- |
| |
| mapping GMFMAP::Mapping::createGenParsers(): GenParsers { |
| extensibleViaService := true; |
| } |
| |
| mapping GMFMAP::LabelMapping::createExternalParser(): ExternalParser { |
| init { |
| var parser := GMFGEN::ExternalParser.allInstances()![ExternalParser]; |
| result := if parser.oclIsUndefined() then object ExternalParser {} else parser endif; |
| } |
| |
| if parser.oclIsUndefined() then |
| GMFMAP::Mapping.allInstances()![Mapping].map createGenParsers().implementations += result |
| endif |
| } |
| |
| mapping GMFMAP::ExpressionLabelMapping::createExpressionLabelParser(): GMFGEN::ExpressionLabelParser { |
| init { |
| result := object GMFGEN::ExpressionLabelParser { |
| expressionContext := GENMODEL::GenClass.allInstances()->any(e | e.ecoreClass = self.mapEntry.getDomainContext()); |
| viewExpression := if not self.viewExpression.oclIsUndefined() then self.viewExpression.map createValueExpression() endif; |
| editExpression := if not self.editExpression.oclIsUndefined() then self.editExpression.map createValueExpression() endif; |
| validateExpression := if not self.validateExpression.oclIsUndefined() then self.validateExpression.map createConstraint() endif; |
| } |
| } |
| |
| GMFMAP::Mapping.allInstances()![Mapping].map createGenParsers().implementations += result; |
| } |
| |
| mapping GMFMAP::OclChoiceLabelMapping::createOclChoiceParser(): GMFGEN::OclChoiceParser { |
| if not self.itemsExpression.oclIsUndefined() then |
| result.itemsExpression := self.itemsExpression.map createValueExpression() |
| endif; |
| if not self.showExpression.oclIsUndefined() then |
| result.showExpression := self.showExpression.map createValueExpression() |
| endif; |
| |
| GMFMAP::Mapping.allInstances()![Mapping].map createGenParsers().implementations += result; |
| } |
| |
| helper GMFMAP::FeatureLabelMapping::getOrCreateEnumParser(): GMFGEN::PredefinedEnumParser = |
| let enumParser = findPredefinedEnumParser() in |
| if enumParser.oclIsUndefined() then |
| createPredefinedEnumParser() |
| else |
| enumParser |
| endif; |
| |
| helper findPredefinedEnumParser(): GMFGEN::PredefinedEnumParser = |
| GMFGEN::GenParserImplementation.allInstances()![GMFGEN::PredefinedEnumParser]; |
| |
| helper createPredefinedEnumParser(): GMFGEN::PredefinedEnumParser { |
| var parser := object GMFGEN::PredefinedEnumParser {}; |
| GMFMAP::Mapping.allInstances()![Mapping].map createGenParsers().implementations += parser; |
| |
| return parser; |
| } |
| |
| helper GMFMAP::FeatureLabelMapping::getOrCreatePredefinedParser(): GMFGEN::PredefinedParser = |
| let editMethod = self.editMethod.get() in |
| let viewMethod = self.viewMethod.get() in |
| let parser = findPredefinedParser(editMethod, viewMethod) in |
| if parser.oclIsUndefined() then |
| createPredefinedParser(editMethod, viewMethod) |
| else parser endif; |
| |
| helper findPredefinedParser(editMethod: GMFGEN::LabelTextAccessMethod, viewMethod: GMFGEN::LabelTextAccessMethod): GMFGEN::PredefinedParser = |
| GMFGEN::GenParserImplementation.allInstances()[GMFGEN::PredefinedParser]->any(e | e.editMethod = editMethod and e.viewMethod = viewMethod); |
| |
| helper createPredefinedParser(editMethod: GMFGEN::LabelTextAccessMethod, viewMethod: GMFGEN::LabelTextAccessMethod): GMFGEN::PredefinedParser { |
| var parser := object GMFGEN::PredefinedParser {}; |
| parser.editMethod := editMethod; |
| parser.viewMethod := viewMethod; |
| |
| GMFMAP::Mapping.allInstances()![Mapping].map createGenParsers().implementations += parser; |
| |
| return parser; |
| } |
| |
| helper GMFMAP::LabelTextAccessMethod::get(): GMFGEN::LabelTextAccessMethod = |
| switch { |
| case (self = GMFMAP::LabelTextAccessMethod::MESSAGE_FORMAT) GMFGEN::LabelTextAccessMethod::MESSAGE_FORMAT; |
| case (self = GMFMAP::LabelTextAccessMethod::NATIVE) GMFGEN::LabelTextAccessMethod::NATIVE; |
| case (self = GMFMAP::LabelTextAccessMethod::REGEXP) GMFGEN::LabelTextAccessMethod::REGEXP; |
| case (self = GMFMAP::LabelTextAccessMethod::PRINTF) GMFGEN::LabelTextAccessMethod::PRINTF; |
| }; |
| |
| helper GMFMAP::FeatureLabelMapping::isEnumLabelMapping(): Boolean = |
| if self.features->size() <> 1 then false else |
| if self.editableFeatures->isEmpty() or self.editableFeatures->size() > self.features->size() then false else |
| let firstFeature = self.features->first() in |
| let firstEditFeature = self.editableFeatures->first() in |
| if firstFeature <> firstEditFeature then false else firstFeature.eType.oclIsKindOf(EEnum) endif |
| endif |
| endif; |