/*
 * generated by Xtext 2.12.0
 */
package com.irtsaintexupery.xtext.serializer;

import com.google.inject.Inject;
import com.irtsaintexupery.pseim.seim.BooleanProperty;
import com.irtsaintexupery.pseim.seim.Component;
import com.irtsaintexupery.pseim.seim.IntegerProperty;
import com.irtsaintexupery.pseim.seim.Link;
import com.irtsaintexupery.pseim.seim.Model;
import com.irtsaintexupery.pseim.seim.Port;
import com.irtsaintexupery.pseim.seim.ReferenceProperty;
import com.irtsaintexupery.pseim.seim.SeimPackage;
import com.irtsaintexupery.pseim.seim.StringProperty;
import com.irtsaintexupery.xtext.services.PseimGrammarAccess;
import java.util.Set;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.xtext.Action;
import org.eclipse.xtext.Parameter;
import org.eclipse.xtext.ParserRule;
import org.eclipse.xtext.serializer.ISerializationContext;
import org.eclipse.xtext.serializer.acceptor.SequenceFeeder;
import org.eclipse.xtext.serializer.sequencer.AbstractDelegatingSemanticSequencer;
import org.eclipse.xtext.serializer.sequencer.ITransientValueService.ValueTransient;

@SuppressWarnings("all")
public class PseimSemanticSequencer extends AbstractDelegatingSemanticSequencer {

