44import org .jetbrains .annotations .NotNull ;
55import org .jetbrains .annotations .Nullable ;
66
7+ import java .util .StringJoiner ;
8+
79@ Getter
810@ SuppressWarnings ("unused" )
911public class TokenizerError extends RuntimeException {
@@ -18,6 +20,34 @@ public static TokenizerError unexpectedEnd(@NotNull AbstractStringTokenizer toke
1820 );
1921 }
2022
23+ @ NotNull
24+ public static TokenizerError expectedWhitespace (@ NotNull AbstractStringTokenizer tokenizer ,
25+ char actual ) {
26+ return new TokenizerError (
27+ Type .EXPECTED_WHITESPACE ,
28+ tokenizer ,
29+ 0 ,
30+ String .format ("expected whitespace but found '%c'" , actual )
31+ );
32+ }
33+
34+ @ NotNull
35+ public static TokenizerError expectedOneOf (@ NotNull AbstractStringTokenizer tokenizer ,
36+ char @ NotNull [] expected ,
37+ char actual ) {
38+ StringJoiner formattedExpected = new StringJoiner (", " , "[" , "]" );
39+ for (char character : expected ) {
40+ formattedExpected .add (formatCharacter (character ));
41+ }
42+
43+ return new TokenizerError (
44+ Type .EXPECTED_ONE_OF ,
45+ tokenizer ,
46+ 0 ,
47+ String .format ("expected one of %s but found %s" , formattedExpected , formatCharacter (actual ))
48+ );
49+ }
50+
2151 @ NotNull
2252 public static TokenizerError unexpectedCharacter (@ NotNull AbstractStringTokenizer tokenizer ,
2353 @ Nullable Character expected ,
@@ -87,6 +117,23 @@ public synchronized Throwable fillInStackTrace() {
87117 return this ;
88118 }
89119
120+ @ NotNull
121+ private static String formatCharacter (char character ) {
122+ switch (character ) {
123+ case '\\' :
124+ case '\'' :
125+ return "'\\ " + character + "'" ;
126+ case '\n' :
127+ return "'\\ n'" ;
128+ case '\r' :
129+ return "'\\ r'" ;
130+ case '\t' :
131+ return "'\\ t'" ;
132+ default :
133+ return "'" + character + "'" ;
134+ }
135+ }
136+
90137 @ NotNull
91138 public String formatForChat () {
92139 return String .format (
@@ -101,17 +148,19 @@ public enum Type {
101148 UNEXPECTED_END ,
102149 UNEXPECTED_CHARACTER ,
103150 REQUIRED_N_CHARACTERS ,
104- MISSING_FLAG_VALUE (true ),
151+ EXPECTED_WHITESPACE (false ),
152+ EXPECTED_ONE_OF (false ),
153+ MISSING_FLAG_VALUE (false ),
105154 ;
106155
107- private final boolean isSilent ;
156+ private final boolean shouldLog ;
108157
109158 Type () {
110- this (false );
159+ this (true );
111160 }
112161
113- Type (boolean isSilent ) {
114- this .isSilent = isSilent ;
162+ Type (boolean shouldLog ) {
163+ this .shouldLog = shouldLog ;
115164 }
116165 }
117166
0 commit comments