package com.igormaznitsa.ideamindmap.lang;
import com.igormaznitsa.ideamindmap.lang.psi.*;
import com.igormaznitsa.ideamindmap.lang.tokens.MMElementType;
import com.igormaznitsa.ideamindmap.lang.tokens.MMTokens;
import com.igormaznitsa.meta.common.utils.Assertions;
import com.intellij.lang.ASTNode;
import com.intellij.lang.ParserDefinition;
import com.intellij.lang.PsiParser;
import com.intellij.lexer.Lexer;
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.IElementType;
import com.intellij.psi.tree.IFileElementType;
import com.intellij.psi.tree.TokenSet;
import javax.annotation.Nonnull;
public class MMParserDefinition implements ParserDefinition {
public static final IFileElementType FILE = new IFileElementType(MMLanguage.INSTANCE);
private static final TokenSet WHITESPACES = TokenSet.create(MMTokens.WHITE_SPACE);
private static final TokenSet STRING_LITERALS = TokenSet.create(MMTokens.TOPIC_TITLE, MMTokens.EXTRA_BODY, MMTokens.CODE_SNIPPET_BODY);
@Nonnull
@Override
public Lexer createLexer(final Project project) {
return new MMLexer();
}
@Override
public PsiParser createParser(final Project project) {
return new MMPsiParser();
}
@Override
public IFileElementType getFileNodeType() {
return FILE;
}
@Nonnull
@Override
public TokenSet getWhitespaceTokens() {
return WHITESPACES;
}
@Nonnull
@Override
public TokenSet getCommentTokens() {
return TokenSet.EMPTY;
}
@Nonnull
@Override
public TokenSet getStringLiteralElements() {
return STRING_LITERALS;
}
@Nonnull
@Override
public PsiElement createElement(final ASTNode node) {
final IElementType type = node.getElementType();
if (type instanceof MMElementType) {
if (type == MMTokens.HEADER_LINE)
return new PsiHeadLine(node);
if (type == MMTokens.HEADER_DELIMITER)
return new PsiHeadDelimiter(node);
if (type == MMTokens.ATTRIBUTES)
return new PsiAttributes(node);
if (type == MMTokens.TOPIC)
return new PsiTopic(node);
if (type == MMTokens.TOPIC_LEVEL)
return new PsiTopicLevel(node);
if (type == MMTokens.TOPIC_TITLE)
return new PsiTopicTitle(node);
if (type == MMTokens.EXTRA_TYPE)
return new PsiExtraType(node);
if (type == MMTokens.EXTRA_DATA)
return new PsiExtraBlock(node);
if (type == MMTokens.CODE_SNIPPET_START)
return new PsiCodeSnippetStart(node);
if (type == MMTokens.CODE_SNIPPET_BODY)
return new PsiCodeSnippetBody(node);
if (type == MMTokens.CODE_SNIPPET_END)
return new PsiCodeSnippetEnd(node);
if (type == MMTokens.EXTRA_BODY) {
final PsiExtraBlock parent = (PsiExtraBlock) node.getTreeParent().getPsi();
switch (parent.getType()) {
case NOTE:
return new PsiExtraText(node);
case FILE:
return new PsiExtraFile(node);
case LINK:
return new PsiExtraURI(node);
case TOPIC:
return new PsiExtraJump(node);
default:
throw Assertions.fail("Unexpected extra type " + parent.getType());
}
}
}
return new PsiUnknown(node);
}
@Override
public PsiFile createFile(final FileViewProvider fileViewProvider) {
return new MMDFile(fileViewProvider);
}
@Override
public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode astNode, ASTNode astNode2) {
return SpaceRequirements.MAY;
}
}