11module Ext_name = struct
22 let ptyp_labeled_tuple = " ppxlib.migration.ptyp_labeled_tuple_504"
33 let pexp_labeled_tuple = " ppxlib.migration.pexp_labeled_tuple_504"
4+ let ppat_labeled_tuple = " ppxlib.migration.ppat_labeled_tuple_504"
45end
56
67let invalid_encoding ~loc name =
@@ -12,6 +13,9 @@ module type AST = sig
1213 type core_type_desc
1314 type expression
1415 type expression_desc
16+ type pattern
17+ type pattern_desc
18+ type closed_flag
1519
1620 module Construct : sig
1721 val ptyp_extension_desc : string Location .loc -> payload -> core_type_desc
@@ -26,6 +30,12 @@ module type AST = sig
2630 loc :Location .t -> string -> expression option -> expression
2731
2832 val pstr_eval : loc :Location .t -> expression -> payload
33+ val ppat_extension_desc : string Location .loc -> payload -> pattern_desc
34+ val ppat_tuple : loc :Location .t -> pattern list -> pattern
35+ val ppat_var : loc :Location .t -> string -> pattern
36+ val ppat_any : loc :Location .t -> pattern
37+ val ppat : pattern -> payload
38+ val closed_flag_to_string : closed_flag -> string
2939 end
3040
3141 module Destruct : sig
@@ -36,6 +46,11 @@ module type AST = sig
3646 val pstr_eval : payload -> expression option
3747 val pexp_tuple : expression -> expression list option
3848 val pexp_variant : expression -> (string * expression option ) option
49+ val ppat : payload -> pattern option
50+ val ppat_tuple : pattern -> pattern list option
51+ val ppat_var : pattern -> string option
52+ val ppat_any : pattern -> unit option
53+ val closed_flag_from_string : string -> closed_flag option
3954 end
4055end
4156
@@ -124,9 +139,66 @@ module Make (X : AST) = struct
124139 match res with
125140 | Some res -> res
126141 | None -> invalid_encoding ~loc Ext_name. pexp_labeled_tuple
142+
143+ let encode_ppat_labeled_tuple ~loc pats closed_flag =
144+ let payload =
145+ let flag =
146+ let s = X.Construct. closed_flag_to_string closed_flag in
147+ X.Construct. ppat_var ~loc s
148+ in
149+ let pats =
150+ let l =
151+ List. map
152+ (fun (label_opt , pat ) ->
153+ let label =
154+ match label_opt with
155+ | None -> X.Construct. ppat_any ~loc
156+ | Some s -> X.Construct. ppat_var ~loc s
157+ in
158+ X.Construct. ppat_tuple ~loc [ label; pat ])
159+ pats
160+ in
161+ X.Construct. ppat_tuple ~loc l
162+ in
163+ X.Construct. ppat_tuple ~loc [ pats; flag ]
164+ in
165+ X.Construct. ppat_extension_desc
166+ { txt = Ext_name. ppat_labeled_tuple; loc }
167+ (X.Construct. ppat payload)
168+
169+ let decode_ppat_labeled_tuple ~loc payload =
170+ let open Stdlib0.Option.Op in
171+ let res =
172+ let * pat = X.Destruct. ppat payload in
173+ let * pats_and_flag = X.Destruct. ppat_tuple pat in
174+ match pats_and_flag with
175+ | [ pats; flag ] ->
176+ let * flag_s = X.Destruct. ppat_var flag in
177+ let * closed_flag = X.Destruct. closed_flag_from_string flag_s in
178+ let * pat_list = X.Destruct. ppat_tuple pats in
179+ let * pats =
180+ Stdlib0.Option.List. map pat_list ~f: (fun pat ->
181+ let * pat_pair = X.Destruct. ppat_tuple pat in
182+ match pat_pair with
183+ | [ label; pat ] -> (
184+ match
185+ (X.Destruct. ppat_var label, X.Destruct. ppat_any label)
186+ with
187+ | Some s , _ -> Some (Some s, pat)
188+ | _ , Some () -> Some (None , pat)
189+ | None , None -> None )
190+ | _ -> None )
191+ in
192+ Some (pats, closed_flag)
193+ | _ -> None
194+ in
195+ match res with
196+ | Some res -> res
197+ | None -> invalid_encoding ~loc Ext_name. ppat_labeled_tuple
127198end
128199
129200module Ast_503 = struct
201+ include Ast_503. Asttypes
130202 include Ast_503. Parsetree
131203
132204 module Construct = struct
@@ -136,6 +208,9 @@ module Ast_503 = struct
136208 let expression ~loc pexp_desc =
137209 { pexp_desc; pexp_loc = loc; pexp_attributes = [] ; pexp_loc_stack = [] }
138210
211+ let pattern ~loc ppat_desc =
212+ { ppat_desc; ppat_loc = loc; ppat_attributes = [] ; ppat_loc_stack = [] }
213+
139214 let ptyp_extension_desc name payload = Ptyp_extension (name, payload)
140215 let ptyp_tuple ~loc typs = core_type ~loc (Ptyp_tuple typs)
141216 let ptyp_var ~loc s = core_type ~loc (Ptyp_var s)
@@ -149,6 +224,13 @@ module Ast_503 = struct
149224
150225 let pstr_eval ~loc expr =
151226 PStr [ { pstr_desc = Pstr_eval (expr, [] ); pstr_loc = loc } ]
227+
228+ let ppat_extension_desc name payload = Ppat_extension (name, payload)
229+ let ppat_tuple ~loc l = pattern ~loc (Ppat_tuple l)
230+ let ppat_var ~loc txt = pattern ~loc (Ppat_var { txt; loc })
231+ let ppat_any ~loc = pattern ~loc Ppat_any
232+ let ppat pat = PPat (pat, None )
233+ let closed_flag_to_string = function Closed -> " closed_" | Open -> " open_"
152234 end
153235
154236 module Destruct = struct
@@ -175,10 +257,28 @@ module Ast_503 = struct
175257 let pexp_variant = function
176258 | { pexp_desc = Pexp_variant (s , e ); _ } -> Some (s, e)
177259 | _ -> None
260+
261+ let ppat = function PPat (pat , None ) -> Some pat | _ -> None
262+
263+ let ppat_tuple = function
264+ | { ppat_desc = Ppat_tuple pats ; _ } -> Some pats
265+ | _ -> None
266+
267+ let ppat_var = function
268+ | { ppat_desc = Ppat_var { txt; _ } ; _ } -> Some txt
269+ | _ -> None
270+
271+ let ppat_any = function { ppat_desc = Ppat_any ; _ } -> Some () | _ -> None
272+
273+ let closed_flag_from_string = function
274+ | "closed_" -> Some Closed
275+ | "open_" -> Some Open
276+ | _ -> None
178277 end
179278end
180279
181280module Ast_502 = struct
281+ include Ast_502. Asttypes
182282 include Ast_502. Parsetree
183283
184284 module Construct = struct
@@ -188,6 +288,9 @@ module Ast_502 = struct
188288 let expression ~loc pexp_desc =
189289 { pexp_desc; pexp_loc = loc; pexp_attributes = [] ; pexp_loc_stack = [] }
190290
291+ let pattern ~loc ppat_desc =
292+ { ppat_desc; ppat_loc = loc; ppat_attributes = [] ; ppat_loc_stack = [] }
293+
191294 let ptyp_extension_desc name payload = Ptyp_extension (name, payload)
192295 let ptyp_tuple ~loc typs = core_type ~loc (Ptyp_tuple typs)
193296 let ptyp_var ~loc s = core_type ~loc (Ptyp_var s)
@@ -201,6 +304,13 @@ module Ast_502 = struct
201304
202305 let pstr_eval ~loc expr =
203306 PStr [ { pstr_desc = Pstr_eval (expr, [] ); pstr_loc = loc } ]
307+
308+ let ppat_extension_desc name payload = Ppat_extension (name, payload)
309+ let ppat_tuple ~loc l = pattern ~loc (Ppat_tuple l)
310+ let ppat_var ~loc txt = pattern ~loc (Ppat_var { txt; loc })
311+ let ppat_any ~loc = pattern ~loc Ppat_any
312+ let ppat pat = PPat (pat, None )
313+ let closed_flag_to_string = function Closed -> " closed_" | Open -> " open_"
204314 end
205315
206316 module Destruct = struct
@@ -227,6 +337,23 @@ module Ast_502 = struct
227337 let pexp_variant = function
228338 | { pexp_desc = Pexp_variant (s , e ); _ } -> Some (s, e)
229339 | _ -> None
340+
341+ let ppat = function PPat (pat , None ) -> Some pat | _ -> None
342+
343+ let ppat_tuple = function
344+ | { ppat_desc = Ppat_tuple pats ; _ } -> Some pats
345+ | _ -> None
346+
347+ let ppat_var = function
348+ | { ppat_desc = Ppat_var { txt; _ } ; _ } -> Some txt
349+ | _ -> None
350+
351+ let ppat_any = function { ppat_desc = Ppat_any ; _ } -> Some () | _ -> None
352+
353+ let closed_flag_from_string = function
354+ | "closed_" -> Some Closed
355+ | "open_" -> Some Open
356+ | _ -> None
230357 end
231358end
232359
0 commit comments