package org.jetbrains.plugins.cucumber.psi;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.tree.IElementType;
import gnu.trove.THashMap;
import gnu.trove.THashSet;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @author yole, Roman.Chernyatchik
*/
public class GherkinKeywordList {
// maps custom language keyword to base (English) keyword
private Map<String, String> myKeyword2BaseNameTable = new THashMap<>();
private Set<String> myKeywordsWithNoSpaceAfter = new THashSet<>();
private GherkinKeywordTable myKeywordsTable = new GherkinKeywordTable();
public GherkinKeywordList() {
}
public GherkinKeywordList(HashMap<Object, Object> hashMap) {
Boolean forceSpaceAfterKeyword = null;
for (Map.Entry e : hashMap.entrySet()) {
String key = e.getKey().toString();
String value = e.getValue().toString();
if (key.equals("space_after_keyword")) {
forceSpaceAfterKeyword = Boolean.valueOf(value);
}
else if (!key.equals("name") && !key.equals("native") && !key.equals("encoding")) {
final String[] keywords = value.split("\\|");
final String baseKeyword = StringUtil.toTitleCase(key.replace("_", " "));
final IElementType type = getTokenTypeByBaseKeyword(baseKeyword);
for (String keyword : keywords) {
if (keyword.endsWith("<")) {
keyword = keyword.substring(0, keyword.length()-1);
myKeywordsWithNoSpaceAfter.add(keyword);
}
myKeyword2BaseNameTable.put(keyword, baseKeyword);
myKeywordsTable.put(type, keyword);
}
}
if (forceSpaceAfterKeyword != null) {
if (forceSpaceAfterKeyword.booleanValue()) {
myKeywordsWithNoSpaceAfter.clear();
}
else {
myKeywordsWithNoSpaceAfter.addAll(myKeyword2BaseNameTable.keySet());
}
}
}
}
public Collection<String> getAllKeywords() {
return myKeyword2BaseNameTable.keySet();
}
public GherkinKeywordTable getKeywordsTable() {
return myKeywordsTable;
}
public boolean isSpaceAfterKeyword(String keyword) {
return !myKeywordsWithNoSpaceAfter.contains(keyword);
}
public IElementType getTokenType(String keyword) {
return getTokenTypeByBaseKeyword(getBaseKeyword(keyword));
}
private static IElementType getTokenTypeByBaseKeyword(String baseKeyword) {
return PlainGherkinKeywordProvider.DEFAULT_KEYWORDS.get(baseKeyword);
}
public String getBaseKeyword(String keyword) {
return myKeyword2BaseNameTable.get(keyword);
}
}