From 936dbd2f8bd6f84c10757ed427f0dd8c5cede6f3 Mon Sep 17 00:00:00 2001 From: Juuz <6596629+Juuxel@users.noreply.github.com> Date: Sun, 12 Apr 2026 23:29:04 +0300 Subject: [PATCH 1/3] Fix valid class tweaker files initially erroring until reopened The slightly hacky fix utilises a "fake token" that matches real-looking line starts. It's unused in the parser so the user will still see an error when possible, but eliminating the BAD_CHARACTER inputs for valid *characters* seems to fix the incorrect error highlighting. --- src/main/grammars/CtLexer.flex | 4 ++++ src/main/grammars/CtParser.bnf | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src/main/grammars/CtLexer.flex b/src/main/grammars/CtLexer.flex index 512f9f903..274a2dab5 100644 --- a/src/main/grammars/CtLexer.flex +++ b/src/main/grammars/CtLexer.flex @@ -62,6 +62,7 @@ TYPE_VARIABLE=T[^;\n]+; ACCESS_ELEMENT=accessible|transitive-accessible|extendable|transitive-extendable|mutable|transitive-mutable INJECT_INTERFACE_ELEMENT=inject-interface|transitive-inject-interface EXTEND_ENUM_ELEMENT=extend-enum|transitive-extend-enum +INCOMPLETE_ENTRY_START=[a-zA-Z-]+ CLASS_ELEMENT=class METHOD_ELEMENT=method FIELD_ELEMENT=field @@ -78,6 +79,9 @@ WHITE_SPACE=\s {ACCESS_ELEMENT} { yybegin(AW_ENTRY); return ACCESS_ELEMENT; } {INJECT_INTERFACE_ELEMENT} { yybegin(ITF_ENTRY_KEY); return INJECT_INTERFACE_ELEMENT; } {EXTEND_ENUM_ELEMENT} { yybegin(ENUM_NAME); return EXTEND_ENUM_ELEMENT; } + // Create tokens for incomplete or invalid inputs too if they look like real inputs (same characters) + // to prevent a bug where the entire file is erroring until reopened. + {INCOMPLETE_ENTRY_START} { return INCOMPLETE_ENTRY_START; } }
{ diff --git a/src/main/grammars/CtParser.bnf b/src/main/grammars/CtParser.bnf index fe52c3226..c12d3afc7 100644 --- a/src/main/grammars/CtParser.bnf +++ b/src/main/grammars/CtParser.bnf @@ -136,3 +136,6 @@ desc_element ::= OPEN_BRACKET* (PRIMITIVE | CLASS_VALUE) { signature ::= CLASS_NAME_ELEMENT (LESS_THAN signature_element+ GREATER_THAN)? signature_element ::= OPEN_BRACKET* (PRIMITIVE | TYPE_VARIABLE | signature_class_element) signature_class_element ::= ASTERISK | ( (PLUS | MINUS)? SIGNATURE_CLASS_VALUE_START (LESS_THAN signature_element GREATER_THAN)? SIGNATURE_CLASS_VALUE_END ) + +// Unused rule to generate the INCOMPLETE_ENTRY_START token. +incomplete_entry_start_holder ::= INCOMPLETE_ENTRY_START From 28bafe8bd1661c5d86f271df3fa5e8aec242d750 Mon Sep 17 00:00:00 2001 From: Juuz <6596629+Juuxel@users.noreply.github.com> Date: Sun, 12 Apr 2026 23:31:24 +0300 Subject: [PATCH 2/3] CtParser: Make invalid_entry_start_holder private to remove unused PSI itf --- src/main/grammars/CtParser.bnf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/grammars/CtParser.bnf b/src/main/grammars/CtParser.bnf index c12d3afc7..218927fe7 100644 --- a/src/main/grammars/CtParser.bnf +++ b/src/main/grammars/CtParser.bnf @@ -138,4 +138,4 @@ signature_element ::= OPEN_BRACKET* (PRIMITIVE | TYPE_VARIABLE | signature_class signature_class_element ::= ASTERISK | ( (PLUS | MINUS)? SIGNATURE_CLASS_VALUE_START (LESS_THAN signature_element GREATER_THAN)? SIGNATURE_CLASS_VALUE_END ) // Unused rule to generate the INCOMPLETE_ENTRY_START token. -incomplete_entry_start_holder ::= INCOMPLETE_ENTRY_START +private incomplete_entry_start_holder ::= INCOMPLETE_ENTRY_START From 2ea39054fb209301eecf5af9d2f00bc0536a8fe5 Mon Sep 17 00:00:00 2001 From: Juuz <6596629+Juuxel@users.noreply.github.com> Date: Mon, 13 Apr 2026 10:30:47 +0300 Subject: [PATCH 3/3] Clarify comment --- src/main/grammars/CtParser.bnf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/grammars/CtParser.bnf b/src/main/grammars/CtParser.bnf index 218927fe7..c862c4a60 100644 --- a/src/main/grammars/CtParser.bnf +++ b/src/main/grammars/CtParser.bnf @@ -137,5 +137,5 @@ signature ::= CLASS_NAME_ELEMENT (LESS_THAN signature_element+ GREATER_THAN)? signature_element ::= OPEN_BRACKET* (PRIMITIVE | TYPE_VARIABLE | signature_class_element) signature_class_element ::= ASTERISK | ( (PLUS | MINUS)? SIGNATURE_CLASS_VALUE_START (LESS_THAN signature_element GREATER_THAN)? SIGNATURE_CLASS_VALUE_END ) -// Unused rule to generate the INCOMPLETE_ENTRY_START token. +// Unused rule to generate the INCOMPLETE_ENTRY_START token type used in the lexer. private incomplete_entry_start_holder ::= INCOMPLETE_ENTRY_START