/*
 * generated by Xtext
 */
package org.eclipse.handly.examples.basic.ide.contentassist.antlr;

import com.google.inject.Inject;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.handly.examples.basic.ide.contentassist.antlr.internal.InternalFooParser;
import org.eclipse.handly.examples.basic.services.FooGrammarAccess;
import org.eclipse.xtext.AbstractElement;
import org.eclipse.xtext.ide.editor.contentassist.antlr.AbstractContentAssistParser;

public class FooParser extends AbstractContentAssistParser {

	@Inject
	private FooGrammarAccess grammarAccess;

	private Map<AbstractElement, String> nameMappings;

	@Override
	protected InternalFooParser createParser() {
		InternalFooParser result = new InternalFooParser(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.getUnitAccess().getGroup(), "rule__Unit__Group__0");
					put(grammarAccess.getVarAccess().getGroup(), "rule__Var__Group__0");
					put(grammarAccess.getDefAccess().getGroup(), "rule__Def__Group__0");
					put(grammarAccess.getDefAccess().getGroup_4(), "rule__Def__Group_4__0");
					put(grammarAccess.getUnitAccess().getVarsAssignment_0(), "rule__Unit__VarsAssignment_0");
					put(grammarAccess.getUnitAccess().getDefsAssignment_1(), "rule__Unit__DefsAssignment_1");
					put(grammarAccess.getVarAccess().getNameAssignment_1(), "rule__Var__NameAssignment_1");
					put(grammarAccess.getDefAccess().getNameAssignment_1(), "rule__Def__NameAssignment_1");
					put(grammarAccess.getDefAccess().getParamsAssignment_3(), "rule__Def__ParamsAssignment_3");
					put(grammarAccess.getDefAccess().getParamsAssignment_4_1(), "rule__Def__ParamsAssignment_4_1");
				}
			};
		}
		return nameMappings.get(element);
	}
			
	@Override
	protected String[] getInitialHiddenTokens() {
		return new String[] { "RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT" };
	}

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

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