1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
open Base
open Printf
let meth_of_constr = sprintf "c_%s"
let self_arg_name = "fself"
let self_typ_param_name = "self"
let gcata_name_for_typ name = Printf.sprintf "gcata_%s" name
let class_name_for_typ name = Printf.sprintf "%s_t" name
let trait_class_name_for_typ ~trait name =
class_name_for_typ
(if String.equal trait "" then name else Printf.sprintf "%s_%s" trait name)
;;
let fix_name ~plugin_name:_ = sprintf "%s_fix"
let typ1_for_class_arg ~plugin = sprintf "%s_t_%s_1" plugin
let trf_field ~plugin = sprintf "%s_%s_trf" plugin
let mut_ofield ~plugin = sprintf "%s_o%s_func" plugin
let typ3_for_class_arg ~plugin_name = sprintf "%s_t_%s_3" plugin_name
let mut_oclass_field ~plugin = sprintf "%s_%s_func" plugin
let = "extra"
let self_arg_name = "fself"
let all_trfs_together = "all_trfs_together"
let = sprintf "%s_%s" extra_param_name
open Ppxlib
let meth_name_for_record tdecl = sprintf "do_%s" tdecl.ptype_name.txt
let fix_result_record trait tdecls =
assert (List.length tdecls > 0);
let name = (List.hd_exn tdecls).ptype_name.txt in
String.concat ~sep:"_" [ trait; "fix"; name ]
;;
let trf_function trait s = Printf.sprintf "%s_%s" trait s
let make_stub_class_name ~plugin tname = sprintf "%s_%s_t_stub" plugin tname
let stub_class_name ~plugin tdecl = make_stub_class_name ~plugin tdecl.ptype_name.txt
let init_trf_function trait s = trf_function trait s ^ "_0"
let make_fix_name tdecls =
assert (List.length tdecls > 0);
let name = (List.hd_exn tdecls).ptype_name.txt in
String.concat ~sep:"_" [ "fix"; name ]
;;
let name_fix_generated_object ~plugin tdecl =
sprintf "%s_o_%s" plugin tdecl.ptype_name.txt
;;
let prereq_name ~plugin tail = sprintf "%s_%s_prereq" plugin tail
let mut_arg_composite = "call"
let mut_arg_name ~plugin = sprintf "for_%s_%s" plugin
let fix_result tdecl = sprintf "fix_result_%s" tdecl.ptype_name.txt
let cname_index typname = String.capitalize typname
let mutuals_pack = "_mutuals_pack"
let hack_index_name tdecls s =
assert (List.length tdecls > 0);
sprintf "%s_%s" s (List.hd_exn tdecls).ptype_name.txt
;;
let fix_func_name ?for_ trait =
match for_ with
| None -> sprintf "%s_fix" trait
| Some s -> sprintf "%s_%s_fix" trait s
;;
let fix_func_name_tdecls trait tdecls =
assert (List.length tdecls > 0);
fix_func_name ~for_:(List.hd_exn tdecls).ptype_name.txt trait
;;
let for_ trait s = sprintf "%s_%s" trait s
let meth_name_for_constructor attrs default_name =
let good_attr =
let open Deriving.Args in
attribute ~name:(string "name") ~payload:(single_expr_payload (estring __))
in
let cond attr =
Deriving.Args.parse good_attr Ppxlib.Location.none attr (fun s ->
Some s)
in
List.find_map attrs ~f:cond |> Option.value ~default:default_name |> meth_of_constr
;;