@@ -2612,6 +2612,7 @@ and parseJsxOpeningOrSelfClosingElement ~startPos p =
2612
2612
let childrenStartPos = p.Parser. startPos in
2613
2613
Parser. next p;
2614
2614
let childrenEndPos = p.Parser. startPos in
2615
+ Scanner. popMode p.scanner Jsx ;
2615
2616
Parser. expect GreaterThan p;
2616
2617
let loc = mkLoc childrenStartPos childrenEndPos in
2617
2618
makeListExpression loc [] None (* no children *)
@@ -2621,8 +2622,6 @@ and parseJsxOpeningOrSelfClosingElement ~startPos p =
2621
2622
Parser. next p;
2622
2623
let spread, children = parseJsxChildren p in
2623
2624
let childrenEndPos = p.Parser. startPos in
2624
- Scanner. popMode p.scanner Jsx ;
2625
- Scanner. setJsxMode p.scanner;
2626
2625
let () =
2627
2626
match p.token with
2628
2627
| LessThanSlash -> Parser. next p
@@ -2634,12 +2633,14 @@ and parseJsxOpeningOrSelfClosingElement ~startPos p =
2634
2633
in
2635
2634
match p.Parser. token with
2636
2635
| (Lident _ | Uident _ ) when verifyJsxOpeningClosingName p name -> (
2636
+ Scanner. popMode p.scanner Jsx ;
2637
2637
Parser. expect GreaterThan p;
2638
2638
let loc = mkLoc childrenStartPos childrenEndPos in
2639
2639
match (spread, children) with
2640
2640
| true , child :: _ -> child
2641
2641
| _ -> makeListExpression loc children None )
2642
2642
| token -> (
2643
+ Scanner. popMode p.scanner Jsx ;
2643
2644
let () =
2644
2645
if Grammar. isStructureItemStart token then
2645
2646
let closing = " </" ^ string_of_pexp_ident name ^ " >" in
@@ -2660,6 +2661,7 @@ and parseJsxOpeningOrSelfClosingElement ~startPos p =
2660
2661
| true , child :: _ -> child
2661
2662
| _ -> makeListExpression loc children None ))
2662
2663
| token ->
2664
+ Scanner. popMode p.scanner Jsx ;
2663
2665
Parser. err p (Diagnostics. unexpected token p.breadcrumbs);
2664
2666
makeListExpression Location. none [] None
2665
2667
in
@@ -2687,7 +2689,6 @@ and parseJsxOpeningOrSelfClosingElement ~startPos p =
2687
2689
* jsx-children ::= primary-expr* * => 0 or more
2688
2690
*)
2689
2691
and parseJsx p =
2690
- Scanner. popMode p.scanner Jsx ;
2691
2692
Scanner. setJsxMode p.Parser. scanner;
2692
2693
Parser. leaveBreadcrumb p Grammar. Jsx ;
2693
2694
let startPos = p.Parser. startPos in
@@ -2700,7 +2701,6 @@ and parseJsx p =
2700
2701
parseJsxFragment p
2701
2702
| _ -> parseJsxName p
2702
2703
in
2703
- Scanner. popMode p.scanner Jsx ;
2704
2704
Parser. eatBreadcrumb p;
2705
2705
{jsxExpr with pexp_attributes = [jsxAttr]}
2706
2706
@@ -2714,9 +2714,10 @@ and parseJsxFragment p =
2714
2714
Parser. expect GreaterThan p;
2715
2715
let _spread, children = parseJsxChildren p in
2716
2716
let childrenEndPos = p.Parser. startPos in
2717
+ if p.token = LessThan then p.token < - Scanner. reconsiderLessThan p.scanner;
2717
2718
Parser. expect LessThanSlash p;
2718
- Parser. expect GreaterThan p;
2719
2719
Scanner. popMode p.scanner Jsx ;
2720
+ Parser. expect GreaterThan p;
2720
2721
let loc = mkLoc childrenStartPos childrenEndPos in
2721
2722
makeListExpression loc children None
2722
2723
@@ -2768,6 +2769,7 @@ and parseJsxProp p =
2768
2769
Some (label, attrExpr))
2769
2770
(* {...props} *)
2770
2771
| Lbrace -> (
2772
+ Scanner. popMode p.scanner Jsx ;
2771
2773
Parser. next p;
2772
2774
match p.Parser. token with
2773
2775
| DotDotDot -> (
@@ -2786,6 +2788,7 @@ and parseJsxProp p =
2786
2788
match p.Parser. token with
2787
2789
| Rbrace ->
2788
2790
Parser. next p;
2791
+ Scanner. setJsxMode p.scanner;
2789
2792
Some (label, attrExpr)
2790
2793
| _ -> None )
2791
2794
| _ -> None )
@@ -2795,6 +2798,7 @@ and parseJsxProps p =
2795
2798
parseRegion ~grammar: Grammar. JsxAttribute ~f: parseJsxProp p
2796
2799
2797
2800
and parseJsxChildren p =
2801
+ Scanner. popMode p.scanner Jsx ;
2798
2802
let rec loop p children =
2799
2803
match p.Parser. token with
2800
2804
| Token. Eof | LessThanSlash -> children
@@ -2815,21 +2819,23 @@ and parseJsxChildren p =
2815
2819
let () = p.token < - token in
2816
2820
children
2817
2821
| token when Grammar. isJsxChildStart token ->
2818
- let () = Scanner. popMode p.scanner Jsx in
2819
2822
let child =
2820
2823
parsePrimaryExpr ~operand: (parseAtomicExpr p) ~no Call:true p
2821
2824
in
2822
2825
loop p (child :: children)
2823
2826
| _ -> children
2824
2827
in
2825
- match p.Parser. token with
2826
- | DotDotDot ->
2827
- Parser. next p;
2828
- (true , [parsePrimaryExpr ~operand: (parseAtomicExpr p) ~no Call:true p])
2829
- | _ ->
2830
- let children = List. rev (loop p [] ) in
2831
- Scanner. popMode p.scanner Jsx ;
2832
- (false , children)
2828
+ let spread, children =
2829
+ match p.Parser. token with
2830
+ | DotDotDot ->
2831
+ Parser. next p;
2832
+ (true , [parsePrimaryExpr ~operand: (parseAtomicExpr p) ~no Call:true p])
2833
+ | _ ->
2834
+ let children = List. rev (loop p [] ) in
2835
+ (false , children)
2836
+ in
2837
+ Scanner. setJsxMode p.scanner;
2838
+ (spread, children)
2833
2839
2834
2840
and parseBracedOrRecordExpr p =
2835
2841
let startPos = p.Parser. startPos in
0 commit comments