package com.googlecode.netburstjbehaveidea;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import com.intellij.extapi.psi.PsiFileBase;
import com.intellij.lang.ASTNode;
import com.intellij.lang.ParserDefinition;
import com.intellij.lang.PsiParser;
import com.intellij.lexer.FlexAdapter;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.tree.IFileElementType;
import com.intellij.psi.tree.TokenSet;
import org.jetbrains.annotations.NotNull;
public class StoryParserDefinition implements ParserDefinition {
@NotNull
public Lexer createLexer(Project project) {
return new FlexAdapter(new StoryLexerBasedOnJFlex());
}
public PsiParser createParser(final Project project) {
return new StoryParser();
}
public IFileElementType getFileNodeType() {
return StoryLexerTypes.FILE;
}
@NotNull
public TokenSet getWhitespaceTokens() {
return StoryLexerTypes.WHITE_SPACES;
}
@NotNull
public TokenSet getCommentTokens() {
return StoryLexerTypes.COMMENTS;
}
@NotNull
public PsiElement createElement(final ASTNode node) {
if (node.getElementType() == StoryParserTypes.STEP_TEXT_GIVEN
|| node.getElementType() == StoryParserTypes.STEP_TEXT_WHEN
|| node.getElementType() == StoryParserTypes.STEP_TEXT_THEN) {
return new PsiStep(node);
} else {
return new ASTWrapperPsiElement(node);
}
}
public PsiFile createFile(final FileViewProvider viewProvider) {
return new PsiFileBase(viewProvider, StoryLanguage.INSTANCE) {
@NotNull
@Override
public FileType getFileType() {
return getLanguage().getAssociatedFileType();
}
};
}
public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode left, ASTNode right) {
// final Lexer lexer = createLexer(left.getPsi().getProject());
// return LanguageUtil.canStickTokensTogetherByLexer(left, right, lexer);
return null;
}
@NotNull
public TokenSet getStringLiteralElements() {
return StoryLexerTypes.COMMENTS;
}
}