package org.jetbrains.plugins.cucumber.psi.impl; import com.intellij.extapi.psi.PsiFileBase; import com.intellij.lang.ASTNode; import com.intellij.openapi.fileTypes.FileType; import com.intellij.psi.FileViewProvider; import com.intellij.psi.PsiElement; import com.intellij.psi.TokenType; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.cucumber.psi.*; import org.jetbrains.plugins.cucumber.psi.i18n.JsonGherkinKeywordProvider; import java.util.ArrayList; import java.util.List; /** * @author yole */ public class GherkinFileImpl extends PsiFileBase implements GherkinFile { public GherkinFileImpl(FileViewProvider viewProvider) { super(viewProvider, GherkinLanguage.INSTANCE); } @NotNull public FileType getFileType() { return GherkinFileType.INSTANCE; } @Override public String toString() { return "GherkinFile:" + getName(); } public List<String> getStepKeywords() { final GherkinKeywordProvider provider = JsonGherkinKeywordProvider.getKeywordProvider(); List<String> result = new ArrayList<>(); // find language comment final String language = getLocaleLanguage(); // step keywords final GherkinKeywordTable table = provider.getKeywordsTable(language); result.addAll(table.getStepKeywords()); return result; } public String getLocaleLanguage() { final ASTNode node = getNode(); ASTNode child = node.getFirstChildNode(); while (child != null) { if (child.getElementType() == GherkinTokenTypes.COMMENT) { final String text = child.getText().substring(1).trim(); final String lang = GherkinLexer.fetchLocationLanguage(text); if (lang != null) { return lang; } } else { if (child.getElementType() != TokenType.WHITE_SPACE) { break; } } child = child.getTreeNext(); } return getDefaultLocale(); } @Override public GherkinFeature[] getFeatures() { return findChildrenByClass(GherkinFeature.class); } public static String getDefaultLocale() { return "en"; } @Override public PsiElement findElementAt(int offset) { PsiElement result = super.findElementAt(offset); if (result == null && offset == getTextLength()) { final PsiElement last = getLastChild(); result = last != null ? last.getLastChild() : last; } return result; } }