Skip to content

Commit 75ca75b

Browse files
committed
Use locations reported by the new mustache parser.
1 parent 1e2714f commit 75ca75b

File tree

2 files changed

+53
-33
lines changed

2 files changed

+53
-33
lines changed

mustache/ppx_tyxml_mustache.ml

+46-33
Original file line numberDiff line numberDiff line change
@@ -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

1819
let antiquot_pcdata ~loc ~lang var =
1920
let pcdata = Ppx_common.make ~loc lang "pcdata" in
@@ -70,7 +71,7 @@ end
7071

7172
module 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
169176
let 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

176184
let 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

195206
let 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

ppx/ppx_tyxml.mli

+7
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,10 @@ val markup_to_expr :
3333
contained therein. *)
3434

3535
val mapper : string list -> Ast_mapper.mapper
36+
37+
38+
(** Utils *)
39+
40+
module Loc : sig
41+
val string_start : string option -> Location.t -> Lexing.position
42+
end

0 commit comments

Comments
 (0)