Skip to content

Commit ea2df80

Browse files
committed
Fix bad AT lexing for highlighting
This should resolved all the highlighting weirdnesses happening while editing ATs, like whole entries being red while correct Also adds a recovery rule for keywords and only use consumeTokenFast for recovery rules, to show users what is wrong with their syntax
1 parent 8443d3b commit ea2df80

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

src/main/grammars/AtLexer.flex

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
package com.demonwav.mcdev.platform.mcp.at.gen;
2222

2323
import com.intellij.lexer.*;
24-
import com.intellij.psi.tree.IElementType;
24+
import com.intellij.psi.TokenType;import com.intellij.psi.tree.IElementType;
2525
import static com.demonwav.mcdev.platform.mcp.at.gen.psi.AtTypes.*;
2626
import static com.intellij.psi.TokenType.*;
2727

@@ -48,16 +48,20 @@ import static com.intellij.psi.TokenType.*;
4848
PRIMITIVE=[ZBCSIFDJV]
4949
CLASS_VALUE=(\[+[ZBCSIFDJ]|(\[*L[^;\n]+;))
5050
KEYWORD_ELEMENT=(public|private|protected|default)([-+]f)?
51-
NAME_ELEMENT=([\p{L}_\p{Sc}][\p{L}\p{N}_\p{Sc}]*)|<init>
52-
CLASS_NAME_ELEMENT=([\p{L}_\p{Sc}][\p{L}\p{N}_\p{Sc}]*\.)*[\p{L}_\p{Sc}][\p{L}\p{N}_\p{Sc}]*
51+
IDENTIFIER=[\p{L}_\p{Sc}][\p{L}\p{N}_\p{Sc}]*
52+
NAME_ELEMENT=({IDENTIFIER})|<init>
53+
CLASS_NAME_ELEMENT=({IDENTIFIER}*\.)*{IDENTIFIER}
5354
COMMENT=#.*
5455
CRLF=\n|\r|\r\n
5556
WHITE_SPACE=\s
5657

5758
%%
5859

5960
<YYINITIAL> {
60-
{KEYWORD_ELEMENT} { yybegin(CLASS_NAME); return KEYWORD_ELEMENT; }
61+
// Force a whitespace because otherwise the keyword and class name can be right next to each other
62+
{KEYWORD_ELEMENT}/{WHITE_SPACE} { yybegin(CLASS_NAME); return KEYWORD_ELEMENT; }
63+
// Fallback to avoid breaking code highlighting at the keyword
64+
{NAME_ELEMENT} { return NAME_ELEMENT; }
6165
}
6266

6367
<CLASS_NAME> {
@@ -73,7 +77,7 @@ WHITE_SPACE=\s
7377
"(" { return OPEN_PAREN; }
7478
")" { return CLOSE_PAREN; }
7579
{CLASS_VALUE} { return CLASS_VALUE; }
76-
{PRIMITIVE} ({PRIMITIVE}|{CLASS_VALUE})* { zzMarkedPos = zzStartRead + 1; return PRIMITIVE; }
80+
{PRIMITIVE} { return PRIMITIVE; }
7781
}
7882

7983
{CRLF} { yybegin(YYINITIAL); return CRLF; }

src/main/grammars/AtParser.bnf

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
elementTypeClass="com.demonwav.mcdev.platform.mcp.at.psi.AtElementType"
3333
tokenTypeClass="com.demonwav.mcdev.platform.mcp.at.psi.AtTokenType"
3434

35-
consumeTokenMethod="consumeTokenFast"
35+
consumeTokenMethod(".*_recover")="consumeTokenFast"
3636
}
3737

3838
at_file ::= line*
@@ -60,7 +60,9 @@ keyword ::= KEYWORD_ELEMENT {
6060
methods=[
6161
keywordElement="KEYWORD_ELEMENT"
6262
]
63+
recoverWhile=keyword_recover
6364
}
65+
private keyword_recover ::= !(NAME_ELEMENT | CLASS_NAME_ELEMENT)
6466

6567
class_name ::= CLASS_NAME_ELEMENT {
6668
mixin="com.demonwav.mcdev.platform.mcp.at.psi.mixins.impl.AtClassNameImplMixin"

0 commit comments

Comments
 (0)