@@ -6,14 +6,15 @@ let mustache_from_file file =
66 let chan = open_in file in
77 let lex = Lexing. from_channel chan in
88 Location. init lex file ;
9- let t = Mustache. parse_lx lex in
9+ let t = Mustache.With_locations. parse_lx lex in
1010 close_in chan ;
1111 t
1212
13- let mustache_from_string ~loc string =
13+ let mustache_from_string ~lexloc string =
1414 let lex = Lexing. from_string string in
15- lex.Lexing. lex_curr_p < - loc ;
16- Mustache. parse_lx lex
15+ lex.Lexing. lex_start_p < - lexloc ;
16+ lex.Lexing. lex_curr_p < - lexloc ;
17+ Mustache.With_locations. parse_lx lex
1718
1819let antiquot_pcdata ~loc ~lang var =
1920 let pcdata = Ppx_common. make ~loc lang " pcdata" in
7071
7172module Template = struct
7273
73- type t = desc list
74+ type t = desc Location .loc list
7475 and desc =
7576 | Markup of string
7677 | Pcdata of string
@@ -82,17 +83,23 @@ module Template = struct
8283 contents : t ;
8384 }
8485
86+ let mkloc {Mustache.With_locations. loc_start ; loc_end } txt =
87+ let loc = {Location. loc_ghost = true ; loc_start ; loc_end} in
88+ [{Location. loc ; txt}]
89+
8590 let rec of_mustache resolve =
86- Mustache. fold
87- ~string: (fun x -> [ Markup x] )
91+ Mustache.With_locations. fold
92+ ~string: (fun ~ loc x -> mkloc loc @@ Markup x)
8893 ~section:
89- (fun ~inverted name contents -> [Section { inverted ; name ; contents }])
90- ~escaped: (fun x -> [Pcdata x])
91- ~unescaped: (fun x -> [Expr x])
94+ (fun ~loc ~inverted name contents ->
95+ mkloc loc @@ Section { inverted ; name ; contents})
96+ ~escaped: (fun ~loc x -> mkloc loc @@ Pcdata x)
97+ ~unescaped: (fun ~loc x -> mkloc loc @@ Expr x)
9298 ~partial:
93- (fun s -> of_mustache resolve @@ mustache_from_file @@ resolve s)
94- ~comment: (fun _ -> [] )
95- ~concat: List. concat
99+ (fun ~loc :_ s ->
100+ of_mustache resolve @@ mustache_from_file @@ resolve s)
101+ ~comment: (fun ~loc :_ _ -> [] )
102+ ~concat: (fun ~loc :_ l -> List. concat l)
96103
97104 let bindings ~env ~sec_env ~id =
98105 let f s b b' = match b, b' with
@@ -108,9 +115,9 @@ module Template = struct
108115 in
109116 Exp. let_ Asttypes. Nonrecursive @@ Var.Env. fold make_binding env []
110117
111- let rec desc_to_expr ~loc ~ lang env t =
118+ let rec desc_to_expr ~lang env { Location. txt; loc} =
112119 Ast_helper. default_loc := loc ;
113- match (t : desc ) with
120+ match (txt : desc ) with
114121 | Markup s -> env, AC. str s
115122 | Pcdata s ->
116123 Var. add env s Var , antiquot_pcdata ~loc ~lang s
@@ -131,7 +138,7 @@ module Template = struct
131138
132139 and to_expr ~simplify ~loc ~lang env l =
133140 let f (env , acc ) t =
134- let env, expr = desc_to_expr ~loc ~ lang env t in
141+ let env, expr = desc_to_expr ~lang env t in
135142 env, expr::acc
136143 in
137144 let env, l = List. fold_left f (env, [] ) l in
@@ -157,9 +164,9 @@ let expr_of_mustache ~loc ~lang t =
157164 in
158165 Template. make_function env e
159166
160- let expr_of_string ~loc ~lang s =
167+ let expr_of_string ~loc ~lang ~ lexloc s =
161168 expr_of_mustache ~loc ~lang @@
162- mustache_from_string ~loc: loc.loc_start s
169+ mustache_from_string ~lexloc s
163170
164171
165172(* * Mappers *)
@@ -169,39 +176,45 @@ open Parsetree
169176let error loc =
170177 Ppx_common. error loc " Invalid payload for [%%template]."
171178
172- let extract_str loc str = match AC. get_str str with
179+ let extract_str loc str =
180+ match AC. get_str_with_quotation_delimiter str with
173181 | None -> error loc
174- | Some s -> s
182+ | Some ( s , quot ) -> ( Ppx_tyxml.Loc. string_start quot loc, s)
175183
176184let expr mapper e =
177- let loc = e.pexp_loc in
185+ let sloc = e.pexp_loc in
178186 match e.pexp_desc with
179187 | Pexp_extension ({ txt = ("template" | "tyxml.template" )} , payload ) ->
180188 begin match payload with
181189 | PStr [[% stri let [% p? var] = [% e? str] in [% e? e]]] ->
182- let s = extract_str loc str in
183- Exp. let_ Asttypes. Nonrecursive
184- [Vb. mk var @@ expr_of_string ~loc: str.pexp_loc ~lang: Html s]
190+ let loc = str.pexp_loc in
191+ let lexloc, s = extract_str loc str in
192+ Exp. let_ ~loc: sloc Asttypes. Nonrecursive
193+ [Vb. mk ~loc: sloc var @@
194+ expr_of_string ~loc ~lang: Html ~lexloc s]
185195 e
186196
187197 | PStr [{pstr_desc = Pstr_eval (str, _)}] ->
188- let s = extract_str loc str in
189- expr_of_string ~loc: str.pexp_loc ~lang: Html s
198+ let loc = str.pexp_loc in
199+ let lexloc, s = extract_str loc str in
200+ expr_of_string ~loc ~lang: Html ~lexloc s
190201
191- | _ -> error loc
202+ | _ -> error sloc
192203 end
193204 | _ -> Ast_mapper. default_mapper.expr mapper e
194205
195206let structure_item mapper stri =
196- let loc = stri.pstr_loc in
207+ let sloc = stri.pstr_loc in
197208 match stri.pstr_desc with
198209 | Pstr_extension (({ txt = ("template" | "tyxml.template" )} , payload ), _ ) ->
199210 begin match payload with
200- | PStr [[% stri let [% p? var] = [% e? str]]] ->
201- let s = extract_str loc str in
202- Str. value Asttypes. Nonrecursive
203- [Vb. mk var @@ expr_of_string ~loc: str.pexp_loc ~lang: Html s]
204- | _ -> error loc
211+ | PStr [([% stri let [% p? var] = [% e? str]] as decl)] ->
212+ let loc = str.pexp_loc in
213+ let lexloc, s = extract_str loc str in
214+ Str. value ~loc: decl.pstr_loc Asttypes. Nonrecursive
215+ [Vb. mk ~loc: decl.pstr_loc var @@
216+ expr_of_string ~loc ~lang: Html ~lexloc s]
217+ | _ -> error sloc
205218 end
206219 | _ -> Ast_mapper. default_mapper.structure_item mapper stri
207220
0 commit comments