@@ -1877,22 +1877,32 @@ end = struct
18771877 | Ppat_tuple _ -> true
18781878 | _ -> false
18791879
1880- let parenze_pat_in_bindings bindings pat =
1881- let parenze_pat_in_binding ~pvb_constraint =
1880+ let parenze_pat_in_bindings' ~ pat_of_binding bindings pat =
1881+ let parenze_pat_in_binding ~constraint_ =
18821882 (* Some patterns must be parenthesed when followed by a colon. *)
1883- (exposed_right_colon pat && Option. is_some pvb_constraint )
1883+ (exposed_right_colon pat && Option. is_some constraint_ )
18841884 ||
18851885 match pat.ppat_desc with
18861886 | Ppat_construct (_, Some _)
18871887 | Ppat_variant (_, Some _)
18881888 | Ppat_cons _ | Ppat_alias _ | Ppat_or _ ->
1889- (* Add disambiguation parentheses that are not necessary. *)
1889+ (* These parentheses serve as disambiguation for value_bindings but
1890+ are mandatory for binding_op. *)
18901891 true
18911892 | _ -> false
18921893 in
1893- List. exists bindings ~f: (fun {pvb_pat; pvb_constraint; _} ->
1894+ List. exists bindings ~f: (fun binding ->
1895+ let pat', constraint_ = pat_of_binding binding in
18941896 (* [pat] appears on the left side of a binding. *)
1895- pvb_pat == pat && parenze_pat_in_binding ~pvb_constraint )
1897+ pat' == pat && parenze_pat_in_binding ~constraint_ )
1898+
1899+ let parenze_pat_in_bindings =
1900+ let pat_of_binding {pvb_pat = p ; pvb_constraint = t ; _} = (p, t) in
1901+ parenze_pat_in_bindings' ~pat_of_binding
1902+
1903+ let parenze_pat_in_letop let_ ands pat =
1904+ let pat_of_binding {pbop_pat = p ; pbop_typ = t ; _} = (p, t) in
1905+ parenze_pat_in_bindings' ~pat_of_binding (let_ :: ands) pat
18961906
18971907 (* * [parenze_pat {ctx; ast}] holds when pattern [ast] should be
18981908 parenthesized in context [ctx]. *)
@@ -1913,16 +1923,6 @@ end = struct
19131923 | Fpc {pparam_desc = _ ; _} , Ppat_cons _ -> true
19141924 | Pat {ppat_desc = Ppat_construct _ ; _} , Ppat_cons _ -> true
19151925 | _ , Ppat_constraint (_ , {ptyp_desc = Ptyp_poly _ ; _} ) -> false
1916- | ( Exp {pexp_desc= Pexp_letop _; _}
1917- , ( Ppat_construct (_, Some _)
1918- | Ppat_cons _
1919- | Ppat_variant (_, Some _)
1920- | Ppat_or _ | Ppat_alias _
1921- | Ppat_constraint ({ppat_desc = Ppat_any ; _} , _ ) ) ) ->
1922- true
1923- | ( Exp {pexp_desc= Pexp_letop _; _}
1924- , Ppat_constraint ({ppat_desc= Ppat_tuple _; _}, _) ) ->
1925- false
19261926 | ( Bo {pbop_typ= None ; _}
19271927 , ( Ppat_construct (_, Some _)
19281928 | Ppat_cons _
@@ -1988,6 +1988,10 @@ end = struct
19881988 , _ )
19891989 when parenze_pat_in_bindings pvbs_bindings pat ->
19901990 true
1991+ | Exp {pexp_desc= Pexp_letop {let_; ands; _}; _}, _
1992+ when parenze_pat_in_letop let_ ands pat ->
1993+ true
1994+ | Bo bo , _ when parenze_pat_in_letop bo [] pat -> true
19911995 | ( Lb {pvb_pat; _}
19921996 , ( Ppat_construct (_, Some _)
19931997 | Ppat_variant (_, Some _)
0 commit comments