Skip to content

Commit 67f8872

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

File tree

3 files changed

+33
-45
lines changed

3 files changed

+33
-45
lines changed

crates/oxc_parser/src/cursor.rs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -228,29 +228,27 @@ 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) {
232232
if self.fatal_error.is_some() {
233-
return Kind::Eof;
233+
return;
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()
239-
} else {
240-
kind
236+
if kind == Kind::ShiftLeft || kind == Kind::LtEq {
237+
self.token = self.lexer.re_lex_as_typescript_l_angle(2);
238+
} else if kind == Kind::ShiftLeftEq {
239+
self.token = self.lexer.re_lex_as_typescript_l_angle(3);
241240
}
242241
}
243242

244-
pub(crate) fn re_lex_ts_r_angle(&mut self) -> Kind {
243+
pub(crate) fn re_lex_ts_r_angle(&mut self) {
245244
if self.fatal_error.is_some() {
246-
return Kind::Eof;
245+
return;
247246
}
248247
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-
} else {
253-
kind
248+
if kind == Kind::ShiftRight {
249+
self.token = self.lexer.re_lex_as_typescript_r_angle(2);
250+
} else if kind == Kind::ShiftRight3 {
251+
self.token = self.lexer.re_lex_as_typescript_r_angle(3);
254252
}
255253
}
256254

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: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -829,28 +829,30 @@ 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 {
833-
let span = self.start_span();
834-
self.expect(Kind::LAngle);
835-
let (params, _) =
836-
self.parse_delimited_list(Kind::RAngle, Kind::Comma, Self::parse_ts_type);
837-
self.expect(Kind::RAngle);
838-
let span = self.end_span(span);
839-
if params.is_empty() {
840-
self.error(diagnostics::ts_empty_type_argument_list(span));
841-
}
842-
return Some(self.ast.alloc_ts_type_parameter_instantiation(span, params));
832+
if self.cur_token().is_on_new_line() {
833+
return None;
843834
}
844-
None
835+
836+
let span = self.start_span();
837+
self.re_lex_ts_l_angle();
838+
if !self.eat(Kind::LAngle) {
839+
return None;
840+
}
841+
842+
let (params, _) = self.parse_delimited_list(Kind::RAngle, Kind::Comma, Self::parse_ts_type);
843+
self.expect(Kind::RAngle);
844+
let span = self.end_span(span);
845+
if params.is_empty() {
846+
self.error(diagnostics::ts_empty_type_argument_list(span));
847+
}
848+
Some(self.ast.alloc_ts_type_parameter_instantiation(span, params))
845849
}
846850

847851
pub(crate) fn parse_type_arguments_in_expression(
848852
&mut self,
849853
) -> Box<'a, TSTypeParameterInstantiation<'a>> {
850854
let span = self.start_span();
851-
if self.re_lex_l_angle() != Kind::LAngle {
852-
return self.unexpected();
853-
}
855+
self.re_lex_ts_l_angle();
854856
self.expect(Kind::LAngle);
855857
let (params, _) = self.parse_delimited_list(Kind::RAngle, Kind::Comma, Self::parse_ts_type);
856858
// `a < b> = c`` is valid but `a < b >= c` is BinaryExpression

0 commit comments

Comments
 (0)