@@ -34,25 +34,64 @@ let transformation =
34
34
35
35
method! structure_item item acc =
36
36
match item.pstr_desc with
37
+ | Pstr_type (rec_flag , type_decls ) ->
38
+ let needs_transformation =
39
+ List. exists
40
+ (fun td ->
41
+ match td.ptype_manifest with
42
+ | Some { ptyp_desc = Ptyp_extension ({ txt = "pcre" | "mikmatch" ; _ } , _ ); _ } -> true
43
+ | _ -> false )
44
+ type_decls
45
+ in
46
+
47
+ if not needs_transformation then super#structure_item item acc
48
+ else (
49
+ let all_items =
50
+ List. fold_left
51
+ (fun items_acc td ->
52
+ match td.ptype_manifest with
53
+ (* type ... = {%mikmatch| ... |} * )
54
+ | Some
55
+ {
56
+ ptyp_desc =
57
+ Ptyp_extension
58
+ ( { txt = (" pcre" | " mikmatch" ) as ext; loc },
59
+ PStr [ { pstr_desc = Pstr_eval ({ pexp_desc = Pexp_constant (Pconst_string (pattern_str, _, _)); _ }, _); _ } ]
60
+ );
61
+ _;
62
+ } ->
63
+ let mode = if ext = " pcre" then `Pcre else `Mik in
64
+ let type_name = td.ptype_name.txt in
65
+ let bindings = Transformations. transform_type ~mode ~loc rec_flag type_name pattern_str td in
66
+ items_acc @ bindings
67
+ | _ -> items_acc)
68
+ [] type_decls
69
+ in
70
+
71
+ let wrapped = pstr_include ~loc: item.pstr_loc (include_infos ~loc: item.pstr_loc (pmod_structure ~loc: item.pstr_loc all_items)) in
72
+
73
+ wrapped, acc)
37
74
(* let%mik/%pcre x = {|some regex|}*)
38
75
| Pstr_extension (({ txt = ("pcre" | "mikmatch" ) as ext ; _ } , PStr [ { pstr_desc = Pstr_value (rec_flag, vbs); _ } ]), _ ) ->
39
76
let mode = if ext = " pcre" then `Pcre else `Mik in
40
77
let processed_vbs, collected_bindings =
41
78
List. fold_left
42
- (fun (vbs_acc , bindings_acc ) vb ->
43
- match vb.pvb_pat.ppat_desc, vb.pvb_expr.pexp_desc with
44
- (* pattern definition - let % mikmatch /% pcre name = {|/regex/|} * )
45
- | Ppat_var { txt = var_name ; loc } , Pexp_constant (Pconst_string (_ , _ , _ )) ->
46
- let binding = Transformations. transform_let ~mode vb in
47
- let alias = make_alias_binding ~loc ~var_name in
48
- alias :: vbs_acc, binding :: bindings_acc
49
- (* destructuring - let%mikmatch {|/pattern/|} = expr *)
50
- | Ppat_constant (Pconst_string (pattern_str , _ , _ )), _ ->
51
- let new_vb, new_bindings = Transformations. transform_destructuring_let ~mode ~loc: vb.pvb_loc pattern_str vb.pvb_expr in
52
- new_vb :: vbs_acc, new_bindings @ bindings_acc
53
- | _ ->
54
- let binding = Transformations. transform_let ~mode vb in
55
- binding :: vbs_acc, binding :: bindings_acc)
79
+ begin
80
+ fun (vbs_acc , bindings_acc ) vb ->
81
+ match vb.pvb_pat.ppat_desc, vb.pvb_expr.pexp_desc with
82
+ (* pattern definition - let % mikmatch /% pcre name = {|/regex/|} * )
83
+ | Ppat_var { txt = var_name ; loc } , Pexp_constant (Pconst_string (_ , _ , _ )) ->
84
+ let binding = Transformations. transform_let ~mode vb in
85
+ let alias = make_alias_binding ~loc ~var_name in
86
+ alias :: vbs_acc, binding :: bindings_acc
87
+ (* destructuring - let%mikmatch {|/pattern/|} = expr *)
88
+ | Ppat_constant (Pconst_string (pattern_str , _ , _ )), _ ->
89
+ let new_vb, new_bindings = Transformations. transform_destructuring_let ~mode ~loc: vb.pvb_loc pattern_str vb.pvb_expr in
90
+ new_vb :: vbs_acc, new_bindings @ bindings_acc
91
+ | _ ->
92
+ let binding = Transformations. transform_let ~mode vb in
93
+ binding :: vbs_acc, binding :: bindings_acc
94
+ end
56
95
([] , acc) vbs
57
96
in
58
97
0 commit comments