@@ -175,9 +175,21 @@ let mkpat_stack pat =
175175let mktyp_stack typ =
176176 {typ with ptyp_attributes = stack_attr :: typ .ptyp_attributes}
177177
178+ let wrap_exp_stack exp =
179+ {exp with pexp_attributes = stack_attr :: exp .pexp_attributes}
180+
181+ let mkexp_stack_if p ~loc exp =
182+ if p then mkexp_stack ~loc exp else exp
183+
184+ let mkpat_stack_if p pat =
185+ if p then mkpat_stack pat else pat
186+
178187let mktyp_stack_if p typ =
179188 if p then mktyp_stack typ else typ
180189
190+ let wrap_exp_stack_if p exp =
191+ if p then wrap_exp_stack exp else exp
192+
181193let curry_attr =
182194 Attr. mk ~loc: Location. none (mknoloc " curry" ) (PStr [] )
183195
@@ -2158,22 +2170,16 @@ seq_expr:
21582170 mkexp ~loc: $ sloc (Pexp_extension ($ 4 , payload)) }
21592171;
21602172labeled_simple_pattern:
2161- QUESTION LPAREN label_let_pattern opt_default RPAREN
2162- { (Optional (fst $ 3 ), $ 4 , snd $ 3 ) }
2163- | QUESTION LPAREN LOCAL label_let_pattern opt_default RPAREN
2164- { (Optional (fst $ 4 ), $ 5 , mkpat_stack (snd $ 4 )) }
2173+ QUESTION LPAREN optional_local label_let_pattern opt_default RPAREN
2174+ { (Optional (fst $ 4 ), $ 5 , mkpat_stack_if $ 3 (snd $ 4 )) }
21652175 | QUESTION label_var
21662176 { (Optional (fst $ 2 ), None , snd $ 2 ) }
2167- | OPTLABEL LPAREN let_pattern opt_default RPAREN
2168- { (Optional $ 1 , $ 4 , $ 3 ) }
2169- | OPTLABEL LPAREN LOCAL let_pattern opt_default RPAREN
2170- { (Optional $ 1 , $ 5 , mkpat_stack $ 4 ) }
2177+ | OPTLABEL LPAREN optional_local let_pattern opt_default RPAREN
2178+ { (Optional $ 1 , $ 5 , mkpat_stack_if $ 3 $ 4 ) }
21712179 | OPTLABEL pattern_var
21722180 { (Optional $ 1 , None , $ 2 ) }
2173- | TILDE LPAREN label_let_pattern RPAREN
2174- { (Labelled (fst $ 3 ), None , snd $ 3 ) }
2175- | TILDE LPAREN LOCAL label_let_pattern RPAREN
2176- { (Labelled (fst $ 4 ), None , mkpat_stack (snd $ 4 )) }
2181+ | TILDE LPAREN optional_local label_let_pattern RPAREN
2182+ { (Labelled (fst $ 4 ), None , mkpat_stack_if $ 3 (snd $ 4 )) }
21772183 | TILDE label_var
21782184 { (Labelled (fst $ 2 ), None , snd $ 2 ) }
21792185 | LABEL simple_pattern
@@ -2506,28 +2512,38 @@ labeled_simple_expr:
25062512let_binding_body:
25072513 let_ident strict_binding
25082514 { ($ 1 , $ 2 ) }
2509- | let_ident type_constraint EQUAL seq_expr
2510- { let v = $ 1 in (* PR#7344 *)
2515+ | optional_local let_ident type_constraint EQUAL seq_expr
2516+ { let v = $ 2 in (* PR#7344 *)
25112517 let t =
2512- match $ 2 with
2518+ match $ 3 with
25132519 Some t, None -> t
25142520 | _ , Some t -> t
25152521 | _ -> assert false
25162522 in
25172523 let loc = Location. (t.ptyp_loc.loc_start, t.ptyp_loc.loc_end) in
25182524 let typ = ghtyp ~loc (Ptyp_poly ([] ,t)) in
2519- let patloc = ($ startpos($ 1 ), $ endpos($ 2 )) in
2520- (ghpat ~loc: patloc (Ppat_constraint (v, typ)),
2521- mkexp_constraint ~loc: $ sloc $ 4 $ 2 ) }
2522- | let_ident COLON typevar_list DOT core_type EQUAL seq_expr
2525+ let patloc = ($ startpos($ 2 ), $ endpos($ 3 )) in
2526+ let pat =
2527+ mkpat_stack_if $ 1 (ghpat ~loc: patloc (Ppat_constraint (v, typ)))
2528+ in
2529+ let exp =
2530+ mkexp_stack_if $ 1 ~loc: $ sloc
2531+ (wrap_exp_stack_if $ 1 (mkexp_constraint ~loc: $ sloc $ 5 $ 3 ))
2532+ in
2533+ (pat, exp) }
2534+ | optional_local let_ident COLON typevar_list DOT core_type EQUAL seq_expr
25232535 (* TODO: could replace [typevar_list DOT core_type]
25242536 with [mktyp(poly(core_type))]
25252537 and simplify the semantic action? *)
2526- { let typloc = ($ startpos($ 3 ), $ endpos($ 5 )) in
2527- let patloc = ($ startpos($ 1 ), $ endpos($ 5 )) in
2528- (ghpat ~loc: patloc
2529- (Ppat_constraint ($ 1 , ghtyp ~loc: typloc (Ptyp_poly ($ 3 ,$ 5 )))),
2530- $ 7 ) }
2538+ { let typloc = ($ startpos($ 4 ), $ endpos($ 6 )) in
2539+ let patloc = ($ startpos($ 2 ), $ endpos($ 6 )) in
2540+ let pat =
2541+ mkpat_stack_if $ 1
2542+ (ghpat ~loc: patloc
2543+ (Ppat_constraint ($ 2 , ghtyp ~loc: typloc (Ptyp_poly ($ 4 ,$ 6 )))))
2544+ in
2545+ let exp = mkexp_stack_if $ 1 ~loc: $ sloc $ 8 in
2546+ (pat, exp) }
25312547 | let_ident COLON TYPE lident_list DOT core_type EQUAL seq_expr
25322548 { let exp, poly =
25332549 wrap_type_annotation ~loc: $ sloc $ 4 $ 6 $ 8 in
@@ -2538,7 +2554,7 @@ let_binding_body:
25382554 | simple_pattern_not_ident COLON core_type EQUAL seq_expr
25392555 { let loc = ($ startpos($ 1 ), $ endpos($ 3 )) in
25402556 (ghpat ~loc (Ppat_constraint ($ 1 , $ 3 )), $ 5 ) }
2541- | LOCAL let_ident strict_binding_with_fun
2557+ | LOCAL let_ident local_strict_binding
25422558 { ($ 2 , mkexp_stack ~loc: $ sloc $ 3 ) }
25432559;
25442560(* The formal parameter EXT can be instantiated with ext or no_ext
@@ -2603,10 +2619,18 @@ strict_binding:
26032619 | LPAREN TYPE lident_list RPAREN fun_binding
26042620 { mk_newtypes ~loc: $ sloc $ 3 $ 5 }
26052621;
2606- strict_binding_with_fun:
2607- | labeled_simple_pattern fun_binding
2622+ local_fun_binding:
2623+ local_strict_binding
2624+ { $ 1 }
2625+ | type_constraint EQUAL seq_expr
2626+ { wrap_exp_stack (mkexp_constraint ~loc: $ sloc $ 3 $ 1 ) }
2627+ ;
2628+ local_strict_binding:
2629+ EQUAL seq_expr
2630+ { $ 2 }
2631+ | labeled_simple_pattern local_fun_binding
26082632 { let (l, o, p) = $ 1 in ghexp ~loc: $ sloc (Pexp_fun (l, o, p, $ 2 )) }
2609- | LPAREN TYPE lident_list RPAREN strict_binding_with_fun
2633+ | LPAREN TYPE lident_list RPAREN local_fun_binding
26102634 { mk_newtypes ~loc: $ sloc $ 3 $ 5 }
26112635;
26122636% inline match_cases:
0 commit comments