Source file ppx_sexp_conv.ml
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
open Ppxlib
module Attrs = Ppx_sexp_conv_expander.Attrs
let register_extension name f =
let extension = Extension.declare name Expression Ast_pattern.(ptyp __) f in
Driver.register_transformation
("Ppxlib.Deriving." ^ name)
~rules:[ Context_free.Rule.extension extension ]
;;
module Sexp_grammar = struct
module E = Ppx_sexp_conv_expander.Sexp_grammar
let name = "sexp_grammar"
let flags = Deriving.Args.(empty +> flag "tags_of_doc_comments")
let str_type_decl = Deriving.Generator.V2.make flags E.str_type_decl
let sig_type_decl = Deriving.Generator.V2.make_noarg E.sig_type_decl
let deriver = Deriving.add name ~sig_type_decl ~str_type_decl
let expr_extension =
Extension.V3.declare
name
Expression
Ast_pattern.(ptyp __)
(E.core_type ~tags_of_doc_comments:true)
;;
let type_extension =
Extension.V3.declare name Core_type Ast_pattern.(ptyp __) E.type_extension
;;
let () =
Driver.register_transformation
"Ppxlib.Deriving.sexp_grammar"
~rules:
[ Context_free.Rule.extension expr_extension
; Context_free.Rule.extension type_extension
]
;;
end
module Sexp_of = struct
module E = Ppx_sexp_conv_expander.Sexp_of
let name = "sexp_of"
let str_type_decl =
Deriving.Generator.make_noarg
E.str_type_decl
~attributes:
[ Attribute.T Attrs.default
; Attribute.T Attrs.drop_default
; Attribute.T Attrs.drop_if
]
;;
let str_exception = Deriving.Generator.make_noarg E.str_exception
let sig_type_decl = Deriving.Generator.make_noarg E.sig_type_decl
let sig_exception = Deriving.Generator.make_noarg E.sig_exception
let deriver =
Deriving.add name ~str_type_decl ~str_exception ~sig_type_decl ~sig_exception
;;
let extension ~loc:_ ~path:_ ctyp = E.core_type ctyp
let () = register_extension name extension
let () =
Driver.register_transformation
name
~rules:
[ Context_free.Rule.extension
(Extension.declare
name
Core_type
Ast_pattern.(ptyp __)
(fun ~loc:_ ~path:_ ty -> E.type_extension ty))
]
;;
end
module Of_sexp = struct
module E = Ppx_sexp_conv_expander.Of_sexp
let name = "of_sexp"
let str_type_decl =
Deriving.Generator.make_noarg
(E.str_type_decl ~poly:false)
~attributes:[ Attribute.T Attrs.default ]
;;
let sig_type_decl = Deriving.Generator.make_noarg (E.sig_type_decl ~poly:false)
let deriver = Deriving.add name ~str_type_decl ~sig_type_decl
let extension ~loc:_ ~path ctyp = E.core_type ~path ctyp
let () = register_extension name extension
let () =
Driver.register_transformation
name
~rules:
[ Context_free.Rule.extension
(Extension.declare
name
Core_type
Ast_pattern.(ptyp __)
(fun ~loc:_ ~path:_ ty -> E.type_extension ty))
]
;;
end
module Of_sexp_poly = struct
module E = Ppx_sexp_conv_expander.Of_sexp
let str_type_decl =
Deriving.Generator.make_noarg
(E.str_type_decl ~poly:true)
~attributes:[ Attribute.T Attrs.default ]
;;
let sig_type_decl = Deriving.Generator.make_noarg (E.sig_type_decl ~poly:true)
let deriver = Deriving.add "of_sexp_poly" ~sig_type_decl ~str_type_decl
end
let sexp_of = Sexp_of.deriver
let of_sexp = Of_sexp.deriver
let of_sexp_poly = Of_sexp_poly.deriver
let sexp_grammar = Sexp_grammar.deriver
module Sexp_in_sig = struct
module E = Ppx_sexp_conv_expander.Sig_sexp
let sig_type_decl = Deriving.Generator.make_noarg E.sig_type_decl
let deriver =
Deriving.add
"ppx_sexp_conv: let this be a string that wouldn't parse if put in the source"
~sig_type_decl
;;
end
let sexp =
Deriving.add_alias
"sexp"
[ sexp_of; of_sexp ]
~sig_type_decl:[ Sexp_in_sig.deriver ]
~str_exception:[ sexp_of ]
~sig_exception:[ sexp_of ]
;;
let sexp_poly = Deriving.add_alias "sexp_poly" [ sexp_of; of_sexp_poly ]