/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0 
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 *
 * generated by Xtext 2.11.0
 */
package org.eclipse.osbp.dsl.dto.xtext.serializer;

import com.google.inject.Inject;
import java.util.Set;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.osbp.dsl.common.xtext.serializer.CommonGrammarSemanticSequencer;
import org.eclipse.osbp.dsl.dto.xtext.services.DtoGrammarGrammarAccess;
import org.eclipse.osbp.dsl.semantic.common.types.LAnnotationDef;
import org.eclipse.osbp.dsl.semantic.common.types.LAttributeMatchingConstraint;
import org.eclipse.osbp.dsl.semantic.common.types.LDataType;
import org.eclipse.osbp.dsl.semantic.common.types.LDtCAssertFalse;
import org.eclipse.osbp.dsl.semantic.common.types.LDtCAssertTrue;
import org.eclipse.osbp.dsl.semantic.common.types.LDtCDecimalMax;
import org.eclipse.osbp.dsl.semantic.common.types.LDtCDecimalMin;
import org.eclipse.osbp.dsl.semantic.common.types.LDtCDigits;
import org.eclipse.osbp.dsl.semantic.common.types.LDtCFuture;
import org.eclipse.osbp.dsl.semantic.common.types.LDtCNotNull;
import org.eclipse.osbp.dsl.semantic.common.types.LDtCNull;
import org.eclipse.osbp.dsl.semantic.common.types.LDtCNumericMax;
import org.eclipse.osbp.dsl.semantic.common.types.LDtCNumericMin;
import org.eclipse.osbp.dsl.semantic.common.types.LDtCPast;
import org.eclipse.osbp.dsl.semantic.common.types.LDtCRegEx;
import org.eclipse.osbp.dsl.semantic.common.types.LDtCSize;
import org.eclipse.osbp.dsl.semantic.common.types.LEnum;
import org.eclipse.osbp.dsl.semantic.common.types.LEnumLiteral;
import org.eclipse.osbp.dsl.semantic.common.types.LKeyAndValue;
import org.eclipse.osbp.dsl.semantic.common.types.LModifier;
import org.eclipse.osbp.dsl.semantic.common.types.LMultiplicity;
import org.eclipse.osbp.dsl.semantic.common.types.LResultFilters;
import org.eclipse.osbp.dsl.semantic.common.types.LState;
import org.eclipse.osbp.dsl.semantic.common.types.LStateClass;
import org.eclipse.osbp.dsl.semantic.common.types.LTypedPackage;
import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage;
import org.eclipse.osbp.dsl.semantic.dto.LAutoInheritDto;
import org.eclipse.osbp.dsl.semantic.dto.LDto;
import org.eclipse.osbp.dsl.semantic.dto.LDtoAttribute;
import org.eclipse.osbp.dsl.semantic.dto.LDtoFeature;
import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedAttribute;
import org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedReference;
import org.eclipse.osbp.dsl.semantic.dto.LDtoMapper;
import org.eclipse.osbp.dsl.semantic.dto.LDtoModel;
import org.eclipse.osbp.dsl.semantic.dto.LDtoOperation;
import org.eclipse.osbp.dsl.semantic.dto.LDtoReference;
import org.eclipse.osbp.dsl.semantic.dto.OSBPDtoPackage;
import org.eclipse.osbp.xtext.oxtype.oxtype.OXImportDeclaration;
import org.eclipse.osbp.xtext.oxtype.oxtype.OXtypePackage;
import org.eclipse.xtext.Action;
import org.eclipse.xtext.Parameter;
import org.eclipse.xtext.ParserRule;
import org.eclipse.xtext.common.types.JvmFormalParameter;
import org.eclipse.xtext.common.types.JvmGenericArrayTypeReference;
import org.eclipse.xtext.common.types.JvmInnerTypeReference;
import org.eclipse.xtext.common.types.JvmLowerBound;
import org.eclipse.xtext.common.types.JvmParameterizedTypeReference;
import org.eclipse.xtext.common.types.JvmTypeParameter;
import org.eclipse.xtext.common.types.JvmUpperBound;
import org.eclipse.xtext.common.types.JvmWildcardTypeReference;
import org.eclipse.xtext.common.types.TypesPackage;
import org.eclipse.xtext.serializer.ISerializationContext;
import org.eclipse.xtext.serializer.acceptor.SequenceFeeder;
import org.eclipse.xtext.serializer.sequencer.ITransientValueService.ValueTransient;
import org.eclipse.xtext.xbase.XAssignment;
import org.eclipse.xtext.xbase.XBasicForLoopExpression;
import org.eclipse.xtext.xbase.XBinaryOperation;
import org.eclipse.xtext.xbase.XBlockExpression;
import org.eclipse.xtext.xbase.XBooleanLiteral;
import org.eclipse.xtext.xbase.XCasePart;
import org.eclipse.xtext.xbase.XCastedExpression;
import org.eclipse.xtext.xbase.XCatchClause;
import org.eclipse.xtext.xbase.XClosure;
import org.eclipse.xtext.xbase.XConstructorCall;
import org.eclipse.xtext.xbase.XDoWhileExpression;
import org.eclipse.xtext.xbase.XFeatureCall;
import org.eclipse.xtext.xbase.XForLoopExpression;
import org.eclipse.xtext.xbase.XIfExpression;
import org.eclipse.xtext.xbase.XInstanceOfExpression;
import org.eclipse.xtext.xbase.XListLiteral;
import org.eclipse.xtext.xbase.XMemberFeatureCall;
import org.eclipse.xtext.xbase.XNullLiteral;
import org.eclipse.xtext.xbase.XNumberLiteral;
import org.eclipse.xtext.xbase.XPostfixOperation;
import org.eclipse.xtext.xbase.XReturnExpression;
import org.eclipse.xtext.xbase.XSetLiteral;
import org.eclipse.xtext.xbase.XStringLiteral;
import org.eclipse.xtext.xbase.XSwitchExpression;
import org.eclipse.xtext.xbase.XSynchronizedExpression;
import org.eclipse.xtext.xbase.XThrowExpression;
import org.eclipse.xtext.xbase.XTryCatchFinallyExpression;
import org.eclipse.xtext.xbase.XTypeLiteral;
import org.eclipse.xtext.xbase.XUnaryOperation;
import org.eclipse.xtext.xbase.XVariableDeclaration;
import org.eclipse.xtext.xbase.XWhileExpression;
import org.eclipse.xtext.xbase.XbasePackage;
import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotation;
import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationElementValuePair;
import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationsPackage;
import org.eclipse.xtext.xtype.XFunctionTypeRef;
import org.eclipse.xtext.xtype.XImportSection;
import org.eclipse.xtext.xtype.XtypePackage;

