Skip to content

Commit 64e556e

Browse files
committed
perf(parser): cleanup and optimize re-lexing angle tokens
1 parent aa0689f commit 64e556e

File tree

3 files changed

+24
-30
lines changed

3 files changed

+24
-30
lines changed

crates/oxc_parser/src/cursor.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -228,29 +228,35 @@ impl<'a> ParserImpl<'a> {
228228
}
229229
}
230230

231-
pub(crate) fn re_lex_l_angle(&mut self) -> Kind {
231+
pub(crate) fn re_lex_ts_l_angle(&mut self) -> bool {
232232
if self.fatal_error.is_some() {
233-
return Kind::Eof;
233+
return false;
234234
}
235235
let kind = self.cur_kind();
236-
if matches!(kind, Kind::ShiftLeft | Kind::ShiftLeftEq | Kind::LtEq) {
237-
self.token = self.lexer.re_lex_as_typescript_l_angle(kind);
238-
self.token.kind()
236+
if kind == Kind::ShiftLeft || kind == Kind::LtEq {
237+
self.token = self.lexer.re_lex_as_typescript_l_angle(2);
238+
true
239+
} else if kind == Kind::ShiftLeftEq {
240+
self.token = self.lexer.re_lex_as_typescript_l_angle(3);
241+
true
239242
} else {
240-
kind
243+
kind == Kind::LAngle
241244
}
242245
}
243246

244-
pub(crate) fn re_lex_ts_r_angle(&mut self) -> Kind {
247+
pub(crate) fn re_lex_ts_r_angle(&mut self) -> bool {
245248
if self.fatal_error.is_some() {
246-
return Kind::Eof;
249+
return false;
247250
}
248251
let kind = self.cur_kind();
249-
if matches!(kind, Kind::ShiftRight | Kind::ShiftRight3) {
250-
self.token = self.lexer.re_lex_as_typescript_r_angle(kind);
251-
self.token.kind()
252+
if kind == Kind::ShiftRight {
253+
self.token = self.lexer.re_lex_as_typescript_r_angle(2);
254+
true
255+
} else if kind == Kind::ShiftRight3 {
256+
self.token = self.lexer.re_lex_as_typescript_r_angle(3);
257+
true
252258
} else {
253-
kind
259+
kind == Kind::RAngle
254260
}
255261
}
256262

crates/oxc_parser/src/lexer/typescript.rs

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,16 @@ use super::{Kind, Lexer, Token};
22

33
impl Lexer<'_> {
44
/// Re-tokenize '<<' or '<=' or '<<=' to '<'
5-
pub(crate) fn re_lex_as_typescript_l_angle(&mut self, kind: Kind) -> Token {
6-
let offset = match kind {
7-
Kind::ShiftLeft | Kind::LtEq => 2,
8-
Kind::ShiftLeftEq => 3,
9-
_ => unreachable!(),
10-
};
5+
pub(crate) fn re_lex_as_typescript_l_angle(&mut self, offset: u32) -> Token {
116
self.token.set_start(self.offset() - offset);
127
self.source.back(offset as usize - 1);
13-
let kind = Kind::LAngle;
14-
self.finish_next(kind)
8+
self.finish_next(Kind::LAngle)
159
}
1610

1711
/// Re-tokenize '>>' and '>>>' to '>'
18-
pub(crate) fn re_lex_as_typescript_r_angle(&mut self, kind: Kind) -> Token {
19-
let offset = match kind {
20-
Kind::ShiftRight => 2,
21-
Kind::ShiftRight3 => 3,
22-
_ => unreachable!(),
23-
};
12+
pub(crate) fn re_lex_as_typescript_r_angle(&mut self, offset: u32) -> Token {
2413
self.token.set_start(self.offset() - offset);
2514
self.source.back(offset as usize - 1);
26-
let kind = Kind::RAngle;
27-
self.finish_next(kind)
15+
self.finish_next(Kind::RAngle)
2816
}
2917
}

crates/oxc_parser/src/ts/types.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -829,7 +829,7 @@ impl<'a> ParserImpl<'a> {
829829
pub(crate) fn parse_type_arguments_of_type_reference(
830830
&mut self,
831831
) -> Option<Box<'a, TSTypeParameterInstantiation<'a>>> {
832-
if !self.cur_token().is_on_new_line() && self.re_lex_l_angle() == Kind::LAngle {
832+
if !self.cur_token().is_on_new_line() && self.re_lex_ts_l_angle() {
833833
let span = self.start_span();
834834
self.expect(Kind::LAngle);
835835
let (params, _) =
@@ -848,7 +848,7 @@ impl<'a> ParserImpl<'a> {
848848
&mut self,
849849
) -> Box<'a, TSTypeParameterInstantiation<'a>> {
850850
let span = self.start_span();
851-
if self.re_lex_l_angle() != Kind::LAngle {
851+
if !self.re_lex_ts_l_angle() {
852852
return self.unexpected();
853853
}
854854
self.expect(Kind::LAngle);

0 commit comments

Comments
 (0)