Skip to content

Commit

Permalink
perf(parser): eat whitespace after line break (oxc-project#2353)
Browse files Browse the repository at this point in the history
Uses the `byte_search!` macro introduced in oxc-project#2352 to consume whitespace after a line break.
  • Loading branch information
overlookmotel authored Feb 9, 2024
1 parent d3a59f2 commit 8376f15
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 2 deletions.
3 changes: 1 addition & 2 deletions crates/oxc_parser/src/lexer/byte_handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
});

// !
Expand Down
1 change: 1 addition & 0 deletions crates/oxc_parser/src/lexer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ mod token;
mod trivia_builder;
mod typescript;
mod unicode;
mod whitespace;

use rustc_hash::FxHashMap;
use std::collections::VecDeque;
Expand Down
28 changes: 28 additions & 0 deletions crates/oxc_parser/src/lexer/whitespace.rs
Original file line number Diff line number Diff line change
@@ -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
},
};
}
}

0 comments on commit 8376f15

Please sign in to comment.