package com.haskforce.highlighting;
import com.haskforce.HaskellLanguage;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.fileTypes.SyntaxHighlighterBase;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import com.haskforce.psi.HaskellTypes;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class HaskellSyntaxHighlighter extends SyntaxHighlighterBase {
/*
* Constructors, type classes, data types, .., are nice to distinguish
* from the keywords. Borrow the color of INSTANCE_FIELD since it stands
* out from the keywords by default and we are unlikely need it for other
* purposes.
*/
/*
* We classify the reserved IDs as keywords.
*/
public static final TextAttributesKey RESERVED_ID
= TextAttributesKey.createTextAttributesKey("HS_RESERVED_ID", DefaultLanguageHighlighterColors.KEYWORD);
public static final TextAttributesKey RESERVED_OP
= TextAttributesKey.createTextAttributesKey("HS_RESERVED_OP", DefaultLanguageHighlighterColors.PREDEFINED_SYMBOL);
public static final TextAttributesKey COMMA
= TextAttributesKey.createTextAttributesKey("HS_COMMA", DefaultLanguageHighlighterColors.COMMA);
public static final TextAttributesKey SEMICOLON
= TextAttributesKey.createTextAttributesKey("HS_SEMICOLON", DefaultLanguageHighlighterColors.SEMICOLON);
public static final TextAttributesKey BRACKETS
= TextAttributesKey.createTextAttributesKey("HS_BRACKETS", DefaultLanguageHighlighterColors.BRACKETS);
public static final TextAttributesKey PARENTHESES
= TextAttributesKey.createTextAttributesKey("HS_PARENTHESES", DefaultLanguageHighlighterColors.PARENTHESES);
public static final TextAttributesKey BRACES
= TextAttributesKey.createTextAttributesKey("HS_BRACES", DefaultLanguageHighlighterColors.BRACES);
public static final TextAttributesKey NESTED_COMMENT
= TextAttributesKey.createTextAttributesKey("HS_NESTED_COMMENT", DefaultLanguageHighlighterColors.BLOCK_COMMENT);
public static final TextAttributesKey HADDOCK
= TextAttributesKey.createTextAttributesKey("HS_HADDOCK", DefaultLanguageHighlighterColors.DOC_COMMENT);
public static final TextAttributesKey COMMENT
= TextAttributesKey.createTextAttributesKey("HS_COMMENT", DefaultLanguageHighlighterColors.LINE_COMMENT);
public static final TextAttributesKey INTEGER
= TextAttributesKey.createTextAttributesKey("HS_INTEGER", DefaultLanguageHighlighterColors.NUMBER);
public static final TextAttributesKey FLOAT
= TextAttributesKey.createTextAttributesKey("HS_FLOAT", DefaultLanguageHighlighterColors.NUMBER);
public static final TextAttributesKey CHAR
= TextAttributesKey.createTextAttributesKey("HS_CHAR", DefaultLanguageHighlighterColors.NUMBER);
public static final TextAttributesKey CONID //Constructors, type constructors and type classes
= TextAttributesKey.createTextAttributesKey("HS_CONSTRUCTOR", DefaultLanguageHighlighterColors.INSTANCE_FIELD);
public static final TextAttributesKey VARID
= TextAttributesKey.createTextAttributesKey("HS_VARIABLE", DefaultLanguageHighlighterColors.FUNCTION_CALL);
public static final TextAttributesKey PARAMETER
= TextAttributesKey.createTextAttributesKey("HS_PARAMETER", DefaultLanguageHighlighterColors.PARAMETER);
public static final TextAttributesKey INFIXVARID
= TextAttributesKey.createTextAttributesKey("HS_INFIX_VARID", DefaultLanguageHighlighterColors.FUNCTION_CALL);
public static final TextAttributesKey VARSYM
= TextAttributesKey.createTextAttributesKey("HS_VARSYM", DefaultLanguageHighlighterColors.OPERATION_SIGN);
public static final TextAttributesKey CONSYM
= TextAttributesKey.createTextAttributesKey("HS_CONSYM", DefaultLanguageHighlighterColors.PREDEFINED_SYMBOL);
public static final TextAttributesKey PRAGMA
= TextAttributesKey.createTextAttributesKey("HS_PRAGMA", DefaultLanguageHighlighterColors.METADATA);
public static final TextAttributesKey STRING
= TextAttributesKey.createTextAttributesKey("HS_STRING", DefaultLanguageHighlighterColors.STRING);
public static final TextAttributesKey QUASIQUOTE
= TextAttributesKey.createTextAttributesKey("HS_QUASIQUOTE", DefaultLanguageHighlighterColors.STRING);
public static final TextAttributesKey ESCAPE
= TextAttributesKey.createTextAttributesKey("HS_ESCAPE", DefaultLanguageHighlighterColors.VALID_STRING_ESCAPE);
public static final TextAttributesKey SIGNATURE =
TextAttributesKey.createTextAttributesKey("HS_SIGNATURE");
private static final Map<IElementType, TextAttributesKey> keys;
/**
* Helper to point multiple token types to a single color.
*/
private static void keysPutEach(Iterable<IElementType> tokenTypes, TextAttributesKey value) {
for (IElementType tokenType : tokenTypes) {
keys.put(tokenType, value);
}
}
static {
keys = new HashMap<>(0);
keysPutEach(HaskellLanguage.RESERVED_IDS_TOKENS, RESERVED_ID);
keysPutEach(HaskellLanguage.RESERVED_OPS_TOKENS, RESERVED_OP);
keysPutEach(HaskellLanguage.BRACKET_TOKENS, BRACKETS);
keysPutEach(HaskellLanguage.PARENS_TOKENS, PARENTHESES);
keysPutEach(HaskellLanguage.BRACE_TOKENS, BRACES);
keysPutEach(Arrays.asList(HaskellTypes.DOUBLEQUOTE, HaskellTypes.STRINGTOKEN), STRING);
keysPutEach(Arrays.asList(HaskellTypes.COMMENTTEXT, HaskellTypes.OPENCOM, HaskellTypes.CLOSECOM), NESTED_COMMENT);
keysPutEach(Arrays.asList(HaskellTypes.PRAGMA, HaskellTypes.OPENPRAGMA, HaskellTypes.CLOSEPRAGMA), PRAGMA);
keys.put(HaskellTypes.COMMA, COMMA);
keys.put(HaskellTypes.SEMICOLON, SEMICOLON);
keys.put(HaskellTypes.CONIDREGEXP, CONID);
keys.put(HaskellTypes.COMMENT, COMMENT);
keys.put(HaskellTypes.HADDOCK, HADDOCK);
keys.put(HaskellTypes.INTEGERTOKEN, INTEGER);
keys.put(HaskellTypes.FLOATTOKEN, FLOAT);
keys.put(HaskellTypes.CHARTOKEN, CHAR);
keys.put(HaskellTypes.VARSYMTOK, VARSYM);
keys.put(HaskellTypes.CONSYMTOK, CONSYM);
keys.put(HaskellTypes.QQTEXT, QUASIQUOTE);
keys.put(HaskellTypes.INFIXVARID, INFIXVARID);
keys.put(HaskellTypes.SHEBANGSTART, COMMENT);
keys.put(HaskellTypes.SHEBANGPATH, COMMENT);
}
@NotNull
@Override
public Lexer getHighlightingLexer() {
return new HaskellSyntaxHighlightingLexer();
}
@NotNull
@Override
public TextAttributesKey[] getTokenHighlights(IElementType tokenType) {
return pack(keys.get(tokenType), EMPTY);
}
}