/*
* Copyright 2011-present Greg Shrago
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.intellij.jflex.editor;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
import com.intellij.openapi.editor.HighlighterColors;
import com.intellij.openapi.editor.colors.EditorColors;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.fileTypes.SyntaxHighlighter;
import com.intellij.openapi.fileTypes.SyntaxHighlighterBase;
import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.TokenType;
import com.intellij.psi.tree.IElementType;
import org.intellij.jflex.parser.JFlexLexer;
import org.jetbrains.annotations.NotNull;
import static com.intellij.openapi.editor.colors.TextAttributesKey.createTextAttributesKey;
import static org.intellij.jflex.parser.JFlexParserDefinition.CHAR_CLASS_OPERATORS;
import static org.intellij.jflex.parser.JFlexParserDefinition.PATTERN_OPERATORS;
import static org.intellij.jflex.psi.JFlexTypes.*;
public class JFlexSyntaxHighlighterFactory extends SyntaxHighlighterFactory {
public static final TextAttributesKey ILLEGAL = createTextAttributesKey("FLEX_ILLEGAL", HighlighterColors.BAD_CHARACTER);
public static final TextAttributesKey MACRO = createTextAttributesKey("FLEX_MACRO", DefaultLanguageHighlighterColors.INSTANCE_FIELD);
public static final TextAttributesKey STATE = createTextAttributesKey("FLEX_STATE", DefaultLanguageHighlighterColors.CLASS_NAME);
public static final TextAttributesKey CLASS = createTextAttributesKey("FLEX_CLASS");
public static final TextAttributesKey PATTERN_OP = createTextAttributesKey("FLEX_PATTERN_OP", DefaultLanguageHighlighterColors.KEYWORD);
public static final TextAttributesKey CLASS_OP = createTextAttributesKey("FLEX_CHAR_CLASS_OP", DefaultLanguageHighlighterColors.KEYWORD);
public static final TextAttributesKey OP_RANGE = createTextAttributesKey("FLEX_OP_RANGE", DefaultLanguageHighlighterColors.KEYWORD);
public static final TextAttributesKey COMMENT = createTextAttributesKey("FLEX_COMMENT", DefaultLanguageHighlighterColors.LINE_COMMENT);
public static final TextAttributesKey OPTION = createTextAttributesKey("FLEX_OPTION", DefaultLanguageHighlighterColors.LABEL);
public static final TextAttributesKey RAW_CODE = createTextAttributesKey("FLEX_RAW_CODE", EditorColors.INJECTED_LANGUAGE_FRAGMENT);
public static final TextAttributesKey SECT_DIV = createTextAttributesKey("FLEX_SECTION_DIV", DefaultLanguageHighlighterColors.LABEL);
public static final TextAttributesKey STRING = createTextAttributesKey("FLEX_STRING", DefaultLanguageHighlighterColors.STRING);
public static final TextAttributesKey CHAR = createTextAttributesKey("FLEX_CHAR", DefaultLanguageHighlighterColors.STRING);
public static final TextAttributesKey CHAR_ESC = createTextAttributesKey("FLEX_CHAR_ESC", DefaultLanguageHighlighterColors.VALID_STRING_ESCAPE);
public static final TextAttributesKey NUMBER = createTextAttributesKey("FLEX_NUMBER", DefaultLanguageHighlighterColors.NUMBER);
public static final TextAttributesKey CLASS_STD = createTextAttributesKey("FLEX_PREDEFINED_CLASS", DefaultLanguageHighlighterColors.KEYWORD);
public static final TextAttributesKey DOT = createTextAttributesKey("FLEX_DOT", DefaultLanguageHighlighterColors.KEYWORD);
public static final TextAttributesKey EOF = createTextAttributesKey("FLEX_SECTION_DIV", DefaultLanguageHighlighterColors.LABEL);
public static final TextAttributesKey LOOKAHEAD = createTextAttributesKey("FLEX_LOOKAHEAD", DefaultLanguageHighlighterColors.OPERATION_SIGN);
public static final TextAttributesKey COMMA = createTextAttributesKey("FLEX_COMMA", DefaultLanguageHighlighterColors.COMMA);
public static final TextAttributesKey OP_EQUAL = createTextAttributesKey("FLEX_OP_EQUAL", DefaultLanguageHighlighterColors.OPERATION_SIGN);
public static final TextAttributesKey PARENS = createTextAttributesKey("FLEX_PARENS", DefaultLanguageHighlighterColors.PARENTHESES);
public static final TextAttributesKey BRACES = createTextAttributesKey("FLEX_BRACES", DefaultLanguageHighlighterColors.BRACES);
public static final TextAttributesKey BRACKETS = createTextAttributesKey("FLEX_BRACKETS", DefaultLanguageHighlighterColors.BRACKETS);
public static final TextAttributesKey ANGLES = createTextAttributesKey("FLEX_ANGLES", DefaultLanguageHighlighterColors.BRACKETS);
@NotNull
@Override
public SyntaxHighlighter getSyntaxHighlighter(Project project, VirtualFile virtualFile) {
return new JFlexSyntaxHighlighter();
}
private class JFlexSyntaxHighlighter extends SyntaxHighlighterBase {
@NotNull
@Override
public Lexer getHighlightingLexer() {
return new JFlexLexer();
}
@NotNull
@Override
public TextAttributesKey[] getTokenHighlights(IElementType o) {
if (o == FLEX_LINE_COMMENT || o == FLEX_BLOCK_COMMENT) return pack(COMMENT);
if (o == FLEX_RAW) return pack(RAW_CODE);
if (o == FLEX_TWO_PERCS) return pack(SECT_DIV);
if (o == FLEX_STRING) return pack(STRING);
if (o == FLEX_CHAR) return pack(CHAR);
if (o == FLEX_CHAR_ESC) return pack(CHAR_ESC);
if (o == FLEX_NUMBER || o == FLEX_VERSION) return pack(NUMBER);
if (o == FLEX_CHAR_CLASS) return pack(CLASS_STD);
if (o == FLEX_EOF) return pack(EOF);
if (o == FLEX_FSLASH) return pack(LOOKAHEAD);
if (o == FLEX_COMMA) return pack(COMMA);
if (o == FLEX_DOT) return pack(DOT);
if (o == FLEX_EQ) return pack(OP_EQUAL);
if (o == FLEX_DASH) return pack(OP_RANGE);
if (o == FLEX_PAREN1 || o == FLEX_PAREN2) return pack(PARENS);
if (o == FLEX_BRACE1 || o == FLEX_BRACE2) return pack(BRACES);
if (o == FLEX_BRACK1 || o == FLEX_BRACK2) return pack(BRACKETS);
if (o == FLEX_ANGLE1 || o == FLEX_ANGLE2) return pack(ANGLES);
if (PATTERN_OPERATORS.contains(o)) return pack(PATTERN_OP);
if (CHAR_CLASS_OPERATORS.contains(o)) return pack(CLASS_OP);
if (o == FLEX_UNCLOSED || o == TokenType.BAD_CHARACTER) return pack(ILLEGAL);
if (o.toString().startsWith("%")) return pack(OPTION);
return EMPTY;
}
}
}