package com.haskforce; import com.haskforce.parsing.HaskellParsingLexer; import com.haskforce.psi.HaskellParserWrapper; import com.haskforce.psi.HaskellTypes; import com.haskforce.stubs.types.HaskellFileStubElementType; 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.TokenType; import com.intellij.psi.tree.IFileElementType; import com.intellij.psi.tree.TokenSet; import com.haskforce.psi.HaskellFile; import org.jetbrains.annotations.NotNull; /** * Main entry point from plugin for parsing. Returns parser, lexer and other * things useful for parsing. */ public class HaskellParserDefinition implements ParserDefinition { public static final TokenSet WHITE_SPACES = TokenSet.create(TokenType.WHITE_SPACE); public static final TokenSet COMMENTS = TokenSet.create( HaskellTypes.COMMENT, HaskellTypes.HADDOCK, HaskellTypes.COMMENTTEXT, HaskellTypes.OPENCOM, HaskellTypes.CLOSECOM, // Interpret C preprocessor directives as comments. HaskellTypes.CPPIF, HaskellTypes.CPPELSE, HaskellTypes.CPPENDIF, HaskellTypes.CPPIFDEF, HaskellTypes.CPPELIF, HaskellTypes.CPPDEFINE, HaskellTypes.CPPUNDEF, HaskellTypes.CPPLINE, HaskellTypes.CPPPRAGMA ); public static final TokenSet STRINGS = TokenSet.create(HaskellTypes.STRINGTOKEN); // public static final IFileElementType FILE = new IFileElementType(Language.<HaskellLanguage>findInstance(HaskellLanguage.class)); @NotNull @Override public Lexer createLexer(Project project) { return new HaskellParsingLexer(); } /** * These tokens are filtered out by the PsiBuilder before they reach the * parser. */ @NotNull public TokenSet getWhitespaceTokens() { return WHITE_SPACES; } /** * These tokens are filtered out by the PsiBuilder before they reach the * parser. They are also searched for TODO items. */ @NotNull public TokenSet getCommentTokens() { return COMMENTS; } @NotNull public TokenSet getStringLiteralElements() { return STRINGS; } @NotNull @Override public PsiParser createParser(final Project project) { return new HaskellParserWrapper(); } /** * Use a the file stub element type so the contents of these files will be indexed. */ @Override public IFileElementType getFileNodeType() { return HaskellFileStubElementType.INSTANCE; } public PsiFile createFile(FileViewProvider viewProvider) { return new HaskellFile(viewProvider); } public SpaceRequirements spaceExistanceTypeBetweenTokens(ASTNode left, ASTNode right) { return SpaceRequirements.MAY; } /** * Gets called when PsiBuilder.Marker.done(node) is called by the parser. */ @NotNull public PsiElement createElement(ASTNode node) { return HaskellTypes.Factory.createElement(node); } }