11module Ext_name = struct
22 let ptyp_labeled_tuple = " ppxlib.migration.ptyp_labeled_tuple_504"
3+ let pexp_labeled_tuple = " ppxlib.migration.pexp_labeled_tuple_504"
34end
45
6+ let invalid_encoding ~loc name =
7+ Location. raise_errorf ~loc " Invalid %s encoding" name
8+
59module type AST = sig
610 type payload
711 type core_type
812 type core_type_desc
13+ type expression
14+ type expression_desc
915
1016 module Construct : sig
1117 val ptyp_extension_desc : string Location .loc -> payload -> core_type_desc
1218 val ptyp_tuple : loc :Location .t -> core_type list -> core_type
1319 val ptyp_var : loc :Location .t -> string -> core_type
1420 val ptyp_any : loc :Location .t -> core_type
1521 val ptyp : core_type -> payload
22+ val pexp_extension_desc : string Location .loc -> payload -> expression_desc
23+ val pexp_tuple : loc :Location .t -> expression list -> expression
24+
25+ val pexp_variant :
26+ loc :Location .t -> string -> expression option -> expression
27+
28+ val pstr_eval : loc :Location .t -> expression -> payload
1629 end
1730
1831 module Destruct : sig
1932 val ptyp : payload -> core_type option
2033 val ptyp_tuple : core_type -> core_type list option
2134 val ptyp_var : core_type -> string option
2235 val ptyp_any : core_type -> unit option
36+ val pstr_eval : payload -> expression option
37+ val pexp_tuple : expression -> expression list option
38+ val pexp_variant : expression -> (string * expression option ) option
2339 end
2440end
2541
26- module type S = sig
27- type payload
28- type core_type
29- type core_type_desc
30-
31- val encode_ptyp_labeled_tuple :
32- loc :Location .t -> (string option * core_type ) list -> core_type_desc
33-
34- val decode_ptyp_labeled_tuple :
35- loc :Location .t -> payload -> (string option * core_type ) list
36- end
37-
38- module Make (X : AST ) :
39- S
40- with type core_type = X. core_type
41- and type core_type_desc = X. core_type_desc
42- and type payload = X. payload = struct
43- type payload = X .payload
44- type core_type = X .core_type
45- type core_type_desc = X .core_type_desc
46-
42+ module Make (X : AST ) = struct
4743 let encode_ptyp_labeled_tuple ~loc args =
4844 let payload =
4945 let l =
@@ -80,9 +76,54 @@ module Make (X : AST) :
8076 in
8177 match res with
8278 | Some res -> res
83- | None ->
84- Location. raise_errorf ~loc " Invalid %s encoding"
85- Ext_name. ptyp_labeled_tuple
79+ | None -> invalid_encoding ~loc Ext_name. ptyp_labeled_tuple
80+
81+ let encode_pexp_labeled_tuple ~loc args =
82+ let payload =
83+ let l =
84+ List. map
85+ (fun (label_opt , expr ) ->
86+ let label =
87+ match label_opt with
88+ | None -> X.Construct. pexp_variant ~loc " None" None
89+ | Some s ->
90+ let string_as_variant =
91+ X.Construct. pexp_variant ~loc s None
92+ in
93+ X.Construct. pexp_variant ~loc " Some" (Some string_as_variant)
94+ in
95+ X.Construct. pexp_tuple ~loc [ label; expr ])
96+ args
97+ in
98+ X.Construct. pexp_tuple ~loc l
99+ in
100+ X.Construct. pexp_extension_desc
101+ { txt = Ext_name. pexp_labeled_tuple; loc }
102+ (X.Construct. pstr_eval ~loc payload)
103+
104+ let decode_pexp_labeled_tuple ~loc payload =
105+ let open Stdlib0.Option.Op in
106+ let res =
107+ let * exp = X.Destruct. pstr_eval payload in
108+ let * exp_list = X.Destruct. pexp_tuple exp in
109+ Stdlib0.Option.List. map exp_list ~f: (fun exp ->
110+ let * exp_pair = X.Destruct. pexp_tuple exp in
111+ match exp_pair with
112+ | [ label; exp ] -> (
113+ let * opt_variant = X.Destruct. pexp_variant label in
114+ match opt_variant with
115+ | "None" , None -> Some (None , exp)
116+ | "Some" , Some exp' -> (
117+ let * label_variant = X.Destruct. pexp_variant exp' in
118+ match label_variant with
119+ | s , None -> Some (Some s, exp)
120+ | _ , _ -> None )
121+ | _ -> None )
122+ | _ -> None )
123+ in
124+ match res with
125+ | Some res -> res
126+ | None -> invalid_encoding ~loc Ext_name. pexp_labeled_tuple
86127end
87128
88129module Ast_503 = struct
@@ -92,11 +133,22 @@ module Ast_503 = struct
92133 let core_type ~loc ptyp_desc =
93134 { ptyp_desc; ptyp_loc = loc; ptyp_attributes = [] ; ptyp_loc_stack = [] }
94135
136+ let expression ~loc pexp_desc =
137+ { pexp_desc; pexp_loc = loc; pexp_attributes = [] ; pexp_loc_stack = [] }
138+
95139 let ptyp_extension_desc name payload = Ptyp_extension (name, payload)
96140 let ptyp_tuple ~loc typs = core_type ~loc (Ptyp_tuple typs)
97141 let ptyp_var ~loc s = core_type ~loc (Ptyp_var s)
98142 let ptyp_any ~loc = core_type ~loc Ptyp_any
99143 let ptyp typ = PTyp typ
144+ let pexp_extension_desc name payload = Pexp_extension (name, payload)
145+ let pexp_tuple ~loc l = expression ~loc (Pexp_tuple l)
146+
147+ let pexp_variant ~loc v exp_opt =
148+ expression ~loc (Pexp_variant (v, exp_opt))
149+
150+ let pstr_eval ~loc expr =
151+ PStr [ { pstr_desc = Pstr_eval (expr, [] ); pstr_loc = loc } ]
100152 end
101153
102154 module Destruct = struct
@@ -111,6 +163,18 @@ module Ast_503 = struct
111163 | _ -> None
112164
113165 let ptyp_any = function { ptyp_desc = Ptyp_any ; _ } -> Some () | _ -> None
166+
167+ let pstr_eval = function
168+ | PStr [ { pstr_desc = Pstr_eval (expr, [] ); _ } ] -> Some expr
169+ | _ -> None
170+
171+ let pexp_tuple = function
172+ | { pexp_desc = Pexp_tuple l ; _ } -> Some l
173+ | _ -> None
174+
175+ let pexp_variant = function
176+ | { pexp_desc = Pexp_variant (s , e ); _ } -> Some (s, e)
177+ | _ -> None
114178 end
115179end
116180
@@ -121,11 +185,22 @@ module Ast_502 = struct
121185 let core_type ~loc ptyp_desc =
122186 { ptyp_desc; ptyp_loc = loc; ptyp_attributes = [] ; ptyp_loc_stack = [] }
123187
188+ let expression ~loc pexp_desc =
189+ { pexp_desc; pexp_loc = loc; pexp_attributes = [] ; pexp_loc_stack = [] }
190+
124191 let ptyp_extension_desc name payload = Ptyp_extension (name, payload)
125192 let ptyp_tuple ~loc typs = core_type ~loc (Ptyp_tuple typs)
126193 let ptyp_var ~loc s = core_type ~loc (Ptyp_var s)
127194 let ptyp_any ~loc = core_type ~loc Ptyp_any
128195 let ptyp typ = PTyp typ
196+ let pexp_extension_desc name payload = Pexp_extension (name, payload)
197+ let pexp_tuple ~loc l = expression ~loc (Pexp_tuple l)
198+
199+ let pexp_variant ~loc v exp_opt =
200+ expression ~loc (Pexp_variant (v, exp_opt))
201+
202+ let pstr_eval ~loc expr =
203+ PStr [ { pstr_desc = Pstr_eval (expr, [] ); pstr_loc = loc } ]
129204 end
130205
131206 module Destruct = struct
@@ -140,6 +215,18 @@ module Ast_502 = struct
140215 | _ -> None
141216
142217 let ptyp_any = function { ptyp_desc = Ptyp_any ; _ } -> Some () | _ -> None
218+
219+ let pstr_eval = function
220+ | PStr [ { pstr_desc = Pstr_eval (expr, [] ); _ } ] -> Some expr
221+ | _ -> None
222+
223+ let pexp_tuple = function
224+ | { pexp_desc = Pexp_tuple l ; _ } -> Some l
225+ | _ -> None
226+
227+ let pexp_variant = function
228+ | { pexp_desc = Pexp_variant (s , e ); _ } -> Some (s, e)
229+ | _ -> None
143230 end
144231end
145232
0 commit comments