@@ -238,15 +238,47 @@ module Parse = struct
238238 | None -> b.pbop_is_pun
239239 | Some false -> false
240240 | Some true -> (
241- match (b.pbop_pat.ppat_desc, b.pbop_exp.pexp_desc) with
242- | Ppat_var {txt = v ; _} , Pexp_ident {txt = Lident e ; _} ->
243- String. equal v e
244- | _ -> false )
241+ b.pbop_is_pun
242+ ||
243+ match (b.pbop_pat.ppat_desc, b.pbop_exp.pexp_desc) with
244+ | Ppat_var {txt = v ; _} , Pexp_ident {txt = Lident e ; _} ->
245+ String. equal v e
246+ | _ -> false )
245247 in
246248 {b with pbop_loc= {b.pbop_loc with loc_start; loc_end}; pbop_is_pun}
247249 in
248250 Ast_mapper. default_mapper.binding_op m b'
249251 in
252+ let value_bindings (m : Ast_mapper.mapper ) vbs =
253+ let punning is_extension vb =
254+ let is_extension =
255+ is_extension || Option. is_some vb.pvb_attributes.attrs_extension
256+ in
257+ let pvb_is_pun =
258+ is_extension
259+ &&
260+ match prefer_let_puns with
261+ | None -> vb.pvb_is_pun
262+ | Some false -> false
263+ | Some true -> (
264+ vb.pvb_is_pun
265+ ||
266+ match (vb.pvb_pat.ppat_desc, vb.pvb_body) with
267+ | ( Ppat_var {txt= v; _}
268+ , Pfunction_body {pexp_desc= Pexp_ident {txt= Lident e; _}; _}
269+ ) ->
270+ String. equal v e
271+ | _ -> false )
272+ in
273+ (is_extension, {vb with pvb_is_pun})
274+ in
275+ let vbs' =
276+ { vbs with
277+ pvbs_bindings=
278+ snd @@ List. fold_map ~init: false ~f: punning vbs.pvbs_bindings }
279+ in
280+ Ast_mapper. default_mapper.value_bindings m vbs'
281+ in
250282 let pat m = function
251283 | {ppat_desc= Ppat_cons (_ :: _ :: _ :: _ as l); _} as p
252284 when match List. last_exn l with
@@ -315,7 +347,7 @@ module Parse = struct
315347 {p with pexp_desc= Pexp_tuple l}
316348 | e -> Ast_mapper. default_mapper.expr m e
317349 in
318- Ast_mapper. {default_mapper with expr; pat; binding_op}
350+ Ast_mapper. {default_mapper with expr; pat; binding_op; value_bindings }
319351
320352 let ast (type a ) (fg : a t ) ~ocaml_version ~preserve_beginend
321353 ~prefer_let_puns ~input_name str : a =
0 commit comments