package org.jetbrains.plugins.cucumber.psi; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.cucumber.psi.i18n.JsonGherkinKeywordProvider; import org.jetbrains.plugins.cucumber.psi.impl.GherkinFileImpl; import java.util.*; /** * @author Roman.Chernyatchik */ public class GherkinKeywordTable { private Map<IElementType, Collection<String>> myType2KeywordsTable = new HashMap<>(); public GherkinKeywordTable() { for (IElementType type : GherkinTokenTypes.KEYWORDS.getTypes()) { myType2KeywordsTable.put(type, new ArrayList<>()); } } public void putAllKeywordsInto(Map<String, IElementType> target) { for (IElementType type : this.getTypes()) { final Collection<String> keywords = this.getKeywords(type); if (keywords != null) { for (String keyword : keywords) { target.put(keyword, type); } } } } public void put(IElementType type, String keyword) { if (GherkinTokenTypes.KEYWORDS.contains(type)) { Collection<String> keywords = getKeywords(type); if (keywords == null) { keywords = new ArrayList<>(1); myType2KeywordsTable.put(type, keywords); } keywords.add(keyword); } } public Collection<String> getStepKeywords() { final Collection<String> keywords = getKeywords(GherkinTokenTypes.STEP_KEYWORD); assert keywords != null; return keywords; } public Collection<String> getScenarioKeywords() { return getKeywords(GherkinTokenTypes.SCENARIO_KEYWORD); } public Collection<String> getScenarioLikeKeywords() { final Set<String> keywords = new HashSet<>(); final Collection<String> scenarios = getKeywords(GherkinTokenTypes.SCENARIO_KEYWORD); assert scenarios != null; keywords.addAll(scenarios); final Collection<String> scenarioOutline = getKeywords(GherkinTokenTypes.SCENARIO_OUTLINE_KEYWORD); assert scenarioOutline != null; keywords.addAll(scenarioOutline); return keywords; } public String getScenarioOutlineKeyword() { return getScenarioOutlineKeywords().iterator().next(); } public Collection<String> getScenarioOutlineKeywords() { final Collection<String> scenarioOutline = getKeywords(GherkinTokenTypes.SCENARIO_OUTLINE_KEYWORD); assert scenarioOutline != null; return scenarioOutline; } public Collection<String> getBackgroundKeywords() { final Collection<String> bg = getKeywords(GherkinTokenTypes.BACKGROUND_KEYWORD); assert bg != null; return bg; } public String getExampleSectionKeyword() { return getExampleSectionKeywords().iterator().next(); } public Collection<String> getExampleSectionKeywords() { final Collection<String> keywords = getKeywords(GherkinTokenTypes.EXAMPLES_KEYWORD); assert keywords != null; return keywords; } public String getFeatureSectionKeyword() { return getFeaturesSectionKeywords().iterator().next(); } public Collection<String> getFeaturesSectionKeywords() { final Collection<String> keywords = getKeywords(GherkinTokenTypes.FEATURE_KEYWORD); assert keywords != null; return keywords; } @NotNull public static GherkinKeywordTable getKeywordsTable(PsiFile originalFile, Project project) { final GherkinKeywordProvider provider = JsonGherkinKeywordProvider.getKeywordProvider(); // find language comment final String language = getFeatureLanguage(originalFile); return provider.getKeywordsTable(language); } @NotNull public static String getFeatureLanguage(PsiFile originalFile) { return originalFile instanceof GherkinFile ? ((GherkinFile)originalFile).getLocaleLanguage() : GherkinFileImpl.getDefaultLocale(); } public Collection<IElementType> getTypes() { return myType2KeywordsTable.keySet(); } @Nullable public Collection<String> getKeywords(final IElementType type) { return myType2KeywordsTable.get(type); } public boolean tableContainsKeyword(GherkinElementType type, String keyword) { Collection<String> alreadyKnownKeywords = getKeywords(type); return null != alreadyKnownKeywords && alreadyKnownKeywords.contains(keyword); } }