@SuppressWarnings("all")
public class DtoGrammarSemanticSequencer extends CommonGrammarSemanticSequencer {

	@Inject
	private DtoGrammarGrammarAccess grammarAccess;
	
	@Override
	public void sequence(ISerializationContext context, EObject semanticObject) {
		EPackage epackage = semanticObject.eClass().getEPackage();
		ParserRule rule = context.getParserRule();
		Action action = context.getAssignedAction();
		Set<Parameter> parameters = context.getEnabledBooleanParameters();
		if (epackage == OSBPDtoPackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case OSBPDtoPackage.LAUTO_INHERIT_DTO:
				sequence_Class(context, (LAutoInheritDto) semanticObject); 
				return; 
			case OSBPDtoPackage.LDTO:
				if (action == grammarAccess.getClassAccess().getLDtoAnnotationInfoAction_2_0_0()
						|| action == grammarAccess.getClassAccess().getLAutoInheritDtoAnnotationInfoAction_2_1_0()) {
					sequence_Class_LAutoInheritDto_2_1_0_LDto_2_0_0(context, (LDto) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getClassRule()
						|| rule == grammarAccess.getTypeRule()) {
					sequence_Class(context, (LDto) semanticObject); 
					return; 
				}
				else break;
			case OSBPDtoPackage.LDTO_ATTRIBUTE:
				sequence_DtoFeature(context, (LDtoAttribute) semanticObject); 
				return; 
			case OSBPDtoPackage.LDTO_FEATURE:
				sequence_DtoFeature_LDtoAttribute_2_2_0_LDtoAttribute_2_3_0_LDtoAttribute_2_4_0_LDtoAttribute_2_5_0_LDtoAttribute_2_7_0_LDtoInheritedAttribute_2_0_0_0_LDtoInheritedReference_2_1_0_LDtoOperation_2_8_0_LDtoReference_2_6_0(context, (LDtoFeature) semanticObject); 
				return; 
			case OSBPDtoPackage.LDTO_INHERITED_ATTRIBUTE:
				sequence_DtoFeature(context, (LDtoInheritedAttribute) semanticObject); 
				return; 
			case OSBPDtoPackage.LDTO_INHERITED_REFERENCE:
				sequence_DtoFeature(context, (LDtoInheritedReference) semanticObject); 
				return; 
			case OSBPDtoPackage.LDTO_MAPPER:
				if (rule == grammarAccess.getDtoMapperRule()) {
					sequence_DtoMapper(context, (LDtoMapper) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getLimitedMapperDtoMapperRule()) {
					sequence_LimitedMapperDtoMapper(context, (LDtoMapper) semanticObject); 
					return; 
				}
				else break;
			case OSBPDtoPackage.LDTO_MODEL:
				sequence_LDTOModel(context, (LDtoModel) semanticObject); 
				return; 
			case OSBPDtoPackage.LDTO_OPERATION:
				sequence_DtoFeature(context, (LDtoOperation) semanticObject); 
				return; 
			case OSBPDtoPackage.LDTO_REFERENCE:
				sequence_DtoFeature(context, (LDtoReference) semanticObject); 
				return; 
			}
		else if (epackage == OXtypePackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case OXtypePackage.OX_IMPORT_DECLARATION:
				sequence_XImportDeclaration(context, (OXImportDeclaration) semanticObject); 
				return; 
			}
		else if (epackage == OSBPTypesPackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case OSBPTypesPackage.LANNOTATION_DEF:
				sequence_AnnotationDef(context, (LAnnotationDef) semanticObject); 
				return; 
			case OSBPTypesPackage.LATTRIBUTE_MATCHING_CONSTRAINT:
				sequence_AttributeMatchingConstraint(context, (LAttributeMatchingConstraint) semanticObject); 
				return; 
			case OSBPTypesPackage.LDATA_TYPE:
				sequence_DataType(context, (LDataType) semanticObject); 
				return; 
			case OSBPTypesPackage.LDT_CASSERT_FALSE:
				sequence_DtCAssertFalse(context, (LDtCAssertFalse) semanticObject); 
				return; 
			case OSBPTypesPackage.LDT_CASSERT_TRUE:
				sequence_DtCAssertTrue(context, (LDtCAssertTrue) semanticObject); 
				return; 
			case OSBPTypesPackage.LDT_CDECIMAL_MAX:
				sequence_DtCDecimalMax(context, (LDtCDecimalMax) semanticObject); 
				return; 
			case OSBPTypesPackage.LDT_CDECIMAL_MIN:
				sequence_DtCDecimalMin(context, (LDtCDecimalMin) semanticObject); 
				return; 
			case OSBPTypesPackage.LDT_CDIGITS:
				sequence_DtCDigits(context, (LDtCDigits) semanticObject); 
				return; 
			case OSBPTypesPackage.LDT_CFUTURE:
				sequence_DtCFuture(context, (LDtCFuture) semanticObject); 
				return; 
			case OSBPTypesPackage.LDT_CNOT_NULL:
				sequence_DtCNotNull(context, (LDtCNotNull) semanticObject); 
				return; 
			case OSBPTypesPackage.LDT_CNULL:
				sequence_DtCNull(context, (LDtCNull) semanticObject); 
				return; 
			case OSBPTypesPackage.LDT_CNUMERIC_MAX:
				sequence_DtCNumericMax(context, (LDtCNumericMax) semanticObject); 
				return; 
			case OSBPTypesPackage.LDT_CNUMERIC_MIN:
				sequence_DtCNumericMin(context, (LDtCNumericMin) semanticObject); 
				return; 
			case OSBPTypesPackage.LDT_CPAST:
				sequence_DtCPast(context, (LDtCPast) semanticObject); 
				return; 
			case OSBPTypesPackage.LDT_CREG_EX:
				sequence_DtCRegEx(context, (LDtCRegEx) semanticObject); 
				return; 
			case OSBPTypesPackage.LDT_CSIZE:
				sequence_DtCSize(context, (LDtCSize) semanticObject); 
				return; 
			case OSBPTypesPackage.LENUM:
				sequence_Enum(context, (LEnum) semanticObject); 
				return; 
			case OSBPTypesPackage.LENUM_LITERAL:
				sequence_EnumLiteral(context, (LEnumLiteral) semanticObject); 
				return; 
			case OSBPTypesPackage.LKEY_AND_VALUE:
				sequence_KeyAndValue(context, (LKeyAndValue) semanticObject); 
				return; 
			case OSBPTypesPackage.LMODIFIER:
				sequence_Modifier(context, (LModifier) semanticObject); 
				return; 
			case OSBPTypesPackage.LMULTIPLICITY:
				sequence_Multiplicity(context, (LMultiplicity) semanticObject); 
				return; 
			case OSBPTypesPackage.LRESULT_FILTERS:
				sequence_ResultFilters(context, (LResultFilters) semanticObject); 
				return; 
			case OSBPTypesPackage.LSTATE:
				sequence_State(context, (LState) semanticObject); 
				return; 
			case OSBPTypesPackage.LSTATE_CLASS:
				sequence_StateClass(context, (LStateClass) semanticObject); 
				return; 
			case OSBPTypesPackage.LTYPED_PACKAGE:
				sequence_TypedPackage(context, (LTypedPackage) semanticObject); 
				return; 
			}
		else if (epackage == TypesPackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case TypesPackage.JVM_FORMAL_PARAMETER:
				if (rule == grammarAccess.getFullJvmFormalParameterRule()) {
					sequence_FullJvmFormalParameter(context, (JvmFormalParameter) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getJvmFormalParameterRule()) {
					sequence_JvmFormalParameter(context, (JvmFormalParameter) semanticObject); 
					return; 
				}
				else break;
			case TypesPackage.JVM_GENERIC_ARRAY_TYPE_REFERENCE:
				sequence_JvmTypeReference(context, (JvmGenericArrayTypeReference) semanticObject); 
				return; 
			case TypesPackage.JVM_INNER_TYPE_REFERENCE:
				sequence_JvmParameterizedTypeReference(context, (JvmInnerTypeReference) semanticObject); 
				return; 
			case TypesPackage.JVM_LOWER_BOUND:
				if (rule == grammarAccess.getJvmLowerBoundAndedRule()) {
					sequence_JvmLowerBoundAnded(context, (JvmLowerBound) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getJvmLowerBoundRule()) {
					sequence_JvmLowerBound(context, (JvmLowerBound) semanticObject); 
					return; 
				}
				else break;
			case TypesPackage.JVM_PARAMETERIZED_TYPE_REFERENCE:
				if (action == grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()) {
					sequence_JvmParameterizedTypeReference_JvmInnerTypeReference_1_4_0_0_0(context, (JvmParameterizedTypeReference) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getJvmTypeReferenceRule()
						|| action == grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()
						|| rule == grammarAccess.getJvmParameterizedTypeReferenceRule()
						|| rule == grammarAccess.getJvmArgumentTypeReferenceRule()) {
					sequence_JvmParameterizedTypeReference(context, (JvmParameterizedTypeReference) semanticObject); 
					return; 
				}
				else break;
			case TypesPackage.JVM_TYPE_PARAMETER:
				sequence_JvmTypeParameter(context, (JvmTypeParameter) semanticObject); 
				return; 
			case TypesPackage.JVM_UPPER_BOUND:
				if (rule == grammarAccess.getJvmUpperBoundAndedRule()) {
					sequence_JvmUpperBoundAnded(context, (JvmUpperBound) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getJvmUpperBoundRule()) {
					sequence_JvmUpperBound(context, (JvmUpperBound) semanticObject); 
					return; 
				}
				else break;
			case TypesPackage.JVM_WILDCARD_TYPE_REFERENCE:
				sequence_JvmWildcardTypeReference(context, (JvmWildcardTypeReference) semanticObject); 
				return; 
			}
		else if (epackage == XAnnotationsPackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case XAnnotationsPackage.XANNOTATION:
				sequence_XAnnotation(context, (XAnnotation) semanticObject); 
				return; 
			case XAnnotationsPackage.XANNOTATION_ELEMENT_VALUE_PAIR:
				sequence_XAnnotationElementValuePair(context, (XAnnotationElementValuePair) semanticObject); 
				return; 
			}
		else if (epackage == XbasePackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case XbasePackage.XASSIGNMENT:
				sequence_XAssignment_XMemberFeatureCall(context, (XAssignment) semanticObject); 
				return; 
			case XbasePackage.XBASIC_FOR_LOOP_EXPRESSION:
				sequence_XBasicForLoopExpression(context, (XBasicForLoopExpression) semanticObject); 
				return; 
			case XbasePackage.XBINARY_OPERATION:
				sequence_XAdditiveExpression_XAndExpression_XAssignment_XEqualityExpression_XMultiplicativeExpression_XOrExpression_XOtherOperatorExpression_XRelationalExpression(context, (XBinaryOperation) semanticObject); 
				return; 
			case XbasePackage.XBLOCK_EXPRESSION:
				if (rule == grammarAccess.getXAnnotationElementValueOrCommaListRule()
						|| action == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()
						|| rule == grammarAccess.getXAnnotationElementValueRule()
						|| rule == grammarAccess.getXAnnotationOrExpressionRule()
						|| rule == grammarAccess.getXExpressionRule()
						|| rule == grammarAccess.getXAssignmentRule()
						|| action == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOrExpressionRule()
						|| action == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAndExpressionRule()
						|| action == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXEqualityExpressionRule()
						|| action == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXRelationalExpressionRule()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOtherOperatorExpressionRule()
						|| action == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAdditiveExpressionRule()
						|| action == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXMultiplicativeExpressionRule()
						|| action == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXUnaryOperationRule()
						|| rule == grammarAccess.getXCastedExpressionRule()
						|| action == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()
						|| rule == grammarAccess.getXPostfixOperationRule()
						|| action == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()
						|| rule == grammarAccess.getXMemberFeatureCallRule()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()
						|| rule == grammarAccess.getXPrimaryExpressionRule()
						|| rule == grammarAccess.getXParenthesizedExpressionRule()
						|| rule == grammarAccess.getXBlockExpressionRule()
						|| rule == grammarAccess.getXExpressionOrVarDeclarationRule()) {
					sequence_XBlockExpression(context, (XBlockExpression) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getXExpressionInClosureRule()) {
					sequence_XExpressionInClosure(context, (XBlockExpression) semanticObject); 
					return; 
				}
				else break;
			case XbasePackage.XBOOLEAN_LITERAL:
				sequence_XBooleanLiteral(context, (XBooleanLiteral) semanticObject); 
				return; 
			case XbasePackage.XCASE_PART:
				sequence_XCasePart(context, (XCasePart) semanticObject); 
				return; 
			case XbasePackage.XCASTED_EXPRESSION:
				sequence_XCastedExpression(context, (XCastedExpression) semanticObject); 
				return; 
			case XbasePackage.XCATCH_CLAUSE:
				sequence_XCatchClause(context, (XCatchClause) semanticObject); 
				return; 
			case XbasePackage.XCLOSURE:
				if (rule == grammarAccess.getXAnnotationElementValueOrCommaListRule()
						|| action == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()
						|| rule == grammarAccess.getXAnnotationElementValueRule()
						|| rule == grammarAccess.getXAnnotationOrExpressionRule()
						|| rule == grammarAccess.getXExpressionRule()
						|| rule == grammarAccess.getXAssignmentRule()
						|| action == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOrExpressionRule()
						|| action == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAndExpressionRule()
						|| action == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXEqualityExpressionRule()
						|| action == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXRelationalExpressionRule()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOtherOperatorExpressionRule()
						|| action == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAdditiveExpressionRule()
						|| action == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXMultiplicativeExpressionRule()
						|| action == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXUnaryOperationRule()
						|| rule == grammarAccess.getXCastedExpressionRule()
						|| action == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()
						|| rule == grammarAccess.getXPostfixOperationRule()
						|| action == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()
						|| rule == grammarAccess.getXMemberFeatureCallRule()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()
						|| rule == grammarAccess.getXPrimaryExpressionRule()
						|| rule == grammarAccess.getXLiteralRule()
						|| rule == grammarAccess.getXClosureRule()
						|| rule == grammarAccess.getXParenthesizedExpressionRule()
						|| rule == grammarAccess.getXExpressionOrVarDeclarationRule()) {
					sequence_XClosure(context, (XClosure) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getXShortClosureRule()) {
					sequence_XShortClosure(context, (XClosure) semanticObject); 
					return; 
				}
				else break;
			case XbasePackage.XCONSTRUCTOR_CALL:
				sequence_XConstructorCall(context, (XConstructorCall) semanticObject); 
				return; 
			case XbasePackage.XDO_WHILE_EXPRESSION:
				sequence_XDoWhileExpression(context, (XDoWhileExpression) semanticObject); 
				return; 
			case XbasePackage.XFEATURE_CALL:
				sequence_XFeatureCall(context, (XFeatureCall) semanticObject); 
				return; 
			case XbasePackage.XFOR_LOOP_EXPRESSION:
				sequence_XForLoopExpression(context, (XForLoopExpression) semanticObject); 
				return; 
			case XbasePackage.XIF_EXPRESSION:
				sequence_XIfExpression(context, (XIfExpression) semanticObject); 
				return; 
			case XbasePackage.XINSTANCE_OF_EXPRESSION:
				sequence_XRelationalExpression(context, (XInstanceOfExpression) semanticObject); 
				return; 
			case XbasePackage.XLIST_LITERAL:
				if (rule == grammarAccess.getXAnnotationElementValueOrCommaListRule()) {
					sequence_XAnnotationElementValueOrCommaList_XListLiteral(context, (XListLiteral) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getXAnnotationElementValueRule()) {
					sequence_XAnnotationElementValue_XListLiteral(context, (XListLiteral) semanticObject); 
					return; 
				}
				else if (action == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()
						|| rule == grammarAccess.getXAnnotationOrExpressionRule()
						|| rule == grammarAccess.getXExpressionRule()
						|| rule == grammarAccess.getXAssignmentRule()
						|| action == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOrExpressionRule()
						|| action == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAndExpressionRule()
						|| action == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXEqualityExpressionRule()
						|| action == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXRelationalExpressionRule()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOtherOperatorExpressionRule()
						|| action == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAdditiveExpressionRule()
						|| action == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXMultiplicativeExpressionRule()
						|| action == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXUnaryOperationRule()
						|| rule == grammarAccess.getXCastedExpressionRule()
						|| action == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()
						|| rule == grammarAccess.getXPostfixOperationRule()
						|| action == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()
						|| rule == grammarAccess.getXMemberFeatureCallRule()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()
						|| rule == grammarAccess.getXPrimaryExpressionRule()
						|| rule == grammarAccess.getXLiteralRule()
						|| rule == grammarAccess.getXCollectionLiteralRule()
						|| rule == grammarAccess.getXListLiteralRule()
						|| rule == grammarAccess.getXParenthesizedExpressionRule()
						|| rule == grammarAccess.getXExpressionOrVarDeclarationRule()) {
					sequence_XListLiteral(context, (XListLiteral) semanticObject); 
					return; 
				}
				else break;
			case XbasePackage.XMEMBER_FEATURE_CALL:
				sequence_XMemberFeatureCall(context, (XMemberFeatureCall) semanticObject); 
				return; 
			case XbasePackage.XNULL_LITERAL:
				sequence_XNullLiteral(context, (XNullLiteral) semanticObject); 
				return; 
			case XbasePackage.XNUMBER_LITERAL:
				sequence_XNumberLiteral(context, (XNumberLiteral) semanticObject); 
				return; 
			case XbasePackage.XPOSTFIX_OPERATION:
				sequence_XPostfixOperation(context, (XPostfixOperation) semanticObject); 
				return; 
			case XbasePackage.XRETURN_EXPRESSION:
				sequence_XReturnExpression(context, (XReturnExpression) semanticObject); 
				return; 
			case XbasePackage.XSET_LITERAL:
				sequence_XSetLiteral(context, (XSetLiteral) semanticObject); 
				return; 
			case XbasePackage.XSTRING_LITERAL:
				sequence_XStringLiteral(context, (XStringLiteral) semanticObject); 
				return; 
			case XbasePackage.XSWITCH_EXPRESSION:
				sequence_XSwitchExpression(context, (XSwitchExpression) semanticObject); 
				return; 
			case XbasePackage.XSYNCHRONIZED_EXPRESSION:
				sequence_XSynchronizedExpression(context, (XSynchronizedExpression) semanticObject); 
				return; 
			case XbasePackage.XTHROW_EXPRESSION:
				sequence_XThrowExpression(context, (XThrowExpression) semanticObject); 
				return; 
			case XbasePackage.XTRY_CATCH_FINALLY_EXPRESSION:
				sequence_XTryCatchFinallyExpression(context, (XTryCatchFinallyExpression) semanticObject); 
				return; 
			case XbasePackage.XTYPE_LITERAL:
				sequence_XTypeLiteral(context, (XTypeLiteral) semanticObject); 
				return; 
			case XbasePackage.XUNARY_OPERATION:
				sequence_XUnaryOperation(context, (XUnaryOperation) semanticObject); 
				return; 
			case XbasePackage.XVARIABLE_DECLARATION:
				sequence_XVariableDeclaration(context, (XVariableDeclaration) semanticObject); 
				return; 
			case XbasePackage.XWHILE_EXPRESSION:
				sequence_XWhileExpression(context, (XWhileExpression) semanticObject); 
				return; 
			}
		else if (epackage == XtypePackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case XtypePackage.XFUNCTION_TYPE_REF:
				sequence_XFunctionTypeRef(context, (XFunctionTypeRef) semanticObject); 
				return; 
			case XtypePackage.XIMPORT_SECTION:
				sequence_XImportSection(context, (XImportSection) semanticObject); 
				return; 
			}
		if (errorAcceptor != null)
			errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context));
	}
	
	/**
	 * Contexts:
	 *     Class returns LAutoInheritDto
	 *     Type returns LAutoInheritDto
	 *
	 * Constraint:
	 *     (
	 *         annotationInfo=Class_LAutoInheritDto_2_1_0 
	 *         abstract?='abstract'? 
	 *         name=ValidIDWithKeywords 
	 *         superType=[LDto|TYPE_CROSS_REFERENCE]? 
	 *         wrappedType=[LEntity|TYPE_CROSS_REFERENCE] 
	 *         features+=DtoFeature*
	 *     )
	 */
	protected void sequence_Class(ISerializationContext context, LAutoInheritDto semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     Class.LDto_2_0_0 returns LDto
	 *     Class.LAutoInheritDto_2_1_0 returns LDto
	 *
	 * Constraint:
	 *     annotations+=AnnotationDef*
	 */
	protected void sequence_Class_LAutoInheritDto_2_1_0_LDto_2_0_0(ISerializationContext context, LDto semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     Class returns LDto
	 *     Type returns LDto
	 *
	 * Constraint:
	 *     (
	 *         annotationInfo=Class_LDto_2_0_0 
	 *         abstract?='abstract'? 
	 *         name=ValidIDWithKeywords 
	 *         superType=[LDto|TYPE_CROSS_REFERENCE]? 
	 *         wrappedType=[LEntity|TYPE_CROSS_REFERENCE]? 
	 *         features+=DtoFeature*
	 *     )
	 */
	protected void sequence_Class(ISerializationContext context, LDto semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     DtoFeature returns LDtoAttribute
	 *
	 * Constraint:
	 *     (
	 *         (
	 *             annotationInfo=DtoFeature_LDtoAttribute_2_2_0 
	 *             transient?='transient' 
	 *             type=[LScalarType|TYPE_CROSS_REFERENCE] 
	 *             constraints+=AllConstraints* 
	 *             name=ValidIDWithKeywords 
	 *             (properties+=KeyAndValue properties+=KeyAndValue*)?
	 *         ) | 
	 *         (
	 *             annotationInfo=DtoFeature_LDtoAttribute_2_3_0 
	 *             dirty?='dirty' 
	 *             type=[LScalarType|TYPE_CROSS_REFERENCE] 
	 *             name=ValidIDWithKeywords 
	 *             (properties+=KeyAndValue properties+=KeyAndValue*)?
	 *         ) | 
	 *         (
	 *             annotationInfo=DtoFeature_LDtoAttribute_2_4_0 
	 *             derived?='derived' 
	 *             domainDescription?='domainDescription'? 
	 *             type=[LScalarType|TYPE_CROSS_REFERENCE] 
	 *             name=ValidIDWithKeywords 
	 *             (properties+=KeyAndValue properties+=KeyAndValue*)? 
	 *             derivedGetterExpression=XBlockExpression
	 *         ) | 
	 *         (
	 *             annotationInfo=DtoFeature_LDtoAttribute_2_5_0 
	 *             (id?='id' | version?='version' | uuid?='uuid' | domainDescription?='domainDescription' | domainKey?='domainKey') 
	 *             type=[LScalarType|TYPE_CROSS_REFERENCE] 
	 *             multiplicity=Multiplicity? 
	 *             constraints+=AllConstraints* 
	 *             name=ValidIDWithKeywords 
	 *             (properties+=KeyAndValue properties+=KeyAndValue*)?
	 *         ) | 
	 *         (
	 *             annotationInfo=DtoFeature_LDtoAttribute_2_7_0 
	 *             type=[LScalarType|TYPE_CROSS_REFERENCE] 
	 *             multiplicity=Multiplicity? 
	 *             constraints+=AllConstraints* 
	 *             name=ValidIDWithKeywords 
	 *             (properties+=KeyAndValue properties+=KeyAndValue*)? 
	 *             mapper=LimitedMapperDtoMapper?
	 *         )
	 *     )
	 */
	protected void sequence_DtoFeature(ISerializationContext context, LDtoAttribute semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     DtoFeature.LDtoInheritedAttribute_2_0_0_0 returns LDtoFeature
	 *     DtoFeature.LDtoInheritedReference_2_1_0 returns LDtoFeature
	 *     DtoFeature.LDtoAttribute_2_2_0 returns LDtoFeature
	 *     DtoFeature.LDtoAttribute_2_3_0 returns LDtoFeature
	 *     DtoFeature.LDtoAttribute_2_4_0 returns LDtoFeature
	 *     DtoFeature.LDtoAttribute_2_5_0 returns LDtoFeature
	 *     DtoFeature.LDtoReference_2_6_0 returns LDtoFeature
	 *     DtoFeature.LDtoAttribute_2_7_0 returns LDtoFeature
	 *     DtoFeature.LDtoOperation_2_8_0 returns LDtoFeature
	 *
	 * Constraint:
	 *     annotations+=AnnotationDef*
	 */
	protected void sequence_DtoFeature_LDtoAttribute_2_2_0_LDtoAttribute_2_3_0_LDtoAttribute_2_4_0_LDtoAttribute_2_5_0_LDtoAttribute_2_7_0_LDtoInheritedAttribute_2_0_0_0_LDtoInheritedReference_2_1_0_LDtoOperation_2_8_0_LDtoReference_2_6_0(ISerializationContext context, LDtoFeature semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     DtoFeature returns LDtoInheritedAttribute
	 *
	 * Constraint:
	 *     (
	 *         annotationInfo=DtoFeature_LDtoInheritedAttribute_2_0_0_0 
	 *         inheritedFeature=[LEntityAttribute|ValidIDWithKeywords] 
	 *         type=[LDto|TYPE_CROSS_REFERENCE]? 
	 *         (properties+=KeyAndValue properties+=KeyAndValue*)? 
	 *         mapper=DtoMapper?
	 *     )
	 */
	protected void sequence_DtoFeature(ISerializationContext context, LDtoInheritedAttribute semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     DtoFeature returns LDtoInheritedReference
	 *
	 * Constraint:
	 *     (
	 *         annotationInfo=DtoFeature_LDtoInheritedReference_2_1_0 
	 *         inheritedFeature=[LEntityReference|ValidIDWithKeywords] 
	 *         type=[LDto|TYPE_CROSS_REFERENCE] 
	 *         (properties+=KeyAndValue properties+=KeyAndValue*)? 
	 *         mapper=DtoMapper?
	 *     )
	 */
	protected void sequence_DtoFeature(ISerializationContext context, LDtoInheritedReference semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     DtoFeature returns LDtoOperation
	 *
	 * Constraint:
	 *     (
	 *         annotationInfo=DtoFeature_LDtoOperation_2_8_0 
	 *         type=JvmTypeReference 
	 *         name=ValidIDWithKeywords 
	 *         (params+=FullJvmFormalParameter params+=FullJvmFormalParameter*)? 
	 *         body=XExpression
	 *     )
	 */
	protected void sequence_DtoFeature(ISerializationContext context, LDtoOperation semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     DtoFeature returns LDtoReference
	 *
	 * Constraint:
	 *     (
	 *         annotationInfo=DtoFeature_LDtoReference_2_6_0 
	 *         cascadeMergePersist?='cascadeMergePersist'? 
	 *         lazy?='lazy'? 
	 *         cascadeRemove?='cascadeRemove'? 
	 *         type=[LDto|TYPE_CROSS_REFERENCE] 
	 *         multiplicity=Multiplicity? 
	 *         constraints+=AllConstraints* 
	 *         name=ValidIDWithKeywords 
	 *         opposite=[LDtoReference|LFQN]? 
	 *         (properties+=KeyAndValue properties+=KeyAndValue*)? 
	 *         mapper=LimitedMapperDtoMapper?
	 *     )
	 */
	protected void sequence_DtoFeature(ISerializationContext context, LDtoReference semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     DtoMapper returns LDtoMapper
	 *
	 * Constraint:
	 *     (toDTO=XExpression fromDTO=XExpression?)
	 */
	protected void sequence_DtoMapper(ISerializationContext context, LDtoMapper semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     LDTOModel returns LDtoModel
	 *
	 * Constraint:
	 *     ((importSection=XImportSection packages+=TypedPackage+) | packages+=TypedPackage+)?
	 */
	protected void sequence_LDTOModel(ISerializationContext context, LDtoModel semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     LimitedMapperDtoMapper returns LDtoMapper
	 *
	 * Constraint:
	 *     toDTO=XExpression
	 */
	protected void sequence_LimitedMapperDtoMapper(ISerializationContext context, LDtoMapper semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, OSBPDtoPackage.Literals.LDTO_MAPPER__TO_DTO) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, OSBPDtoPackage.Literals.LDTO_MAPPER__TO_DTO));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getLimitedMapperDtoMapperAccess().getToDTOXExpressionParserRuleCall_2_0(), semanticObject.getToDTO());
		feeder.finish();
	}
	
	
}
