Skip to content
Snippets Groups Projects
Commit e515f756 authored by Johannes Mey's avatar Johannes Mey
Browse files

add syntax highlighter (and fix grammar for qualified types)

parent 366a5747
No related branches found
No related tags found
No related merge requests found
......@@ -23,7 +23,7 @@ type_decl ::= ABSTRACT? ID (COL ID)? (ASSIGN component*)? SCOL
component ::= (SLASH actual_component SLASH) | actual_component
actual_component ::= (ID (COL ID)? STAR?) | (LBRACKET ID (COL ID)? RBRACKET) | (LT ID (COL (ID | java_type_use))? GT)
actual_component ::= (ID (COL ID)? STAR?) | (LBRACKET ID (COL ID)? RBRACKET) | (LT ID (COL (java_type_use))? GT)
java_type_use ::= parameterized_java_type_use | simple_java_type_use
......
package org.jastadd.tooling;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.fileTypes.SyntaxHighlighter;
import com.intellij.openapi.options.colors.AttributesDescriptor;
import com.intellij.openapi.options.colors.ColorDescriptor;
import com.intellij.openapi.options.colors.ColorSettingsPage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.Map;
public class RelAstGrammarColorSettingsPage implements ColorSettingsPage {
private static final AttributesDescriptor[] DESCRIPTORS = new AttributesDescriptor[]{
new AttributesDescriptor("Keyword", RelAstGrammarSyntaxHighlighter.KEYWORD),
new AttributesDescriptor("Production Rule Symbol", RelAstGrammarSyntaxHighlighter.ASSIGN),
new AttributesDescriptor("Relation Direction", RelAstGrammarSyntaxHighlighter.RELATON_DIR),
new AttributesDescriptor("Superclass Symbol", RelAstGrammarSyntaxHighlighter.COL),
new AttributesDescriptor("Comma", RelAstGrammarSyntaxHighlighter.COMMA),
new AttributesDescriptor("Documentation Comment", RelAstGrammarSyntaxHighlighter.DOCCOMMENT),
new AttributesDescriptor("Namespace Qualifier Dot", RelAstGrammarSyntaxHighlighter.DOT),
new AttributesDescriptor("Identifier", RelAstGrammarSyntaxHighlighter.ID),
new AttributesDescriptor("Terminal Symbol Bracket", RelAstGrammarSyntaxHighlighter.ANGLE_BRACKET),
new AttributesDescriptor("Block Comment", RelAstGrammarSyntaxHighlighter.MULTILINECOMMENT),
new AttributesDescriptor("0..1 Multiplicity", RelAstGrammarSyntaxHighlighter.QUESTION_MARK),
new AttributesDescriptor("Optional Bracket", RelAstGrammarSyntaxHighlighter.BRACKET),
new AttributesDescriptor("Semicolon", RelAstGrammarSyntaxHighlighter.SCOL),
new AttributesDescriptor("Line Comment", RelAstGrammarSyntaxHighlighter.SINGLELINECOMMENT),
new AttributesDescriptor("NTA Bracket", RelAstGrammarSyntaxHighlighter.SLASH),
new AttributesDescriptor("Star Multiplicity", RelAstGrammarSyntaxHighlighter.STAR),
new AttributesDescriptor("Bad Value", RelAstGrammarSyntaxHighlighter.BAD_CHARACTER)
};
@Nullable
@Override
public Icon getIcon() {
return JastAddIcons.FILE;
}
@NotNull
@Override
public SyntaxHighlighter getHighlighter() {
return new RelAstGrammarSyntaxHighlighter();
}
@NotNull
@Override
public String getDemoText() {
return "Program ::= GrammarFile* <NameList:java.util.List<String>>;\n" +
"abstract Grammar ::= Declaration*; /* good rule! */\n" +
"GrammarFile : Grammar ::= <FileName> ; // also good rule\n" +
"/** the best rule */\n" +
"abstract Declaration ::= Comment* /Comment/;\n" +
"TypeDecl:Declaration ::= <Name> <Abstract:boolean> Component* [Comment];\n" +
"rel TypeDecl.SuperType? <-> TypeDecl.SubType*;\n" +
"/* Bad character: */ #";
}
@Nullable
@Override
public Map<String, TextAttributesKey> getAdditionalHighlightingTagToDescriptorMap() {
return null;
}
@NotNull
@Override
public AttributesDescriptor[] getAttributeDescriptors() {
return DESCRIPTORS;
}
@NotNull
@Override
public ColorDescriptor[] getColorDescriptors() {
return ColorDescriptor.EMPTY_ARRAY;
}
@NotNull
@Override
public String getDisplayName() {
return "RelAstGrammar";
}
}
package org.jastadd.tooling;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
import com.intellij.openapi.editor.HighlighterColors;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.fileTypes.SyntaxHighlighterBase;
import com.intellij.psi.TokenType;
import com.intellij.psi.tree.IElementType;
import org.jastadd.tooling.lexer.RelAstGrammarFlexAdapter;
import org.jastadd.tooling.parser.RelAstGrammarTypes;
import org.jetbrains.annotations.NotNull;
import static com.intellij.openapi.editor.colors.TextAttributesKey.createTextAttributesKey;
public class RelAstGrammarSyntaxHighlighter extends SyntaxHighlighterBase {
public static final TextAttributesKey KEYWORD = createTextAttributesKey("RELAST_KEYWORD", DefaultLanguageHighlighterColors.KEYWORD);
public static final TextAttributesKey ASSIGN = createTextAttributesKey("RELAST_ASSIGN", DefaultLanguageHighlighterColors.OPERATION_SIGN);
public static final TextAttributesKey RELATON_DIR = createTextAttributesKey("RELAST_RELATION_DIR", DefaultLanguageHighlighterColors.OPERATION_SIGN);
public static final TextAttributesKey COL = createTextAttributesKey("RELAST_COL", DefaultLanguageHighlighterColors.DOT);
public static final TextAttributesKey COMMA = createTextAttributesKey("RELAST_COMMA", DefaultLanguageHighlighterColors.COMMA);
public static final TextAttributesKey DOCCOMMENT = createTextAttributesKey("RELAST_DOCCOMMENT", DefaultLanguageHighlighterColors.DOC_COMMENT);
public static final TextAttributesKey DOT = createTextAttributesKey("RELAST_DOT", DefaultLanguageHighlighterColors.DOT);
public static final TextAttributesKey ID = createTextAttributesKey("RELAST_ID", DefaultLanguageHighlighterColors.IDENTIFIER);
public static final TextAttributesKey BRACKET = createTextAttributesKey("RELAST_BRACKET", DefaultLanguageHighlighterColors.BRACKETS);
public static final TextAttributesKey ANGLE_BRACKET = createTextAttributesKey("ANGLE_BRACKET", DefaultLanguageHighlighterColors.BRACKETS);
public static final TextAttributesKey MULTILINECOMMENT = createTextAttributesKey("RELAST_MULTILINECOMMENT", DefaultLanguageHighlighterColors.BLOCK_COMMENT);
public static final TextAttributesKey QUESTION_MARK = createTextAttributesKey("RELAST_QUESTION_MARK", DefaultLanguageHighlighterColors.OPERATION_SIGN);
public static final TextAttributesKey SCOL = createTextAttributesKey("RELAST_SCOL", DefaultLanguageHighlighterColors.SEMICOLON);
public static final TextAttributesKey SINGLELINECOMMENT = createTextAttributesKey("RELAST_SINGLELINECOMMENT", DefaultLanguageHighlighterColors.LINE_COMMENT);
public static final TextAttributesKey SLASH = createTextAttributesKey("RELAST_SLASH", DefaultLanguageHighlighterColors.BRACKETS);
public static final TextAttributesKey STAR = createTextAttributesKey("RELAST_STAR", DefaultLanguageHighlighterColors.OPERATION_SIGN);
public static final TextAttributesKey BAD_CHARACTER = createTextAttributesKey("SIMPLE_BAD_CHARACTER", HighlighterColors.BAD_CHARACTER);
private static final TextAttributesKey[] KEYWORD_KEYS = new TextAttributesKey[]{KEYWORD};
private static final TextAttributesKey[] ASSIGN_KEYS = new TextAttributesKey[]{ASSIGN};
private static final TextAttributesKey[] RELATION_DIR_KEYS = new TextAttributesKey[]{RELATON_DIR};
private static final TextAttributesKey[] COL_KEYS = new TextAttributesKey[]{COL};
private static final TextAttributesKey[] COMMA_KEYS = new TextAttributesKey[]{COMMA};
private static final TextAttributesKey[] DOCCOMMENT_KEYS = new TextAttributesKey[]{DOCCOMMENT};
private static final TextAttributesKey[] DOT_KEYS = new TextAttributesKey[]{DOT};
private static final TextAttributesKey[] ID_KEYS = new TextAttributesKey[]{ID};
private static final TextAttributesKey[] ANGLE_BRACKET_KEYS = new TextAttributesKey[]{ANGLE_BRACKET};
private static final TextAttributesKey[] MULTILINECOMMENT_KEYS = new TextAttributesKey[]{MULTILINECOMMENT};
private static final TextAttributesKey[] QUESTION_MARK_KEYS = new TextAttributesKey[]{QUESTION_MARK};
private static final TextAttributesKey[] BRACKET_KEYS = new TextAttributesKey[]{BRACKET};
private static final TextAttributesKey[] SCOL_KEYS = new TextAttributesKey[]{SCOL};
private static final TextAttributesKey[] SINGLELINECOMMENT_KEYS = new TextAttributesKey[]{SINGLELINECOMMENT};
private static final TextAttributesKey[] SLASH_KEYS = new TextAttributesKey[]{SLASH};
private static final TextAttributesKey[] STAR_KEYS = new TextAttributesKey[]{STAR};
private static final TextAttributesKey[] BAD_CHAR_KEYS = new TextAttributesKey[]{BAD_CHARACTER};
private static final TextAttributesKey[] EMPTY_KEYS = new TextAttributesKey[0];
@NotNull
@Override
public Lexer getHighlightingLexer() {
return new RelAstGrammarFlexAdapter();
}
@NotNull
@Override
public TextAttributesKey[] getTokenHighlights(IElementType tokenType) {
if (tokenType.equals(RelAstGrammarTypes.ABSTRACT)) {
return KEYWORD_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.ASSIGN)) {
return ASSIGN_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.BIDIRECTIONAL)) {
return RELATION_DIR_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.COL)) {
return COL_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.COMMA)) {
return COMMA_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.DOCCOMMENT)) {
return DOCCOMMENT_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.DOT)) {
return DOT_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.GT)) {
return ANGLE_BRACKET_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.ID)) {
return ID_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.LBRACKET)) {
return BRACKET_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.LEFT)) {
return RELATION_DIR_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.LT)) {
return ANGLE_BRACKET_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.MULTILINECOMMENT)) {
return MULTILINECOMMENT_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.QUESTION_MARK)) {
return QUESTION_MARK_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.RBRACKET)) {
return BRACKET_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.REL)) {
return KEYWORD_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.RIGHT)) {
return RELATION_DIR_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.SCOL)) {
return SCOL_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.SINGLELINECOMMENT)) {
return SINGLELINECOMMENT_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.SLASH)) {
return SLASH_KEYS;
} else if (tokenType.equals(RelAstGrammarTypes.STAR)) {
return STAR_KEYS;
} else if (tokenType.equals(TokenType.BAD_CHARACTER)) {
return BAD_CHAR_KEYS;
} else {
return EMPTY_KEYS;
}
}
}
package org.jastadd.tooling;
import com.intellij.openapi.fileTypes.SyntaxHighlighter;
import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
public class RelAstGrammarSyntaxHighlighterFactory extends SyntaxHighlighterFactory {
@NotNull
@Override
public SyntaxHighlighter getSyntaxHighlighter(Project project, VirtualFile virtualFile) {
return new RelAstGrammarSyntaxHighlighter();
}
}
......@@ -17,6 +17,10 @@
fieldName="INSTANCE" language="JastAddGrammar" extensions="relast"/>
<lang.parserDefinition language="JastAddGrammar"
implementationClass="org.jastadd.tooling.parser.RelAstGrammarParserDefinition"/>
<lang.syntaxHighlighterFactory language="JastAddGrammar"
implementationClass="org.jastadd.tooling.RelAstGrammarSyntaxHighlighterFactory"/>
<colorSettingsPage implementation="org.jastadd.tooling.RelAstGrammarColorSettingsPage"/>
</extensions>
<actions>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment