@@ -4,17 +4,15 @@ use oxc_allocator::{Box, Dummy, Vec};
44use oxc_ast:: ast:: * ;
55use oxc_span:: { Atom , GetSpan , Span } ;
66
7- use crate :: { Context , ParserImpl , diagnostics, lexer:: Kind } ;
7+ use crate :: { ParserImpl , diagnostics, lexer:: Kind } ;
88
99impl < ' 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