blob: ff331e41b3a44bc0a32c0935121489451b15b465 [file] [log] [blame]
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;