Skip to content

Commit c18c0df

Browse files
committed
perf(parser): cleanup and optimize parsing jsx
1 parent 24dc6ac commit c18c0df

File tree

1 file changed

+13
-30
lines changed
  • crates/oxc_parser/src/jsx

1 file changed

+13
-30
lines changed

crates/oxc_parser/src/jsx/mod.rs

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,15 @@ use oxc_allocator::{Box, Dummy, Vec};
44
use oxc_ast::ast::*;
55
use oxc_span::{Atom, GetSpan, Span};
66

7-
use crate::{Context, ParserImpl, diagnostics, lexer::Kind};
7+
use crate::{ParserImpl, diagnostics, lexer::Kind};
88

99
impl<'a> ParserImpl<'a> {
1010
pub(crate) fn parse_jsx_expression(&mut self) -> Expression<'a> {
1111
let span = self.start_span();
1212
self.bump_any(); // bump `<`
1313
let kind = self.cur_kind();
1414
if kind == Kind::RAngle {
15-
self.expect_jsx_child(Kind::RAngle);
16-
let opening_fragment = self.ast.jsx_opening_fragment(self.end_span(span));
17-
Expression::JSXFragment(self.parse_jsx_fragment(span, opening_fragment, false))
15+
Expression::JSXFragment(self.parse_jsx_fragment(span, false))
1816
} else if kind.is_identifier_or_keyword() {
1917
Expression::JSXElement(self.parse_jsx_element(span, false))
2018
} else {
@@ -24,12 +22,9 @@ impl<'a> ParserImpl<'a> {
2422

2523
/// `JSXFragment` :
2624
/// < > `JSXChildren_opt` < / >
27-
fn parse_jsx_fragment(
28-
&mut self,
29-
span: u32,
30-
opening_fragment: JSXOpeningFragment,
31-
in_jsx_child: bool,
32-
) -> Box<'a, JSXFragment<'a>> {
25+
fn parse_jsx_fragment(&mut self, span: u32, in_jsx_child: bool) -> Box<'a, JSXFragment<'a>> {
26+
self.expect_jsx_child(Kind::RAngle);
27+
let opening_fragment = self.ast.jsx_opening_fragment(self.end_span(span));
3328
let children = self.parse_jsx_children();
3429
let closing_fragment = self.parse_jsx_closing_fragment(in_jsx_child);
3530
self.ast.alloc_jsx_fragment(
@@ -61,10 +56,10 @@ impl<'a> ParserImpl<'a> {
6156
/// true when inside jsx element, false when at top level expression
6257
fn parse_jsx_element(&mut self, span: u32, in_jsx_child: bool) -> Box<'a, JSXElement<'a>> {
6358
let (opening_element, self_closing) = self.parse_jsx_opening_element(span, in_jsx_child);
64-
let children = if self_closing { self.ast.vec() } else { self.parse_jsx_children() };
65-
let closing_element = if self_closing {
66-
None
59+
let (children, closing_element) = if self_closing {
60+
(self.ast.vec(), None)
6761
} else {
62+
let children = self.parse_jsx_children();
6863
let closing_element = self.parse_jsx_closing_element(in_jsx_child);
6964
if !Self::jsx_element_name_eq(&opening_element.name, &closing_element.name) {
7065
self.error(diagnostics::jsx_element_no_match(
@@ -73,7 +68,7 @@ impl<'a> ParserImpl<'a> {
7368
opening_element.name.span().source_text(self.source_text),
7469
));
7570
}
76-
Some(closing_element)
71+
(children, Some(closing_element))
7772
};
7873
self.ast.alloc_jsx_element(self.end_span(span), opening_element, children, closing_element)
7974
}
@@ -248,13 +243,7 @@ impl<'a> ParserImpl<'a> {
248243
self.bump_any(); // bump `<`
249244
// <> open fragment
250245
if self.at(Kind::RAngle) {
251-
self.expect_jsx_child(Kind::RAngle);
252-
let opening_fragment = self.ast.jsx_opening_fragment(self.end_span(span));
253-
return Some(JSXChild::Fragment(self.parse_jsx_fragment(
254-
span,
255-
opening_fragment,
256-
true,
257-
)));
246+
return Some(JSXChild::Fragment(self.parse_jsx_fragment(span, true)));
258247
}
259248
// <ident open element
260249
if self.at(Kind::Ident) || self.cur_kind().is_any_keyword() {
@@ -304,7 +293,7 @@ impl<'a> ParserImpl<'a> {
304293
let expr = self.ast.jsx_empty_expression(Span::new(span.start + 1, span.end - 1));
305294
JSXExpression::EmptyExpression(expr)
306295
} else {
307-
let expr = JSXExpression::from(self.parse_jsx_assignment_expression());
296+
let expr = JSXExpression::from(self.parse_expr());
308297
if in_jsx_child {
309298
self.expect_jsx_child(Kind::RCurly);
310299
} else {
@@ -316,16 +305,10 @@ impl<'a> ParserImpl<'a> {
316305
self.ast.alloc_jsx_expression_container(self.end_span(span_start), expr)
317306
}
318307

319-
fn parse_jsx_assignment_expression(&mut self) -> Expression<'a> {
320-
self.context(Context::default().and_await(self.ctx.has_await()), self.ctx, |p| {
321-
p.parse_expr()
322-
})
323-
}
324-
325308
/// `JSXChildExpression` :
326309
/// { ... `AssignmentExpression` }
327310
fn parse_jsx_spread_child(&mut self, span_start: u32) -> Box<'a, JSXSpreadChild<'a>> {
328-
let expr = self.parse_jsx_assignment_expression();
311+
let expr = self.parse_expr();
329312
self.expect_jsx_child(Kind::RCurly);
330313
self.ast.alloc_jsx_spread_child(self.end_span(span_start), expr)
331314
}
@@ -369,7 +352,7 @@ impl<'a> ParserImpl<'a> {
369352
let span = self.start_span();
370353
self.bump_any(); // bump `{`
371354
self.expect(Kind::Dot3);
372-
let argument = self.parse_jsx_assignment_expression();
355+
let argument = self.parse_expr();
373356
self.expect(Kind::RCurly);
374357
self.ast.alloc_jsx_spread_attribute(self.end_span(span), argument)
375358
}

0 commit comments

Comments
 (0)