Skip to content

Commit a6d28ca

Browse files
committed
Fix multi-group top level regexp for ppx_tyre.
1 parent e3cc138 commit a6d28ca

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

ppx_tyre/ppx_tyre.ml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,10 @@ let simplify = collapse_ungrouped
188188
let rec make_nested_tuple_pat ~loc ids =
189189
match ids with
190190
| [] -> internal_error ~loc
191-
| [ v ] -> [v], AC.pvar ~loc v
191+
| [ v ] -> AC.pvar ~loc v
192192
| v :: ids ->
193-
let vars, pat = make_nested_tuple_pat ~loc ids in
194-
(v :: vars), A.Pat.tuple ~loc [AC.pvar ~loc v;pat]
193+
let pat = make_nested_tuple_pat ~loc ids in
194+
A.Pat.tuple ~loc [AC.pvar ~loc v;pat]
195195
let rec make_nested_tuple_expr ~loc exprs =
196196
match exprs with
197197
| [] -> internal_error ~loc
@@ -216,8 +216,8 @@ let make_object_expr ~loc expr meths =
216216

217217
let make_conv_of_nested_tuple ~loc ~make_pat ~make_expr ~ids tyre_expr =
218218
let fun_to =
219-
let vars, tuple_pat = make_nested_tuple_pat ~loc ids in
220-
let lids = List.map (AC.evar ~loc) vars in
219+
let tuple_pat = make_nested_tuple_pat ~loc ids in
220+
let lids = List.map (AC.evar ~loc) ids in
221221
let expr = make_expr ~loc lids in
222222
A.Exp.fun_ ~loc Nolabel None tuple_pat expr
223223
in
@@ -442,7 +442,8 @@ let expr_of_function ~loc l =
442442
| Named [] | Unnamed 0 -> internal_error ~loc
443443
| No | Unnamed _ -> A.Pat.any ~loc ()
444444
| Named [lid] -> pvar_of_lid lid
445-
| Named l -> AC.ptuple ~loc @@ List.map pvar_of_lid l
445+
| Named l ->
446+
make_nested_tuple_pat ~loc @@ List.map (fun {Loc.txt ; _} -> txt) l
446447
in
447448
let e = AC.func ~loc [arg, pc_rhs] in
448449
AC.constr ~loc "Tyre.Route" [re; e]

tests/test_ppx_tyre.ml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type t = [
3232
| `Comment of string
3333
| `Even_sigils of string option
3434
| `Odd_sigils
35+
| `Id of string * int * string
3536
| `Unknown ]
3637

3738
let test1 : t Tyre.re =
@@ -40,14 +41,17 @@ let test1 : t Tyre.re =
4041
| {|^# (?<comment>.+)$|} -> `Comment comment
4142
| {|^(?<sigil>([@%]{2})+)?$|} -> `Even_sigils sigil
4243
| {|^[@%]|} -> `Odd_sigils
44+
| {|^(?<id>[a-z]+)(?&num:Tyre.pos_int)(?<sym>[^[:alnum:]]+)$|}
45+
-> `Id (id, num, sym)
4346
| _ -> `Unknown)
4447

4548
let () =
4649
assert (test1 %% "x: 1" = `Attr ("x", Some "1"));
4750
assert (test1 %% "# Kommentar" = `Comment "Kommentar");
4851
assert (test1 %% "" = `Even_sigils None);
4952
assert (test1 %% "%%%@" = `Even_sigils (Some "%%%@"));
50-
assert (test1 %% "%%@" = `Odd_sigils)
53+
assert (test1 %% "%%@" = `Odd_sigils);
54+
assert (test1 %% "abc42#@" = `Id ("abc", 42, "#@"))
5155

5256
let concat_seq sep seq =
5357
let rec f seq =

0 commit comments

Comments
 (0)