diff --git a/src/utils/skipRule.ts b/src/utils/skipRule.ts
index 91a03014..e86657db 100644
--- a/src/utils/skipRule.ts
+++ b/src/utils/skipRule.ts
@@ -361,10 +361,20 @@ function nextToken(state: LexerState): Token {
}
}
+ /**
+ * @return whether the lexer has reached the end of input
+ */
function isEof(): boolean {
return state.current >= state.source.length;
}
+ /**
+ * Sets the start position of the next token that will be emitted
+ * to the current position.
+ *
+ * More characters need to be consumed after calling this, as
+ * an empty token would be emitted otherwise.
+ */
function resetToCurrent() {
state.start = state.current;
state.start_pos = state.current_pos;
@@ -604,6 +614,14 @@ export function parseConfig(config: string): { rules: AdvancedSkipRule[]; errors
let erroring = false;
let panicMode = false;
+ /**
+ * Adds an error message. The current skip rule will be marked as erroring.
+ *
+ * @param span the range of the error
+ * @param message the message to report
+ * @param panic if true, all further errors will be silenced
+ * until panic mode is disabled again
+ */
function errorAt(span: Span, message: string, panic: boolean) {
if (!panicMode) {
errors.push({span, message,});
@@ -613,14 +631,36 @@ export function parseConfig(config: string): { rules: AdvancedSkipRule[]; errors
erroring = true;
}
+ /**
+ * Adds an error message for an error occurring at the previous token
+ * (which was just consumed).
+ *
+ * @param message the message to report
+ * @param panic if true, all further errors will be silenced
+ * until panic mode is disabled again
+ */
function error(message: string, panic: boolean) {
errorAt(previous.span, message, panic);
}
+ /**
+ * Adds an error message for an error occurring at the current token
+ * (which has not been consumed yet).
+ *
+ * @param message the message to report
+ * @param panic if true, all further errors will be silenced
+ * until panic mode is disabled again
+ */
function errorAtCurrent(message: string, panic: boolean) {
errorAt(current.span, message, panic);
}
+ /**
+ * Consumes the current token, which can then be accessed at previous.
+ * The next token will be at current after this call.
+ *
+ * If a token of type error is found, issues an error message.
+ */
function consume() {
previous = current;
current = nextToken(lexerState);
@@ -631,6 +671,12 @@ export function parseConfig(config: string): { rules: AdvancedSkipRule[]; errors
}
}
+ /**
+ * Checks the current token (that has not been consumed yet) against a set of expected token types.
+ *
+ * @param expected the set of expected token types
+ * @return whether the actual current token matches any expected token type
+ */
function match(expected: readonly TokenType[]): boolean {
if (expected.includes(current.type)) {
consume();
@@ -640,12 +686,26 @@ export function parseConfig(config: string): { rules: AdvancedSkipRule[]; errors
}
}
+ /**
+ * Checks the current token (that has not been consumed yet) against a set of expected token types.
+ *
+ * If there is no match, issues an error message which will be prepended to , got: .
+ *
+ * @param expected the set of expected token types
+ * @param message the error message to report in case the actual token doesn't match
+ * @param panic if true, all further errors will be silenced
+ * until panic mode is disabled again
+ */
function expect(expected: readonly TokenType[], message: string, panic: boolean) {
if (!match(expected)) {
errorAtCurrent(message.concat(`, got: \`${current.type}\``), panic);
}
}
+ /**
+ * Synchronize with the next rule block and disable panic mode.
+ * Skips all tokens until the if keyword is found.
+ */
function synchronize() {
panicMode = false;
@@ -658,6 +718,9 @@ export function parseConfig(config: string): { rules: AdvancedSkipRule[]; errors
}
}
+ /**
+ * @return whether the parser has reached the end of input
+ */
function isEof(): boolean {
return current.type === "eof";
}