/**
 * 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.entity.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.entity.xtext.services.EntityGrammarGrammarAccess;
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.LClass;
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.LTypedPackage;
import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage;
import org.eclipse.osbp.dsl.semantic.entity.LBean;
import org.eclipse.osbp.dsl.semantic.entity.LBeanAttribute;
import org.eclipse.osbp.dsl.semantic.entity.LBeanFeature;
import org.eclipse.osbp.dsl.semantic.entity.LBeanReference;
import org.eclipse.osbp.dsl.semantic.entity.LEntity;
import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
import org.eclipse.osbp.dsl.semantic.entity.LEntityColumnPersistenceInfo;
import org.eclipse.osbp.dsl.semantic.entity.LEntityFeature;
import org.eclipse.osbp.dsl.semantic.entity.LEntityModel;
import org.eclipse.osbp.dsl.semantic.entity.LEntityPersistenceInfo;
import org.eclipse.osbp.dsl.semantic.entity.LEntityReference;
import org.eclipse.osbp.dsl.semantic.entity.LEntitySuperIndex;
import org.eclipse.osbp.dsl.semantic.entity.LIndex;
import org.eclipse.osbp.dsl.semantic.entity.LKanbanEnumInfo;
import org.eclipse.osbp.dsl.semantic.entity.LKanbanStateDetail;
import org.eclipse.osbp.dsl.semantic.entity.LNestedFeature;
import org.eclipse.osbp.dsl.semantic.entity.LOperation;
import org.eclipse.osbp.dsl.semantic.entity.LTablePerClassStrategy;
import org.eclipse.osbp.dsl.semantic.entity.LTablePerSubclassStrategy;
import org.eclipse.osbp.dsl.semantic.entity.OSBPEntityPackage;
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 EntityGrammarSemanticSequencer extends CommonGrammarSemanticSequencer {

	@Inject
	private EntityGrammarGrammarAccess 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 == OSBPEntityPackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case OSBPEntityPackage.LBEAN:
				sequence_Class(context, (LBean) semanticObject); 
				return; 
			case OSBPEntityPackage.LBEAN_ATTRIBUTE:
				sequence_BeanFeature(context, (LBeanAttribute) semanticObject); 
				return; 
			case OSBPEntityPackage.LBEAN_FEATURE:
				sequence_BeanFeature_LBeanAttribute_2_1_0_LBeanReference_2_0_0_LOperation_2_2_0(context, (LBeanFeature) semanticObject); 
				return; 
			case OSBPEntityPackage.LBEAN_REFERENCE:
				sequence_BeanFeature(context, (LBeanReference) semanticObject); 
				return; 
			case OSBPEntityPackage.LENTITY:
				sequence_Class(context, (LEntity) semanticObject); 
				return; 
			case OSBPEntityPackage.LENTITY_ATTRIBUTE:
				sequence_EntityFeature(context, (LEntityAttribute) semanticObject); 
				return; 
			case OSBPEntityPackage.LENTITY_COLUMN_PERSISTENCE_INFO:
				sequence_ColumnPersistenceInfo(context, (LEntityColumnPersistenceInfo) semanticObject); 
				return; 
			case OSBPEntityPackage.LENTITY_FEATURE:
				sequence_EntityFeature_LEntityAttribute_2_1_0_LEntityReference_2_0_0_LOperation_2_2_0(context, (LEntityFeature) semanticObject); 
				return; 
			case OSBPEntityPackage.LENTITY_MODEL:
				sequence_EntityModel(context, (LEntityModel) semanticObject); 
				return; 
			case OSBPEntityPackage.LENTITY_PERSISTENCE_INFO:
				sequence_EntityPersistenceInfo(context, (LEntityPersistenceInfo) semanticObject); 
				return; 
			case OSBPEntityPackage.LENTITY_REFERENCE:
				sequence_EntityFeature(context, (LEntityReference) semanticObject); 
				return; 
			case OSBPEntityPackage.LENTITY_SUPER_INDEX:
				sequence_EntitySuperIndex(context, (LEntitySuperIndex) semanticObject); 
				return; 
			case OSBPEntityPackage.LINDEX:
				sequence_Index(context, (LIndex) semanticObject); 
				return; 
			case OSBPEntityPackage.LKANBAN_ENUM_INFO:
				sequence_KanbanEnumInfo(context, (LKanbanEnumInfo) semanticObject); 
				return; 
			case OSBPEntityPackage.LKANBAN_STATE_DETAIL:
				sequence_KanbanStateDetail(context, (LKanbanStateDetail) semanticObject); 
				return; 
			case OSBPEntityPackage.LNESTED_FEATURE:
				if (rule == grammarAccess.getEntityFeaturePathSegmentRule()) {
					sequence_EntityFeaturePathSegment(context, (LNestedFeature) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getEntitySuperIndexAttributeRule()) {
					sequence_EntitySuperIndexAttribute(context, (LNestedFeature) semanticObject); 
					return; 
				}
				else break;
			case OSBPEntityPackage.LOPERATION:
				if (rule == grammarAccess.getBeanFeatureRule()) {
					sequence_BeanFeature(context, (LOperation) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getEntityFeatureRule()) {
					sequence_EntityFeature(context, (LOperation) semanticObject); 
					return; 
				}
				else break;
			case OSBPEntityPackage.LTABLE_PER_CLASS_STRATEGY:
				sequence_TablePerClassStrategy(context, (LTablePerClassStrategy) semanticObject); 
				return; 
			case OSBPEntityPackage.LTABLE_PER_SUBCLASS_STRATEGY:
				sequence_TablePerSubclassStrategy(context, (LTablePerSubclassStrategy) 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.LCLASS:
				sequence_Class_LBean_2_2_0_LEntity_2_0_0_LEntity_2_1_0(context, (LClass) 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.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:
	 *     BeanFeature returns LBeanAttribute
	 *
	 * Constraint:
	 *     (
	 *         annotationInfo=BeanFeature_LBeanAttribute_2_1_0 
	 *         (
	 *             (
	 *                 transient?='transient' 
	 *                 type=[LScalarType|TYPE_CROSS_REFERENCE] 
	 *                 constraints+=AllConstraints* 
	 *                 name=TRANSLATABLEID 
	 *                 (isGrouped?='group' groupName=TRANSLATABLEID)? 
	 *                 (properties+=KeyAndValue properties+=KeyAndValue*)?
	 *             ) | 
	 *             (
	 *                 (id?='id' | version?='version')? 
	 *                 (filtering?='filter' | rangeFiltering?='range')? 
	 *                 type=[LScalarType|TYPE_CROSS_REFERENCE] 
	 *                 multiplicity=Multiplicity? 
	 *                 constraints+=AllConstraints* 
	 *                 name=TRANSLATABLEID 
	 *                 (isGrouped?='group' groupName=TRANSLATABLEID)? 
	 *                 (properties+=KeyAndValue properties+=KeyAndValue*)?
	 *             )
	 *         )
	 *     )
	 */
	protected void sequence_BeanFeature(ISerializationContext context, LBeanAttribute semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     BeanFeature.LBeanReference_2_0_0 returns LBeanFeature
	 *     BeanFeature.LBeanAttribute_2_1_0 returns LBeanFeature
	 *     BeanFeature.LOperation_2_2_0 returns LBeanFeature
	 *
	 * Constraint:
	 *     annotations+=AnnotationDef*
	 */
	protected void sequence_BeanFeature_LBeanAttribute_2_1_0_LBeanReference_2_0_0_LOperation_2_2_0(ISerializationContext context, LBeanFeature semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     BeanFeature returns LBeanReference
	 *
	 * Constraint:
	 *     (
	 *         annotationInfo=BeanFeature_LBeanReference_2_0_0 
	 *         cascading?='cascade'? 
	 *         type=[LType|TYPE_CROSS_REFERENCE] 
	 *         multiplicity=Multiplicity? 
	 *         constraints+=AllConstraints* 
	 *         name=TRANSLATABLEID 
	 *         (opposite=[LReference|LFQN] (asGrid?='asGrid' | asTable?='asTable')?)? 
	 *         (isGrouped?='group' groupName=TRANSLATABLEID)? 
	 *         (properties+=KeyAndValue properties+=KeyAndValue*)? 
	 *         resultFilters=ResultFilters?
	 *     )
	 */
	protected void sequence_BeanFeature(ISerializationContext context, LBeanReference semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     BeanFeature returns LOperation
	 *
	 * Constraint:
	 *     (
	 *         annotationInfo=BeanFeature_LOperation_2_2_0 
	 *         type=JvmTypeReference 
	 *         name=ValidIDWithKeywords 
	 *         (params+=FullJvmFormalParameter params+=FullJvmFormalParameter*)? 
	 *         body=XExpression
	 *     )
	 */
	protected void sequence_BeanFeature(ISerializationContext context, LOperation semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     Class returns LBean
	 *     Type returns LBean
	 *
	 * Constraint:
	 *     (annotationInfo=Class_LBean_2_2_0 name=TRANSLATABLEID superType=[LBean|TYPE_CROSS_REFERENCE]? features+=BeanFeature*)
	 */
	protected void sequence_Class(ISerializationContext context, LBean semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     Class.LEntity_2_0_0 returns LClass
	 *     Class.LEntity_2_1_0 returns LClass
	 *     Class.LBean_2_2_0 returns LClass
	 *
	 * Constraint:
	 *     annotations+=AnnotationDef*
	 */
	protected void sequence_Class_LBean_2_2_0_LEntity_2_0_0_LEntity_2_1_0(ISerializationContext context, LClass semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     Class returns LEntity
	 *     Type returns LEntity
	 *
	 * Constraint:
	 *     (
	 *         (
	 *             annotationInfo=Class_LEntity_2_0_0 
	 *             (
	 *                 (abstract?='abstract' | historized?='historized' | cacheable?='cacheable')? 
	 *                 (timedependent?='timedependent' timedependentDateType=LHistorizedDateType?)?
	 *             )+ 
	 *             name=TRANSLATABLEID 
	 *             superType=[LEntity|TYPE_CROSS_REFERENCE]? 
	 *             persistenceInfo=EntityPersistenceInfo 
	 *             inheritanceStrategy=EntityInheritanceStrategy? 
	 *             persistenceUnit=STRING? 
	 *             features+=EntityFeature* 
	 *             (indexes+=Index | superIndex+=EntitySuperIndex)*
	 *         ) | 
	 *         (
	 *             annotationInfo=Class_LEntity_2_1_0 
	 *             mappedSuperclass?='mappedSuperclass' 
	 *             superType=[LEntity|TYPE_CROSS_REFERENCE]? 
	 *             name=ValidIDWithKeywords 
	 *             persistenceUnit=STRING? 
	 *             features+=EntityFeature*
	 *         )
	 *     )
	 */
	protected void sequence_Class(ISerializationContext context, LEntity semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     ColumnPersistenceInfo returns LEntityColumnPersistenceInfo
	 *
	 * Constraint:
	 *     columnName=ValidIDWithKeywords
	 */
	protected void sequence_ColumnPersistenceInfo(ISerializationContext context, LEntityColumnPersistenceInfo semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, OSBPEntityPackage.Literals.LENTITY_COLUMN_PERSISTENCE_INFO__COLUMN_NAME) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, OSBPEntityPackage.Literals.LENTITY_COLUMN_PERSISTENCE_INFO__COLUMN_NAME));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getColumnPersistenceInfoAccess().getColumnNameValidIDWithKeywordsParserRuleCall_2_0(), semanticObject.getColumnName());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     EntityFeaturePathSegment returns LNestedFeature
	 *
	 * Constraint:
	 *     (feature=[LFeature|ID] tail=EntityFeaturePathSegment?)
	 */
	protected void sequence_EntityFeaturePathSegment(ISerializationContext context, LNestedFeature semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     EntityFeature returns LEntityAttribute
	 *
	 * Constraint:
	 *     (
	 *         annotationInfo=EntityFeature_LEntityAttribute_2_1_0 
	 *         (
	 *             (
	 *                 transient?='transient' 
	 *                 type=[LScalarType|TYPE_CROSS_REFERENCE] 
	 *                 constraints+=AllConstraints* 
	 *                 name=TRANSLATABLEID 
	 *                 (isGrouped?='group' groupName=TRANSLATABLEID)? 
	 *                 (properties+=KeyAndValue properties+=KeyAndValue*)?
	 *             ) | 
	 *             (
	 *                 derived?='derived' 
	 *                 domainDescription?='domainDescription'? 
	 *                 type=[LScalarType|TYPE_CROSS_REFERENCE] 
	 *                 name=TRANSLATABLEID 
	 *                 (isGrouped?='group' groupName=TRANSLATABLEID)? 
	 *                 (properties+=KeyAndValue properties+=KeyAndValue*)? 
	 *                 derivedGetterExpression=XBlockExpression
	 *             ) | 
	 *             (
	 *                 (id?='id' | uuid?='uuid' | version?='version' | domainDescription?='domainDescription' | domainKey?='domainKey')? 
	 *                 uniqueEntry?='unique'? 
	 *                 (filtering?='filter' | rangeFiltering?='range')? 
	 *                 type=[LScalarType|TYPE_CROSS_REFERENCE] 
	 *                 multiplicity=Multiplicity? 
	 *                 constraints+=AllConstraints* 
	 *                 name=TRANSLATABLEID 
	 *                 (onKanbanCard?='onKanbanCard' onKanbanCardStates=KanbanStateDetail)? 
	 *                 asKanbanState?='asKanbanState'? 
	 *                 (asKanbanOrdering?='asKanbanOrdering' decentKanbanOrder?='decentOrder'?)? 
	 *                 persistenceInfo=ColumnPersistenceInfo? 
	 *                 opposite=[LBeanReference|LFQN]? 
	 *                 (isGrouped?='group' groupName=TRANSLATABLEID)? 
	 *                 (properties+=KeyAndValue properties+=KeyAndValue*)?
	 *             )
	 *         )
	 *     )
	 */
	protected void sequence_EntityFeature(ISerializationContext context, LEntityAttribute semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     EntityFeature.LEntityReference_2_0_0 returns LEntityFeature
	 *     EntityFeature.LEntityAttribute_2_1_0 returns LEntityFeature
	 *     EntityFeature.LOperation_2_2_0 returns LEntityFeature
	 *
	 * Constraint:
	 *     annotations+=AnnotationDef*
	 */
	protected void sequence_EntityFeature_LEntityAttribute_2_1_0_LEntityReference_2_0_0_LOperation_2_2_0(ISerializationContext context, LEntityFeature semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     EntityFeature returns LEntityReference
	 *
	 * Constraint:
	 *     (
	 *         annotationInfo=EntityFeature_LEntityReference_2_0_0 
	 *         cascading?='cascade'? 
	 *         filterDepth=INT? 
	 *         type=[LEntity|TYPE_CROSS_REFERENCE] 
	 *         multiplicity=Multiplicity? 
	 *         constraints+=AllConstraints* 
	 *         name=TRANSLATABLEID 
	 *         persistenceInfo=ColumnPersistenceInfo? 
	 *         (opposite=[LEntityReference|LFQN] (asGrid?='asGrid' | asTable?='asTable')?)? 
	 *         (isGrouped?='group' groupName=TRANSLATABLEID)? 
	 *         (properties+=KeyAndValue properties+=KeyAndValue*)? 
	 *         resultFilters=ResultFilters?
	 *     )
	 */
	protected void sequence_EntityFeature(ISerializationContext context, LEntityReference semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     EntityFeature returns LOperation
	 *
	 * Constraint:
	 *     (
	 *         annotationInfo=EntityFeature_LOperation_2_2_0 
	 *         type=JvmTypeReference 
	 *         name=ValidIDWithKeywords 
	 *         (params+=FullJvmFormalParameter params+=FullJvmFormalParameter*)? 
	 *         body=XExpression
	 *     )
	 */
	protected void sequence_EntityFeature(ISerializationContext context, LOperation semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     EntityModel returns LEntityModel
	 *
	 * Constraint:
	 *     ((importSection=XImportSection packages+=TypedPackage+) | packages+=TypedPackage+)?
	 */
	protected void sequence_EntityModel(ISerializationContext context, LEntityModel semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     EntityPersistenceInfo returns LEntityPersistenceInfo
	 *
	 * Constraint:
	 *     (schemaName=ValidIDWithKeywords | tableName=ValidIDWithKeywords)*
	 */
	protected void sequence_EntityPersistenceInfo(ISerializationContext context, LEntityPersistenceInfo semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     EntitySuperIndexAttribute returns LNestedFeature
	 *
	 * Constraint:
	 *     (feature=[LFeature|ID] tail=EntityFeaturePathSegment?)
	 */
	protected void sequence_EntitySuperIndexAttribute(ISerializationContext context, LNestedFeature semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     EntitySuperIndex returns LEntitySuperIndex
	 *
	 * Constraint:
	 *     (name=TRANSLATABLEID attributes+=EntitySuperIndexAttribute*)
	 */
	protected void sequence_EntitySuperIndex(ISerializationContext context, LEntitySuperIndex semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     Index returns LIndex
	 *
	 * Constraint:
	 *     (unique?='unique'? name=ID features+=[LEntityFeature|ID] features+=[LEntityFeature|ID]*)
	 */
	protected void sequence_Index(ISerializationContext context, LIndex semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     KanbanEnumInfo returns LKanbanEnumInfo
	 *
	 * Constraint:
	 *     (literal=[LEnumLiteral|ID] i18nKey=STRING?)
	 */
	protected void sequence_KanbanEnumInfo(ISerializationContext context, LKanbanEnumInfo semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     KanbanStateDetail returns LKanbanStateDetail
	 *
	 * Constraint:
	 *     (infos+=KanbanEnumInfo infos+=KanbanEnumInfo*)?
	 */
	protected void sequence_KanbanStateDetail(ISerializationContext context, LKanbanStateDetail semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     EntityInheritanceStrategy returns LTablePerClassStrategy
	 *     TablePerClassStrategy returns LTablePerClassStrategy
	 *
	 * Constraint:
	 *     (discriminatorColumn=ValidIDWithKeywords | discriminatorType=DiscriminatorType | discriminatorValue=ValidIDWithKeywords)*
	 */
	protected void sequence_TablePerClassStrategy(ISerializationContext context, LTablePerClassStrategy semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     EntityInheritanceStrategy returns LTablePerSubclassStrategy
	 *     TablePerSubclassStrategy returns LTablePerSubclassStrategy
	 *
	 * Constraint:
	 *     (discriminatorColumn=ValidIDWithKeywords | discriminatorType=DiscriminatorType | discriminatorValue=ValidIDWithKeywords)*
	 */
	protected void sequence_TablePerSubclassStrategy(ISerializationContext context, LTablePerSubclassStrategy semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
}
