/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  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:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * generated by Xtext 2.11.0
 *
 */

package org.eclipse.osbp.xtext.perspective.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.xtext.oxtype.oxtype.OXImportDeclaration;
import org.eclipse.osbp.xtext.oxtype.oxtype.OXtypePackage;
import org.eclipse.osbp.xtext.oxtype.serializer.OXtypeSemanticSequencer;
import org.eclipse.osbp.xtext.perspective.Perspective;
import org.eclipse.osbp.xtext.perspective.PerspectiveBPMN;
import org.eclipse.osbp.xtext.perspective.PerspectiveChart;
import org.eclipse.osbp.xtext.perspective.PerspectiveDashboard;
import org.eclipse.osbp.xtext.perspective.PerspectiveDataInterchange;
import org.eclipse.osbp.xtext.perspective.PerspectiveDialog;
import org.eclipse.osbp.xtext.perspective.PerspectiveDslPackage;
import org.eclipse.osbp.xtext.perspective.PerspectiveGrid;
import org.eclipse.osbp.xtext.perspective.PerspectiveKanban;
import org.eclipse.osbp.xtext.perspective.PerspectiveModel;
import org.eclipse.osbp.xtext.perspective.PerspectiveOrganization;
import org.eclipse.osbp.xtext.perspective.PerspectivePackage;
import org.eclipse.osbp.xtext.perspective.PerspectivePart;
import org.eclipse.osbp.xtext.perspective.PerspectivePartStack;
import org.eclipse.osbp.xtext.perspective.PerspectiveReport;
import org.eclipse.osbp.xtext.perspective.PerspectiveSashContainer;
import org.eclipse.osbp.xtext.perspective.PerspectiveSearch;
import org.eclipse.osbp.xtext.perspective.PerspectiveSelection;
import org.eclipse.osbp.xtext.perspective.PerspectiveTable;
import org.eclipse.osbp.xtext.perspective.PerspectiveTitle;
import org.eclipse.osbp.xtext.perspective.PerspectiveTopology;
import org.eclipse.osbp.xtext.perspective.PerspectiveWelcome;
import org.eclipse.osbp.xtext.perspective.services.PerspectiveDslGrammarAccess;
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 PerspectiveDslSemanticSequencer extends OXtypeSemanticSequencer {

	@Inject
	private PerspectiveDslGrammarAccess 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 == OXtypePackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case OXtypePackage.OX_IMPORT_DECLARATION:
				sequence_XImportDeclaration(context, (OXImportDeclaration) semanticObject); 
				return; 
			}
		else if (epackage == PerspectiveDslPackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case PerspectiveDslPackage.PERSPECTIVE:
				sequence_Perspective(context, (Perspective) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_BPMN:
				sequence_PerspectiveBPMN(context, (PerspectiveBPMN) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_CHART:
				sequence_PerspectiveChart(context, (PerspectiveChart) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_DASHBOARD:
				sequence_PerspectiveDashboard(context, (PerspectiveDashboard) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_DATA_INTERCHANGE:
				sequence_PerspectiveDataInterchange(context, (PerspectiveDataInterchange) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_DIALOG:
				sequence_PerspectiveDialog(context, (PerspectiveDialog) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_GRID:
				sequence_PerspectiveGrid(context, (PerspectiveGrid) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_KANBAN:
				sequence_PerspectiveKanban(context, (PerspectiveKanban) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_MODEL:
				sequence_PerspectiveModel(context, (PerspectiveModel) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_ORGANIZATION:
				sequence_PerspectiveOrganization(context, (PerspectiveOrganization) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_PACKAGE:
				sequence_PerspectivePackage(context, (PerspectivePackage) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_PART:
				sequence_PerspectivePart(context, (PerspectivePart) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_PART_STACK:
				sequence_PerspectivePartStack(context, (PerspectivePartStack) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_REPORT:
				sequence_PerspectiveReport(context, (PerspectiveReport) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_SASH_CONTAINER:
				sequence_PerspectiveSashContainer(context, (PerspectiveSashContainer) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_SEARCH:
				sequence_PerspectiveSearch(context, (PerspectiveSearch) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_SELECTION:
				sequence_PerspectiveSelection(context, (PerspectiveSelection) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_TABLE:
				sequence_PerspectiveTable(context, (PerspectiveTable) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_TITLE:
				sequence_PerspectiveTitle(context, (PerspectiveTitle) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_TOPOLOGY:
				sequence_PerspectiveTopology(context, (PerspectiveTopology) semanticObject); 
				return; 
			case PerspectiveDslPackage.PERSPECTIVE_WELCOME:
				sequence_PerspectiveWelcome(context, (PerspectiveWelcome) 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:
	 *     PerspectiveView returns PerspectiveBPMN
	 *     PerspectiveBPMN returns PerspectiveBPMN
	 *
	 * Constraint:
	 *     {PerspectiveBPMN}
	 */
	protected void sequence_PerspectiveBPMN(ISerializationContext context, PerspectiveBPMN semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveChart
	 *     PerspectiveChart returns PerspectiveChart
	 *
	 * Constraint:
	 *     ref=[Chart|ID]
	 */
	protected void sequence_PerspectiveChart(ISerializationContext context, PerspectiveChart semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_CHART__REF) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_CHART__REF));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getPerspectiveChartAccess().getRefChartIDTerminalRuleCall_2_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_CHART__REF, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveDashboard
	 *     PerspectiveDashboard returns PerspectiveDashboard
	 *
	 * Constraint:
	 *     name=STRING
	 */
	protected void sequence_PerspectiveDashboard(ISerializationContext context, PerspectiveDashboard semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_DASHBOARD__NAME) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_DASHBOARD__NAME));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getPerspectiveDashboardAccess().getNameSTRINGTerminalRuleCall_2_0(), semanticObject.getName());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveDataInterchange
	 *     PerspectiveDataInterchange returns PerspectiveDataInterchange
	 *
	 * Constraint:
	 *     ref=[DataInterchangeGroup|ID]
	 */
	protected void sequence_PerspectiveDataInterchange(ISerializationContext context, PerspectiveDataInterchange semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_DATA_INTERCHANGE__REF) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_DATA_INTERCHANGE__REF));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangeGroupIDTerminalRuleCall_2_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_DATA_INTERCHANGE__REF, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveDialog
	 *     PerspectiveDialog returns PerspectiveDialog
	 *
	 * Constraint:
	 *     ref=[Dialog|ID]
	 */
	protected void sequence_PerspectiveDialog(ISerializationContext context, PerspectiveDialog semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_DIALOG__REF) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_DIALOG__REF));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getPerspectiveDialogAccess().getRefDialogIDTerminalRuleCall_2_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_DIALOG__REF, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveGrid
	 *     PerspectiveGrid returns PerspectiveGrid
	 *
	 * Constraint:
	 *     ref=[Table|ID]
	 */
	protected void sequence_PerspectiveGrid(ISerializationContext context, PerspectiveGrid semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_GRID__REF) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_GRID__REF));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getPerspectiveGridAccess().getRefTableIDTerminalRuleCall_2_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_GRID__REF, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveKanban
	 *     PerspectiveKanban returns PerspectiveKanban
	 *
	 * Constraint:
	 *     (dtoRef=[LDto|ID] cardRef=[Dialog|ID] dialogRef=[Dialog|ID])
	 */
	protected void sequence_PerspectiveKanban(ISerializationContext context, PerspectiveKanban semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_KANBAN__DTO_REF) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_KANBAN__DTO_REF));
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_KANBAN__CARD_REF) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_KANBAN__CARD_REF));
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_KANBAN__DIALOG_REF) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_KANBAN__DIALOG_REF));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getPerspectiveKanbanAccess().getDtoRefLDtoIDTerminalRuleCall_3_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_KANBAN__DTO_REF, false));
		feeder.accept(grammarAccess.getPerspectiveKanbanAccess().getCardRefDialogIDTerminalRuleCall_5_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_KANBAN__CARD_REF, false));
		feeder.accept(grammarAccess.getPerspectiveKanbanAccess().getDialogRefDialogIDTerminalRuleCall_7_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_KANBAN__DIALOG_REF, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveModel returns PerspectiveModel
	 *
	 * Constraint:
	 *     ((importSection=XImportSection packages+=PerspectivePackage+) | packages+=PerspectivePackage+)?
	 */
	protected void sequence_PerspectiveModel(ISerializationContext context, PerspectiveModel semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveOrganization
	 *     PerspectiveOrganization returns PerspectiveOrganization
	 *
	 * Constraint:
	 *     ref=[Organization|ID]
	 */
	protected void sequence_PerspectiveOrganization(ISerializationContext context, PerspectiveOrganization semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_ORGANIZATION__REF) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_ORGANIZATION__REF));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getPerspectiveOrganizationAccess().getRefOrganizationIDTerminalRuleCall_2_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_ORGANIZATION__REF, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     PerspectivePackage returns PerspectivePackage
	 *
	 * Constraint:
	 *     (name=QualifiedName perspectives+=Perspective*)
	 */
	protected void sequence_PerspectivePackage(ISerializationContext context, PerspectivePackage semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveElement returns PerspectivePartStack
	 *     PerspectivePartStack returns PerspectivePartStack
	 *
	 * Constraint:
	 *     (elementId=ID (selectedElement=[PerspectivePart|ID] | containerData=STRING | accessibilityPhrase=STRING)* elements+=PerspectiveElement*)
	 */
	protected void sequence_PerspectivePartStack(ISerializationContext context, PerspectivePartStack semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveElement returns PerspectivePart
	 *     PerspectivePart returns PerspectivePart
	 *
	 * Constraint:
	 *     (
	 *         elementId=TRANSLATABLEID 
	 *         (containerData=STRING | accessibilityPhrase=STRING | iconURI=STRING | view=PerspectiveView | isClosable?='isClosable')*
	 *     )
	 */
	protected void sequence_PerspectivePart(ISerializationContext context, PerspectivePart semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveReport
	 *     PerspectiveReport returns PerspectiveReport
	 *
	 * Constraint:
	 *     ref=[Report|ID]
	 */
	protected void sequence_PerspectiveReport(ISerializationContext context, PerspectiveReport semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_REPORT__REF) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_REPORT__REF));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getPerspectiveReportAccess().getRefReportIDTerminalRuleCall_2_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_REPORT__REF, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveElement returns PerspectiveSashContainer
	 *     PerspectiveSashContainer returns PerspectiveSashContainer
	 *
	 * Constraint:
	 *     (
	 *         elementId=ID 
	 *         (orientation=SashOrientation | selectedElement=[PerspectiveElement|ID] | containerData=STRING | accessibilityPhrase=STRING)* 
	 *         elements+=PerspectiveElement*
	 *     )
	 */
	protected void sequence_PerspectiveSashContainer(ISerializationContext context, PerspectiveSashContainer semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveSearch
	 *     PerspectiveSearch returns PerspectiveSearch
	 *
	 * Constraint:
	 *     (dtoRef=[LDto|ID] (depth=INT | filterCols=INT)*)
	 */
	protected void sequence_PerspectiveSearch(ISerializationContext context, PerspectiveSearch semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveSelection
	 *     PerspectiveSelection returns PerspectiveSelection
	 *
	 * Constraint:
	 *     ref=[Table|ID]
	 */
	protected void sequence_PerspectiveSelection(ISerializationContext context, PerspectiveSelection semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_SELECTION__REF) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_SELECTION__REF));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getPerspectiveSelectionAccess().getRefTableIDTerminalRuleCall_2_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_SELECTION__REF, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveTable
	 *     PerspectiveTable returns PerspectiveTable
	 *
	 * Constraint:
	 *     ref=[Table|ID]
	 */
	protected void sequence_PerspectiveTable(ISerializationContext context, PerspectiveTable semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_TABLE__REF) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_TABLE__REF));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getPerspectiveTableAccess().getRefTableIDTerminalRuleCall_2_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_TABLE__REF, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveTitle
	 *     PerspectiveTitle returns PerspectiveTitle
	 *
	 * Constraint:
	 *     htmlName=STRING
	 */
	protected void sequence_PerspectiveTitle(ISerializationContext context, PerspectiveTitle semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_TITLE__HTML_NAME) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_TITLE__HTML_NAME));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getPerspectiveTitleAccess().getHtmlNameSTRINGTerminalRuleCall_2_0(), semanticObject.getHtmlName());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveTopology
	 *     PerspectiveTopology returns PerspectiveTopology
	 *
	 * Constraint:
	 *     ref=[Topology|ID]
	 */
	protected void sequence_PerspectiveTopology(ISerializationContext context, PerspectiveTopology semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_TOPOLOGY__REF) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_TOPOLOGY__REF));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getPerspectiveTopologyAccess().getRefTopologyIDTerminalRuleCall_2_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_TOPOLOGY__REF, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     PerspectiveView returns PerspectiveWelcome
	 *     PerspectiveWelcome returns PerspectiveWelcome
	 *
	 * Constraint:
	 *     {PerspectiveWelcome}
	 */
	protected void sequence_PerspectiveWelcome(ISerializationContext context, PerspectiveWelcome semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     Perspective returns Perspective
	 *
	 * Constraint:
	 *     (
	 *         name=TRANSLATABLEID 
	 *         (description?='describedBy' descriptionValue=TRANSLATABLESTRING)? 
	 *         (process=[Blip|ID] userTask=[BlipUserTask|ID])? 
	 *         (iconURI=STRING | accessibilityPhrase=STRING | toolbar=[ActionToolbar|ID])* 
	 *         elements+=PerspectiveElement*
	 *     )
	 */
	protected void sequence_Perspective(ISerializationContext context, Perspective semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
}