	@Inject
	private PseimGrammarAccess 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 == SeimPackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case SeimPackage.BOOLEAN_PROPERTY:
				sequence_BooleanProperty(context, (BooleanProperty) semanticObject); 
				return; 
			case SeimPackage.COMPONENT:
				sequence_Component(context, (Component) semanticObject); 
				return; 
			case SeimPackage.INTEGER_PROPERTY:
				sequence_IntegerProperty(context, (IntegerProperty) semanticObject); 
				return; 
			case SeimPackage.LINK:
				sequence_Link(context, (Link) semanticObject); 
				return; 
			case SeimPackage.MODEL:
				sequence_Model(context, (Model) semanticObject); 
				return; 
			case SeimPackage.PORT:
				sequence_Port(context, (Port) semanticObject); 
				return; 
			case SeimPackage.REFERENCE_PROPERTY:
				sequence_ReferenceProperty(context, (ReferenceProperty) semanticObject); 
				return; 
			case SeimPackage.STRING_PROPERTY:
				sequence_StringProperty(context, (StringProperty) semanticObject); 
				return; 
			}
		if (errorAcceptor != null)
			errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context));
	}
	
	/**
	 * Contexts:
	 *     Property returns BooleanProperty
	 *     BooleanProperty returns BooleanProperty
	 *
	 * Constraint:
	 *     (value?='value' key=EString)
	 */
	protected void sequence_BooleanProperty(ISerializationContext context, BooleanProperty semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, SeimPackage.Literals.BOOLEAN_PROPERTY__VALUE) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SeimPackage.Literals.BOOLEAN_PROPERTY__VALUE));
			if (transientValues.isValueTransient(semanticObject, SeimPackage.Literals.PROPERTY__KEY) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SeimPackage.Literals.PROPERTY__KEY));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getBooleanPropertyAccess().getValueValueKeyword_0_0(), semanticObject.isValue());
		feeder.accept(grammarAccess.getBooleanPropertyAccess().getKeyEStringParserRuleCall_4_0(), semanticObject.getKey());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     Component returns Component
	 *     GraphElement returns Component
	 *     PropertyHolder returns Component
	 *     Element returns Component
	 *
	 * Constraint:
	 *     (name=ID (content+=Port content+=Port*)? content+=GraphElement*)
	 */
	protected void sequence_Component(ISerializationContext context, Component semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     Property returns IntegerProperty
	 *     IntegerProperty returns IntegerProperty
	 *
	 * Constraint:
	 *     (key=EString value=EInt)
	 */
	protected void sequence_IntegerProperty(ISerializationContext context, IntegerProperty semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, SeimPackage.Literals.PROPERTY__KEY) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SeimPackage.Literals.PROPERTY__KEY));
			if (transientValues.isValueTransient(semanticObject, SeimPackage.Literals.INTEGER_PROPERTY__VALUE) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SeimPackage.Literals.INTEGER_PROPERTY__VALUE));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getIntegerPropertyAccess().getKeyEStringParserRuleCall_3_0(), semanticObject.getKey());
		feeder.accept(grammarAccess.getIntegerPropertyAccess().getValueEIntParserRuleCall_5_0(), semanticObject.getValue());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     Link returns Link
	 *     GraphElement returns Link
	 *     PropertyHolder returns Link
	 *     Element returns Link
	 *
	 * Constraint:
	 *     (src=[Port|QualifiedID] dst=[Port|QualifiedID])
	 */
	protected void sequence_Link(ISerializationContext context, Link semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, SeimPackage.Literals.LINK__SRC) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SeimPackage.Literals.LINK__SRC));
			if (transientValues.isValueTransient(semanticObject, SeimPackage.Literals.LINK__DST) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SeimPackage.Literals.LINK__DST));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getLinkAccess().getSrcPortQualifiedIDParserRuleCall_0_0_1(), semanticObject.eGet(SeimPackage.Literals.LINK__SRC, false));
		feeder.accept(grammarAccess.getLinkAccess().getDstPortQualifiedIDParserRuleCall_2_0_1(), semanticObject.eGet(SeimPackage.Literals.LINK__DST, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     Model returns Model
	 *     PropertyHolder returns Model
	 *
	 * Constraint:
	 *     (name=EString modelElements+=GraphElement*)
	 */
	protected void sequence_Model(ISerializationContext context, Model semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     Port returns Port
	 *     PropertyHolder returns Port
	 *     Element returns Port
	 *
	 * Constraint:
	 *     (direction=PortDirection name=ID)
	 */
	protected void sequence_Port(ISerializationContext context, Port semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, SeimPackage.Literals.PORT__DIRECTION) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SeimPackage.Literals.PORT__DIRECTION));
			if (transientValues.isValueTransient(semanticObject, SeimPackage.Literals.NAMED_ELEMENT__NAME) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SeimPackage.Literals.NAMED_ELEMENT__NAME));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getPortAccess().getDirectionPortDirectionEnumRuleCall_0_0(), semanticObject.getDirection());
		feeder.accept(grammarAccess.getPortAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     Property returns ReferenceProperty
	 *     ReferenceProperty returns ReferenceProperty
	 *
	 * Constraint:
	 *     (key=EString ref=[PropertyHolder|EString])
	 */
	protected void sequence_ReferenceProperty(ISerializationContext context, ReferenceProperty semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, SeimPackage.Literals.PROPERTY__KEY) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SeimPackage.Literals.PROPERTY__KEY));
			if (transientValues.isValueTransient(semanticObject, SeimPackage.Literals.REFERENCE_PROPERTY__REF) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SeimPackage.Literals.REFERENCE_PROPERTY__REF));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getReferencePropertyAccess().getKeyEStringParserRuleCall_3_0(), semanticObject.getKey());
		feeder.accept(grammarAccess.getReferencePropertyAccess().getRefPropertyHolderEStringParserRuleCall_5_0_1(), semanticObject.eGet(SeimPackage.Literals.REFERENCE_PROPERTY__REF, false));
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     Property returns StringProperty
	 *     StringProperty returns StringProperty
	 *
	 * Constraint:
	 *     (key=EString value=EString)
	 */
	protected void sequence_StringProperty(ISerializationContext context, StringProperty semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, SeimPackage.Literals.PROPERTY__KEY) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SeimPackage.Literals.PROPERTY__KEY));
			if (transientValues.isValueTransient(semanticObject, SeimPackage.Literals.STRING_PROPERTY__VALUE) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, SeimPackage.Literals.STRING_PROPERTY__VALUE));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getStringPropertyAccess().getKeyEStringParserRuleCall_3_0(), semanticObject.getKey());
		feeder.accept(grammarAccess.getStringPropertyAccess().getValueEStringParserRuleCall_5_0(), semanticObject.getValue());
		feeder.finish();
	}
	
	
}
