/*******************************************************************************
 * Copyright (c) 2018 Willink Transformations and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Adolfo Sanchez-Barbudo Herrera - initial API and implementation
 *******************************************************************************/
/*
 * generated by Xtext 2.10.0
 */
package org.eclipse.qvtd.doc.ide.contentassist.antlr;

import com.google.inject.Inject;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.antlr.runtime.RecognitionException;
import org.eclipse.qvtd.doc.ide.contentassist.antlr.internal.InternalMiniOCLCSParser;
import org.eclipse.qvtd.doc.services.MiniOCLCSGrammarAccess;
import org.eclipse.xtext.AbstractElement;
import org.eclipse.xtext.ide.editor.contentassist.antlr.AbstractContentAssistParser;
import org.eclipse.xtext.ide.editor.contentassist.antlr.FollowElement;
import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;

public class MiniOCLCSParser extends AbstractContentAssistParser {

	@Inject
	private MiniOCLCSGrammarAccess grammarAccess;

	private Map<AbstractElement, String> nameMappings;

	@Override
	protected InternalMiniOCLCSParser createParser() {
		InternalMiniOCLCSParser result = new InternalMiniOCLCSParser(null);
		result.setGrammarAccess(grammarAccess);
		return result;
	}

	@Override
	protected String getRuleName(AbstractElement element) {
		if (nameMappings == null) {
			nameMappings = new HashMap<AbstractElement, String>() {
				private static final long serialVersionUID = 1L;
				{
					put(grammarAccess.getRootCSAccess().getAlternatives_1(), "rule__RootCS__Alternatives_1");
					put(grammarAccess.getPackageCSAccess().getAlternatives_3(), "rule__PackageCS__Alternatives_3");
					put(grammarAccess.getClassCSAccess().getAlternatives_4(), "rule__ClassCS__Alternatives_4");
					put(grammarAccess.getMultiplicityCSAccess().getAlternatives_1(), "rule__MultiplicityCS__Alternatives_1");
					put(grammarAccess.getMultiplicityCSAccess().getAlternatives_1_3_2(), "rule__MultiplicityCS__Alternatives_1_3_2");
					put(grammarAccess.getEqualityExpCSAccess().getOpNameAlternatives_1_1_0(), "rule__EqualityExpCS__OpNameAlternatives_1_1_0");
					put(grammarAccess.getCallExpCSAccess().getOpNameAlternatives_1_1_0(), "rule__CallExpCS__OpNameAlternatives_1_1_0");
					put(grammarAccess.getPrimaryExpCSAccess().getAlternatives(), "rule__PrimaryExpCS__Alternatives");
					put(grammarAccess.getNavigationExpCSAccess().getAlternatives(), "rule__NavigationExpCS__Alternatives");
					put(grammarAccess.getLoopExpCSAccess().getAlternatives(), "rule__LoopExpCS__Alternatives");
					put(grammarAccess.getLiteralExpCSAccess().getAlternatives(), "rule__LiteralExpCS__Alternatives");
					put(grammarAccess.getBooleanLiteralExpCSAccess().getAlternatives_1(), "rule__BooleanLiteralExpCS__Alternatives_1");
					put(grammarAccess.getRootCSAccess().getGroup(), "rule__RootCS__Group__0");
					put(grammarAccess.getImportCSAccess().getGroup(), "rule__ImportCS__Group__0");
					put(grammarAccess.getImportCSAccess().getGroup_1(), "rule__ImportCS__Group_1__0");
					put(grammarAccess.getPackageCSAccess().getGroup(), "rule__PackageCS__Group__0");
					put(grammarAccess.getClassCSAccess().getGroup(), "rule__ClassCS__Group__0");
					put(grammarAccess.getClassCSAccess().getGroup_2(), "rule__ClassCS__Group_2__0");
					put(grammarAccess.getPropertyCSAccess().getGroup(), "rule__PropertyCS__Group__0");
					put(grammarAccess.getMultiplicityCSAccess().getGroup(), "rule__MultiplicityCS__Group__0");
					put(grammarAccess.getMultiplicityCSAccess().getGroup_1_3(), "rule__MultiplicityCS__Group_1_3__0");
					put(grammarAccess.getOperationCSAccess().getGroup(), "rule__OperationCS__Group__0");
					put(grammarAccess.getOperationCSAccess().getGroup_3(), "rule__OperationCS__Group_3__0");
					put(grammarAccess.getOperationCSAccess().getGroup_3_1(), "rule__OperationCS__Group_3_1__0");
					put(grammarAccess.getParameterCSAccess().getGroup(), "rule__ParameterCS__Group__0");
					put(grammarAccess.getConstraintsDefCSAccess().getGroup(), "rule__ConstraintsDefCS__Group__0");
					put(grammarAccess.getInvariantCSAccess().getGroup(), "rule__InvariantCS__Group__0");
					put(grammarAccess.getEqualityExpCSAccess().getGroup(), "rule__EqualityExpCS__Group__0");
					put(grammarAccess.getEqualityExpCSAccess().getGroup_1(), "rule__EqualityExpCS__Group_1__0");
					put(grammarAccess.getCallExpCSAccess().getGroup(), "rule__CallExpCS__Group__0");
					put(grammarAccess.getCallExpCSAccess().getGroup_1(), "rule__CallExpCS__Group_1__0");
					put(grammarAccess.getSelfExpCSAccess().getGroup(), "rule__SelfExpCS__Group__0");
					put(grammarAccess.getCollectExpCSAccess().getGroup(), "rule__CollectExpCS__Group__0");
					put(grammarAccess.getCollectExpCSAccess().getGroup_2(), "rule__CollectExpCS__Group_2__0");
					put(grammarAccess.getIteratorVarCSAccess().getGroup(), "rule__IteratorVarCS__Group__0");
					put(grammarAccess.getIteratorVarCSAccess().getGroup_1(), "rule__IteratorVarCS__Group_1__0");
					put(grammarAccess.getIterateExpCSAccess().getGroup(), "rule__IterateExpCS__Group__0");
					put(grammarAccess.getAccVarCSAccess().getGroup(), "rule__AccVarCS__Group__0");
					put(grammarAccess.getAccVarCSAccess().getGroup_1(), "rule__AccVarCS__Group_1__0");
					put(grammarAccess.getNameExpCSAccess().getGroup(), "rule__NameExpCS__Group__0");
					put(grammarAccess.getRoundedBracketClauseCSAccess().getGroup(), "rule__RoundedBracketClauseCS__Group__0");
					put(grammarAccess.getRoundedBracketClauseCSAccess().getGroup_2(), "rule__RoundedBracketClauseCS__Group_2__0");
					put(grammarAccess.getRoundedBracketClauseCSAccess().getGroup_2_1(), "rule__RoundedBracketClauseCS__Group_2_1__0");
					put(grammarAccess.getBooleanLiteralExpCSAccess().getGroup(), "rule__BooleanLiteralExpCS__Group__0");
					put(grammarAccess.getNullLiteralExpCSAccess().getGroup(), "rule__NullLiteralExpCS__Group__0");
					put(grammarAccess.getCollectionLiteralExpCSAccess().getGroup(), "rule__CollectionLiteralExpCS__Group__0");
					put(grammarAccess.getCollectionLiteralPartCSAccess().getGroup(), "rule__CollectionLiteralPartCS__Group__0");
					put(grammarAccess.getCollectionLiteralPartCSAccess().getGroup_1(), "rule__CollectionLiteralPartCS__Group_1__0");
					put(grammarAccess.getLetExpCSAccess().getGroup(), "rule__LetExpCS__Group__0");
					put(grammarAccess.getLetExpCSAccess().getGroup_2(), "rule__LetExpCS__Group_2__0");
					put(grammarAccess.getLetVarCSAccess().getGroup(), "rule__LetVarCS__Group__0");
					put(grammarAccess.getLetVarCSAccess().getGroup_1(), "rule__LetVarCS__Group_1__0");
					put(grammarAccess.getPathNameCSAccess().getGroup(), "rule__PathNameCS__Group__0");
					put(grammarAccess.getPathNameCSAccess().getGroup_1(), "rule__PathNameCS__Group_1__0");
					put(grammarAccess.getRootCSAccess().getImportsAssignment_0(), "rule__RootCS__ImportsAssignment_0");
					put(grammarAccess.getRootCSAccess().getPackagesAssignment_1_0(), "rule__RootCS__PackagesAssignment_1_0");
					put(grammarAccess.getRootCSAccess().getConstraintsAssignment_1_1(), "rule__RootCS__ConstraintsAssignment_1_1");
					put(grammarAccess.getImportCSAccess().getAliasAssignment_1_0(), "rule__ImportCS__AliasAssignment_1_0");
					put(grammarAccess.getImportCSAccess().getUriAssignment_2(), "rule__ImportCS__UriAssignment_2");
					put(grammarAccess.getPackageCSAccess().getNameAssignment_1(), "rule__PackageCS__NameAssignment_1");
					put(grammarAccess.getPackageCSAccess().getPackagesAssignment_3_0(), "rule__PackageCS__PackagesAssignment_3_0");
					put(grammarAccess.getPackageCSAccess().getClassesAssignment_3_1(), "rule__PackageCS__ClassesAssignment_3_1");
					put(grammarAccess.getClassCSAccess().getNameAssignment_1(), "rule__ClassCS__NameAssignment_1");
					put(grammarAccess.getClassCSAccess().getExtendsAssignment_2_1(), "rule__ClassCS__ExtendsAssignment_2_1");
					put(grammarAccess.getClassCSAccess().getPropertiesAssignment_4_0(), "rule__ClassCS__PropertiesAssignment_4_0");
					put(grammarAccess.getClassCSAccess().getOperationsAssignment_4_1(), "rule__ClassCS__OperationsAssignment_4_1");
					put(grammarAccess.getPropertyCSAccess().getNameAssignment_1(), "rule__PropertyCS__NameAssignment_1");
					put(grammarAccess.getPropertyCSAccess().getTypeRefAssignment_3(), "rule__PropertyCS__TypeRefAssignment_3");
					put(grammarAccess.getPropertyCSAccess().getMultiplicityAssignment_4(), "rule__PropertyCS__MultiplicityAssignment_4");
					put(grammarAccess.getMultiplicityCSAccess().getOptAssignment_1_0(), "rule__MultiplicityCS__OptAssignment_1_0");
					put(grammarAccess.getMultiplicityCSAccess().getMultAssignment_1_1(), "rule__MultiplicityCS__MultAssignment_1_1");
					put(grammarAccess.getMultiplicityCSAccess().getMandatoryAssignment_1_2(), "rule__MultiplicityCS__MandatoryAssignment_1_2");
					put(grammarAccess.getMultiplicityCSAccess().getLowerIntAssignment_1_3_0(), "rule__MultiplicityCS__LowerIntAssignment_1_3_0");
					put(grammarAccess.getMultiplicityCSAccess().getUpperIntAssignment_1_3_2_0(), "rule__MultiplicityCS__UpperIntAssignment_1_3_2_0");
					put(grammarAccess.getMultiplicityCSAccess().getUpperMultAssignment_1_3_2_1(), "rule__MultiplicityCS__UpperMultAssignment_1_3_2_1");
					put(grammarAccess.getOperationCSAccess().getNameAssignment_1(), "rule__OperationCS__NameAssignment_1");
					put(grammarAccess.getOperationCSAccess().getParamsAssignment_3_0(), "rule__OperationCS__ParamsAssignment_3_0");
					put(grammarAccess.getOperationCSAccess().getParamsAssignment_3_1_1(), "rule__OperationCS__ParamsAssignment_3_1_1");
					put(grammarAccess.getOperationCSAccess().getResultRefAssignment_6(), "rule__OperationCS__ResultRefAssignment_6");
					put(grammarAccess.getOperationCSAccess().getBodyAssignment_8(), "rule__OperationCS__BodyAssignment_8");
					put(grammarAccess.getParameterCSAccess().getNameAssignment_0(), "rule__ParameterCS__NameAssignment_0");
					put(grammarAccess.getParameterCSAccess().getTypeRefAssignment_2(), "rule__ParameterCS__TypeRefAssignment_2");
					put(grammarAccess.getConstraintsDefCSAccess().getTypeRefAssignment_1(), "rule__ConstraintsDefCS__TypeRefAssignment_1");
					put(grammarAccess.getConstraintsDefCSAccess().getInvariantsAssignment_3(), "rule__ConstraintsDefCS__InvariantsAssignment_3");
					put(grammarAccess.getInvariantCSAccess().getExpAssignment_2(), "rule__InvariantCS__ExpAssignment_2");
					put(grammarAccess.getEqualityExpCSAccess().getOpNameAssignment_1_1(), "rule__EqualityExpCS__OpNameAssignment_1_1");
					put(grammarAccess.getEqualityExpCSAccess().getRightAssignment_1_2(), "rule__EqualityExpCS__RightAssignment_1_2");
					put(grammarAccess.getCallExpCSAccess().getOpNameAssignment_1_1(), "rule__CallExpCS__OpNameAssignment_1_1");
					put(grammarAccess.getCallExpCSAccess().getNavExpAssignment_1_2(), "rule__CallExpCS__NavExpAssignment_1_2");
					put(grammarAccess.getCollectExpCSAccess().getItVarAssignment_2_0(), "rule__CollectExpCS__ItVarAssignment_2_0");
					put(grammarAccess.getCollectExpCSAccess().getExpAssignment_3(), "rule__CollectExpCS__ExpAssignment_3");
					put(grammarAccess.getIteratorVarCSAccess().getItNameAssignment_0(), "rule__IteratorVarCS__ItNameAssignment_0");
					put(grammarAccess.getIteratorVarCSAccess().getItTypeAssignment_1_1(), "rule__IteratorVarCS__ItTypeAssignment_1_1");
					put(grammarAccess.getIterateExpCSAccess().getItVarAssignment_2(), "rule__IterateExpCS__ItVarAssignment_2");
					put(grammarAccess.getIterateExpCSAccess().getAccVarAssignment_4(), "rule__IterateExpCS__AccVarAssignment_4");
					put(grammarAccess.getIterateExpCSAccess().getExpAssignment_6(), "rule__IterateExpCS__ExpAssignment_6");
					put(grammarAccess.getAccVarCSAccess().getAccNameAssignment_0(), "rule__AccVarCS__AccNameAssignment_0");
					put(grammarAccess.getAccVarCSAccess().getAccTypeAssignment_1_1(), "rule__AccVarCS__AccTypeAssignment_1_1");
					put(grammarAccess.getAccVarCSAccess().getAccInitExpAssignment_3(), "rule__AccVarCS__AccInitExpAssignment_3");
					put(grammarAccess.getNameExpCSAccess().getExpNameAssignment_0(), "rule__NameExpCS__ExpNameAssignment_0");
					put(grammarAccess.getNameExpCSAccess().getRoundedBracketsAssignment_1(), "rule__NameExpCS__RoundedBracketsAssignment_1");
					put(grammarAccess.getRoundedBracketClauseCSAccess().getArgsAssignment_2_0(), "rule__RoundedBracketClauseCS__ArgsAssignment_2_0");
					put(grammarAccess.getRoundedBracketClauseCSAccess().getArgsAssignment_2_1_1(), "rule__RoundedBracketClauseCS__ArgsAssignment_2_1_1");
					put(grammarAccess.getIntLiteralExpCSAccess().getIntSymbolAssignment(), "rule__IntLiteralExpCS__IntSymbolAssignment");
					put(grammarAccess.getBooleanLiteralExpCSAccess().getBoolSymbolAssignment_1_0(), "rule__BooleanLiteralExpCS__BoolSymbolAssignment_1_0");
					put(grammarAccess.getCollectionLiteralExpCSAccess().getKindAssignment_0(), "rule__CollectionLiteralExpCS__KindAssignment_0");
					put(grammarAccess.getCollectionLiteralExpCSAccess().getPartsAssignment_2(), "rule__CollectionLiteralExpCS__PartsAssignment_2");
					put(grammarAccess.getCollectionLiteralPartCSAccess().getFirstAssignment_0(), "rule__CollectionLiteralPartCS__FirstAssignment_0");
					put(grammarAccess.getCollectionLiteralPartCSAccess().getLastAssignment_1_1(), "rule__CollectionLiteralPartCS__LastAssignment_1_1");
					put(grammarAccess.getLetExpCSAccess().getLetVarsAssignment_1(), "rule__LetExpCS__LetVarsAssignment_1");
					put(grammarAccess.getLetExpCSAccess().getLetVarsAssignment_2_1(), "rule__LetExpCS__LetVarsAssignment_2_1");
					put(grammarAccess.getLetExpCSAccess().getInExpAssignment_4(), "rule__LetExpCS__InExpAssignment_4");
					put(grammarAccess.getLetVarCSAccess().getNameAssignment_0(), "rule__LetVarCS__NameAssignment_0");
					put(grammarAccess.getLetVarCSAccess().getTypeRefAssignment_1_1(), "rule__LetVarCS__TypeRefAssignment_1_1");
					put(grammarAccess.getLetVarCSAccess().getInitExpAssignment_3(), "rule__LetVarCS__InitExpAssignment_3");
					put(grammarAccess.getPathNameCSAccess().getPathElementsAssignment_0(), "rule__PathNameCS__PathElementsAssignment_0");
					put(grammarAccess.getPathNameCSAccess().getPathElementsAssignment_1_1(), "rule__PathNameCS__PathElementsAssignment_1_1");
					put(grammarAccess.getPathElementCSAccess().getElementNameAssignment(), "rule__PathElementCS__ElementNameAssignment");
				}
			};
		}
		return nameMappings.get(element);
	}

	@Override
	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
		try {
			InternalMiniOCLCSParser typedParser = (InternalMiniOCLCSParser) parser;
			typedParser.entryRuleRootCS();
			return typedParser.getFollowElements();
		} catch(RecognitionException ex) {
			throw new RuntimeException(ex);
		}
	}

	@Override
	protected String[] getInitialHiddenTokens() {
		return new String[] { "RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT" };
	}

	public MiniOCLCSGrammarAccess getGrammarAccess() {
		return this.grammarAccess;
	}

	public void setGrammarAccess(MiniOCLCSGrammarAccess grammarAccess) {
		this.grammarAccess = grammarAccess;
	}
}
