@@ -2621,10 +2621,11 @@ and parseJsxOpeningOrSelfClosingElement ~startPos p =
2621
2621
| GreaterThan -> (
2622
2622
(* <foo a=b> bar </foo> *)
2623
2623
let childrenStartPos = p.Parser. startPos in
2624
- Scanner. setJsxMode p.scanner;
2625
2624
Parser. next p;
2626
2625
let spread, children = parseJsxChildren p in
2627
2626
let childrenEndPos = p.Parser. startPos in
2627
+ Scanner. popMode p.scanner Jsx ;
2628
+ Scanner. setJsxMode p.scanner;
2628
2629
let () =
2629
2630
match p.token with
2630
2631
| LessThanSlash -> Parser. next p
@@ -2689,6 +2690,8 @@ and parseJsxOpeningOrSelfClosingElement ~startPos p =
2689
2690
* jsx-children ::= primary-expr* * => 0 or more
2690
2691
*)
2691
2692
and parseJsx p =
2693
+ Scanner. popMode p.scanner Jsx ;
2694
+ Scanner. setJsxMode p.Parser. scanner;
2692
2695
Parser. leaveBreadcrumb p Grammar. Jsx ;
2693
2696
let startPos = p.Parser. startPos in
2694
2697
Parser. expect LessThan p;
@@ -2700,6 +2703,7 @@ and parseJsx p =
2700
2703
parseJsxFragment p
2701
2704
| _ -> parseJsxName p
2702
2705
in
2706
+ Scanner. popMode p.scanner Jsx ;
2703
2707
Parser. eatBreadcrumb p;
2704
2708
{jsxExpr with pexp_attributes = [jsxAttr]}
2705
2709
@@ -2710,12 +2714,12 @@ and parseJsx p =
2710
2714
*)
2711
2715
and parseJsxFragment p =
2712
2716
let childrenStartPos = p.Parser. startPos in
2713
- Scanner. setJsxMode p.scanner;
2714
2717
Parser. expect GreaterThan p;
2715
2718
let _spread, children = parseJsxChildren p in
2716
2719
let childrenEndPos = p.Parser. startPos in
2717
2720
Parser. expect LessThanSlash p;
2718
2721
Parser. expect GreaterThan p;
2722
+ Scanner. popMode p.scanner Jsx ;
2719
2723
let loc = mkLoc childrenStartPos childrenEndPos in
2720
2724
makeListExpression loc children None
2721
2725
@@ -2747,6 +2751,7 @@ and parseJsxProp p =
2747
2751
Parser. next p;
2748
2752
(* no punning *)
2749
2753
let optional = Parser. optional p Question in
2754
+ Scanner. popMode p.scanner Jsx ;
2750
2755
let attrExpr =
2751
2756
let e = parsePrimaryExpr ~operand: (parseAtomicExpr p) p in
2752
2757
{e with pexp_attributes = propLocAttr :: e .pexp_attributes}
@@ -2769,6 +2774,7 @@ and parseJsxProp p =
2769
2774
Parser. next p;
2770
2775
match p.Parser. token with
2771
2776
| DotDotDot -> (
2777
+ Scanner. popMode p.scanner Jsx ;
2772
2778
Parser. next p;
2773
2779
let loc = mkLoc p.Parser. startPos p.prevEndPos in
2774
2780
let propLocAttr =
@@ -2794,9 +2800,7 @@ and parseJsxProps p =
2794
2800
and parseJsxChildren p =
2795
2801
let rec loop p children =
2796
2802
match p.Parser. token with
2797
- | Token. Eof | LessThanSlash ->
2798
- Scanner. popMode p.scanner Jsx ;
2799
- List. rev children
2803
+ | Token. Eof | LessThanSlash -> children
2800
2804
| LessThan ->
2801
2805
(* Imagine: <div> <Navbar /> <
2802
2806
* is `<` the start of a jsx-child? <div …
@@ -2812,23 +2816,23 @@ and parseJsxChildren p =
2812
2816
else
2813
2817
(* LessThanSlash *)
2814
2818
let () = p.token < - token in
2815
- let () = Scanner. popMode p.scanner Jsx in
2816
- List. rev children
2819
+ children
2817
2820
| token when Grammar. isJsxChildStart token ->
2818
2821
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
- | _ ->
2824
- Scanner. popMode p.scanner Jsx ;
2825
- List. rev children
2826
+ | _ -> children
2826
2827
in
2827
2828
match p.Parser. token with
2828
2829
| DotDotDot ->
2829
2830
Parser. next p;
2830
2831
(true , [parsePrimaryExpr ~operand: (parseAtomicExpr p) ~no Call:true p])
2831
- | _ -> (false , loop p [] )
2832
+ | _ ->
2833
+ let children = List. rev (loop p [] ) in
2834
+ Scanner. popMode p.scanner Jsx ;
2835
+ (false , children)
2832
2836
2833
2837
and parseBracedOrRecordExpr p =
2834
2838
let startPos = p.Parser. startPos in
0 commit comments