Skip to content

Commit 5525fe6

Browse files
committed
Fixes #282: ppx_op: lift ~config applications out of functions; also fixes matching of ~config params
(That was a biggish bug.)
1 parent 736dc5a commit 5525fe6

File tree

4 files changed

+1282
-10
lines changed

4 files changed

+1282
-10
lines changed

lib/ppx_op.ml

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,25 @@ let make_vb_nd ~has_config ~loc ~str_loc ?axis_labels ~ident ~init_nd string =
5858
let vb = Ast_helper.Vb.mk ~loc pat v in
5959
(pat, vb)
6060

61-
let rec translate ~is_toplevel ~has_config ?label expr =
61+
let lift_config_vb ~loop ~num_configs ?label ~expr1 ~c_expr arg_exprs =
62+
let vbs1, e1 = loop ?label expr1 in
63+
let vbss, es = List.unzip @@ List.map arg_exprs ~f:loop in
64+
let ident = "config_block__" ^ Int.to_string !num_configs in
65+
Int.incr num_configs;
66+
let loc = expr1.pexp_loc in
67+
let pat = Ast_helper.Pat.var ~loc { loc = c_expr.pexp_loc; txt = ident } in
68+
let v = [%expr [%e e1] ~config:[%e c_expr]] in
69+
let vb = Ast_helper.Vb.mk ~loc pat v in
70+
( Map.add_exn ~key:ident ~data:vb @@ reduce_vbss (vbs1 :: vbss),
71+
match es with
72+
| [] -> [%expr [%e pat2expr pat]]
73+
| [ e2 ] -> [%expr [%e pat2expr pat] [%e e2]]
74+
| [ e2; e3 ] -> [%expr [%e pat2expr pat] [%e e2] [%e e3]]
75+
| _ -> assert false )
76+
77+
let rec translate ~num_configs ~is_toplevel ~has_config ?label expr =
6278
let loc = expr.pexp_loc in
63-
let loop = translate ~is_toplevel:false ~has_config in
79+
let loop = translate ~num_configs ~is_toplevel:false ~has_config in
6480
match expr with
6581
| { pexp_desc = Pexp_constant (Pconst_float _); _ } ->
6682
(no_vbs, [%expr TDSL.number ?label:[%e opt_expr ~loc label] [%e expr]])
@@ -130,6 +146,12 @@ let rec translate ~is_toplevel ~has_config ?label expr =
130146
| [%expr [%e? expr1] **. [%e? expr2]] ->
131147
let vbs, e1 = loop expr1 in
132148
(vbs, [%expr TDSL.O.( **. ) ?label:[%e opt_expr ~loc label] [%e e1] [%e expr2]])
149+
| [%expr [%e? expr1] ~config:[%e? c_expr] [%e? expr2] [%e? expr3]] ->
150+
lift_config_vb ~loop ~num_configs ?label ~expr1 ~c_expr [ expr2; expr3 ]
151+
| [%expr [%e? expr1] ~config:[%e? c_expr] [%e? expr2]] ->
152+
lift_config_vb ~loop ~num_configs ?label ~expr1 ~c_expr [ expr2 ]
153+
| [%expr [%e? expr1] ~config:[%e? c_expr]] ->
154+
lift_config_vb ~loop ~num_configs ?label ~expr1 ~c_expr []
133155
| [%expr [%e? expr1] [%e? expr2] [%e? expr3]] ->
134156
let vbs1, e1 = loop ?label expr1 in
135157
let vbs2, e2 = loop expr2 in
@@ -138,13 +160,11 @@ let rec translate ~is_toplevel ~has_config ?label expr =
138160
| [%expr [%e? expr1] [%e? expr2]] ->
139161
let vbs1, e1 = loop ?label expr1 in
140162
let vbs2, e2 = loop expr2 in
141-
(Map.merge_skewed vbs1 vbs2 ~combine:(fun ~key:_ _v1 v2 -> v2), [%expr [%e e1] [%e e2]])
142-
| [%expr fun ~config -> [%e? body]] ->
143-
let vbs, body = translate ~is_toplevel:true ~has_config:true ?label body in
144-
(no_vbs, [%expr fun ~config -> [%e let_opt ~loc vbs body]])
145-
| [%expr fun ~(config : [%typ? config_ty]) -> [%e? body]] ->
146-
let vbs, body = translate ~is_toplevel:true ~has_config:true ?label body in
147-
(no_vbs, [%expr fun ~(config : [%typ ty]) -> [%e let_opt ~loc vbs body]])
163+
(reduce_vbss [ vbs1; vbs2 ], [%expr [%e e1] [%e e2]])
164+
| { pexp_desc = Pexp_fun (Labelled "config", c_e, c_pat, body); _ } ->
165+
let vbs, body = translate ~num_configs ~is_toplevel:true ~has_config:true ?label body in
166+
let body = let_opt ~loc vbs body in
167+
(no_vbs, {expr with pexp_desc = Pexp_fun (Labelled "config", c_e, c_pat, body)})
148168
| [%expr fun [%p? pat] -> [%e? body]] when is_toplevel ->
149169
let input_label =
150170
let loc = pat.ppat_loc in
@@ -240,7 +260,7 @@ let rec translate ~is_toplevel ~has_config ?label expr =
240260

241261
let translate ?ident_label expr =
242262
let vbs, expr =
243-
translate ~is_toplevel:true ~has_config:false
263+
translate ~num_configs:(ref 0) ~is_toplevel:true ~has_config:false
244264
~label:(opt_pat2string_list ~loc:expr.pexp_loc ident_label)
245265
expr
246266
in

0 commit comments

Comments
 (0)