@@ -238,15 +238,49 @@ 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; _} , Pexp_ident {txt = Lident e ; _} ->
245+ String. equal txt 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+ (* [and] nodes don't have extensions, so we need to track if the
256+ earlier [let] did *)
257+ is_extension || Option. is_some vb.pvb_attributes.attrs_extension
258+ in
259+ let pvb_is_pun =
260+ is_extension
261+ &&
262+ match prefer_let_puns with
263+ | None -> vb.pvb_is_pun
264+ | Some false -> false
265+ | Some true -> (
266+ vb.pvb_is_pun
267+ ||
268+ match (vb.pvb_pat.ppat_desc, vb.pvb_body) with
269+ | ( Ppat_var {txt; _}
270+ , Pfunction_body {pexp_desc= Pexp_ident {txt= Lident e; _}; _}
271+ ) ->
272+ String. equal txt e
273+ | _ -> false )
274+ in
275+ (is_extension, {vb with pvb_is_pun})
276+ in
277+ let vbs' =
278+ { vbs with
279+ pvbs_bindings=
280+ snd @@ List. fold_map ~init: false ~f: punning vbs.pvbs_bindings }
281+ in
282+ Ast_mapper. default_mapper.value_bindings m vbs'
283+ in
250284 let pat m = function
251285 | {ppat_desc= Ppat_cons (_ :: _ :: _ :: _ as l); _} as p
252286 when match List. last_exn l with
@@ -315,7 +349,7 @@ module Parse = struct
315349 {p with pexp_desc= Pexp_tuple l}
316350 | e -> Ast_mapper. default_mapper.expr m e
317351 in
318- Ast_mapper. {default_mapper with expr; pat; binding_op}
352+ Ast_mapper. {default_mapper with expr; pat; binding_op; value_bindings }
319353
320354 let ast (type a ) (fg : a t ) ~ocaml_version ~preserve_beginend
321355 ~prefer_let_puns ~input_name str : a =
0 commit comments