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