@@ -30,7 +30,7 @@ module Of_json = struct
3030 Option. value ~default: n (ld_attr_json_key ld)
3131 in
3232 let handle_field fs ld =
33- ( map_loc lident ld.pld_name,
33+ ( ld.pld_name,
3434 let n = field_key ld in
3535 [% expr
3636 match
@@ -62,10 +62,8 @@ module Of_json = struct
6262 [% expr
6363 let fs = (Obj. magic [% e x] : [%t build_js_type ~loc fs] ) in
6464 [% e
65- make
66- (pexp_record ~loc
67- (List. map fs ~f: (handle_field [% expr fs]))
68- None )]]
65+ let fs = List. map fs ~f: (handle_field [% expr fs]) in
66+ make ~loc fs]]
6967 in
7068 if allow_extra_fields then body
7169 else
@@ -136,10 +134,28 @@ module Of_json = struct
136134 let derive_of_record derive t x =
137135 let loc = t.rcd_loc in
138136 let allow_extra_fields = td_allow_extra_fields t.rcd_ctx in
137+ let make ~loc fs =
138+ let fs = List. map fs ~f: (fun (n , v ) -> map_loc lident n, v) in
139+ pexp_record ~loc fs None
140+ in
139141 [% expr
140142 [% e ensure_json_object ~loc x];
141143 [% e
142- build_record ~allow_extra_fields ~loc derive t.rcd_fields x Fun. id]]
144+ build_record ~allow_extra_fields ~loc derive t.rcd_fields x make]]
145+
146+ let derive_of_labeled_tuple derive t x =
147+ let loc = t.rcd_loc in
148+ let make ~loc fs =
149+ let fs =
150+ List. map fs ~f: (fun (n , v ) -> labeled_tuple_arg_label n, v)
151+ in
152+ pexp_labeled_tuple ~loc fs
153+ in
154+ [% expr
155+ [% e ensure_json_object ~loc x];
156+ [% e
157+ build_record ~allow_extra_fields: true ~loc derive t.rcd_fields x
158+ make]]
143159
144160 let derive_of_variant ?(is_compact_variants = false ) _derive t
145161 ~allow_any_constr body x =
@@ -235,6 +251,10 @@ module Of_json = struct
235251 | Vcs_record (n , r ) ->
236252 let loc = n.loc in
237253 let n = Option. value ~default: n (vcs_attr_json_name r.rcd_ctx) in
254+ let make ~loc fs =
255+ let fs = List. map fs ~f: (fun (n , v ) -> map_loc lident n, v) in
256+ make (Some (pexp_record ~loc fs None ))
257+ in
238258 [% expr
239259 if Stdlib. ( = ) [% e tag] [% e estring ~loc: n.loc n.txt] then
240260 [% e
@@ -251,7 +271,7 @@ module Of_json = struct
251271 | Vcs_ctx_polyvariant _ -> true
252272 in
253273 build_record ~allow_extra_fields ~loc derive
254- r.rcd_fields [% expr fs] ( fun e -> make ( Some e)) ]]]
274+ r.rcd_fields [% expr fs] make]]]
255275 else [% e next]]
256276 | Vcs_tuple (n , t ) ->
257277 let loc = n.loc in
@@ -284,7 +304,7 @@ module Of_json = struct
284304 deriving_of () ~name: " of_json"
285305 ~of_t: (fun ~loc -> [% type : Js.Json. t])
286306 ~is_allow_any_constr ~derive_of_tuple ~derive_of_record
287- ~derive_of_variant ~derive_of_variant_case
307+ ~derive_of_labeled_tuple ~ derive_of_variant ~derive_of_variant_case
288308end
289309
290310module To_json = struct
@@ -419,7 +439,8 @@ module To_json = struct
419439 let deriving : Ppx_deriving_tools.deriving =
420440 deriving_to () ~name: " to_json"
421441 ~t_to: (fun ~loc -> [% type : Js.Json. t])
422- ~derive_of_tuple ~derive_of_record ~derive_of_variant_case
442+ ~derive_of_tuple ~derive_of_labeled_tuple: derive_of_record
443+ ~derive_of_record ~derive_of_variant_case
423444end
424445
425446let () =
0 commit comments