@@ -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
@@ -2756,6 +2757,7 @@ and parseJsxProp p =
2756
2757
let label =
2757
2758
if optional then Asttypes. Optional name else Asttypes. Labelled name
2758
2759
in
2760
+ Scanner. setJsxMode p.scanner;
2759
2761
Some (label, attrExpr)
2760
2762
| _ ->
2761
2763
let attrExpr =
@@ -2767,34 +2769,39 @@ and parseJsxProp p =
2767
2769
in
2768
2770
Some (label, attrExpr))
2769
2771
(* {...props} *)
2770
- | Lbrace -> (
2772
+ | Lbrace ->
2773
+ Scanner. popMode p.scanner Jsx ;
2771
2774
Parser. next p;
2772
- match p.Parser. token with
2773
- | DotDotDot -> (
2774
- Scanner. popMode p.scanner Jsx ;
2775
- Parser. next p;
2776
- let loc = mkLoc p.Parser. startPos p.prevEndPos in
2777
- let propLocAttr =
2778
- (Location. mkloc " res.namedArgLoc" loc, Parsetree. PStr [] )
2779
- in
2780
- let attrExpr =
2781
- let e = parsePrimaryExpr ~operand: (parseExpr p) p in
2782
- {e with pexp_attributes = propLocAttr :: e .pexp_attributes}
2783
- in
2784
- (* using label "spreadProps" to distinguish from others *)
2785
- let label = Asttypes. Labelled " _spreadProps" in
2775
+ let props =
2786
2776
match p.Parser. token with
2787
- | Rbrace ->
2777
+ | DotDotDot -> (
2788
2778
Parser. next p;
2789
- Some (label, attrExpr)
2790
- | _ -> None )
2791
- | _ -> None )
2779
+ let loc = mkLoc p.Parser. startPos p.prevEndPos in
2780
+ let propLocAttr =
2781
+ (Location. mkloc " res.namedArgLoc" loc, Parsetree. PStr [] )
2782
+ in
2783
+ let attrExpr =
2784
+ let e = parsePrimaryExpr ~operand: (parseExpr p) p in
2785
+ {e with pexp_attributes = propLocAttr :: e .pexp_attributes}
2786
+ in
2787
+ (* using label "spreadProps" to distinguish from others *)
2788
+ let label = Asttypes. Labelled " _spreadProps" in
2789
+ match p.Parser. token with
2790
+ | Rbrace ->
2791
+ Parser. next p;
2792
+ Some (label, attrExpr)
2793
+ | _ -> None )
2794
+ | _ -> None
2795
+ in
2796
+ Scanner. setJsxMode p.scanner;
2797
+ props
2792
2798
| _ -> None
2793
2799
2794
2800
and parseJsxProps p =
2795
2801
parseRegion ~grammar: Grammar. JsxAttribute ~f: parseJsxProp p
2796
2802
2797
2803
and parseJsxChildren p =
2804
+ Scanner. popMode p.scanner Jsx ;
2798
2805
let rec loop p children =
2799
2806
match p.Parser. token with
2800
2807
| Token. Eof | LessThanSlash -> children
@@ -2815,21 +2822,23 @@ and parseJsxChildren p =
2815
2822
let () = p.token < - token in
2816
2823
children
2817
2824
| token when Grammar. isJsxChildStart token ->
2818
- let () = Scanner. popMode p.scanner Jsx in
2819
2825
let child =
2820
2826
parsePrimaryExpr ~operand: (parseAtomicExpr p) ~no Call:true p
2821
2827
in
2822
2828
loop p (child :: children)
2823
2829
| _ -> children
2824
2830
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)
2831
+ let spread, children =
2832
+ match p.Parser. token with
2833
+ | DotDotDot ->
2834
+ Parser. next p;
2835
+ (true , [parsePrimaryExpr ~operand: (parseAtomicExpr p) ~no Call:true p])
2836
+ | _ ->
2837
+ let children = List. rev (loop p [] ) in
2838
+ (false , children)
2839
+ in
2840
+ Scanner. setJsxMode p.scanner;
2841
+ (spread, children)
2833
2842
2834
2843
and parseBracedOrRecordExpr p =
2835
2844
let startPos = p.Parser. startPos in
0 commit comments