perf(parser): eat whitespace after line break (#2353)

Uses the `byte_search!` macro introduced in #2352 to consume whitespace after a line break.
This commit is contained in:
overlookmotel 2024-02-09 04:02:51 +00:00 committed by GitHub
parent d3a59f27f7
commit 8376f15b9a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 30 additions and 2 deletions

View file

@ -203,8 +203,7 @@ ascii_byte_handler!(ISP(lexer) {
// '\r' '\n'
ascii_byte_handler!(LIN(lexer) {
lexer.consume_char();
lexer.token.is_on_new_line = true;
Kind::Skip
lexer.line_break_handler()
});
// !

View file

@ -25,6 +25,7 @@ mod token;
mod trivia_builder;
mod typescript;
mod unicode;
mod whitespace;
use rustc_hash::FxHashMap;
use std::collections::VecDeque;

View file

@ -0,0 +1,28 @@
use super::{
search::{byte_search, safe_byte_match_table, SafeByteMatchTable},
Kind, Lexer,
};
static NOT_REGULAR_WHITESPACE_OR_LINE_BREAK_TABLE: SafeByteMatchTable =
safe_byte_match_table!(|b| !matches!(b, b' ' | b'\t' | b'\r' | b'\n'));
impl<'a> Lexer<'a> {
pub(super) fn line_break_handler(&mut self) -> Kind {
self.token.is_on_new_line = true;
// Indentation is common after a line break.
// Consume it, along with any further line breaks.
// Irregular line breaks and whitespace are not consumed.
// They're uncommon, so leave them for the next call to `handle_byte` to take care of.
byte_search! {
lexer: self,
table: NOT_REGULAR_WHITESPACE_OR_LINE_BREAK_TABLE,
handle_match: |_next_byte, _start| {
Kind::Skip
},
handle_eof: |_start| {
Kind::Skip
},
};
}
}