Skip to content

Commit f6b230c

Browse files
committed
fix: module names in conversion function
1 parent 3e0202e commit f6b230c

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

common/mik_lexer.mll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ let lowercase = ['a'-'z']
5858
let uppercase = ['A'-'Z']
5959
let alpha = lowercase | uppercase
6060
let digit = ['0'-'9']
61-
let ident = (alpha | '_') (alpha | digit | '_' | '\'')*
61+
let ident = (lowercase | '_') (alpha | digit | '_' | '\'')*
62+
let module_name = uppercase (alpha | digit | '_' | '\'')*
63+
let module_ident = module_name ('.' (module_name | ident))*
6264

6365
rule token = parse
6466
| [' ' '\t' '\r']+ { token lexbuf }
@@ -83,6 +85,7 @@ rule token = parse
8385
| "int" { INT_CONVERTER }
8486
| "float" { FLOAT_CONVERTER }
8587
| digit+ as n { INT (int_of_string n) }
88+
| module_ident as id { MOD_IDENT id }
8689
| ident as id {
8790
match List.assoc_opt id predefined_classes with
8891
| Some pcre_class -> PREDEFINED_CLASS pcre_class

common/mik_parser.mly

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ let unclosed_error what startpos endpos =
4040
syntax_error (Printf.sprintf "Unclosed %s" what) startpos endpos
4141
%}
4242

43-
%token <string> CHAR_LITERAL STRING_LITERAL IDENT PREDEFINED_CLASS
43+
%token <string> CHAR_LITERAL STRING_LITERAL IDENT MOD_IDENT PREDEFINED_CLASS
4444
%token <int> INT
4545
%token SLASH LPAREN RPAREN LBRACKET RBRACKET CARET LBRACE RBRACE
4646
%token DASH BAR STAR PLUS QUESTION UNDERSCORE COLON EQUAL AS
@@ -187,6 +187,7 @@ basic_atom:
187187
let pattern_node = to_pcre_regex $2 $startpos($2) $endpos($2) in
188188
wrap_loc $startpos $endpos (Named_subs (ident_loc, Some name_loc, Some Float, pattern_node))
189189
}
190+
| LPAREN IDENT AS name = IDENT COLON EQUAL func = MOD_IDENT RPAREN
190191
| LPAREN IDENT AS name = IDENT COLON EQUAL func = IDENT RPAREN {
191192
let ident_loc = wrap_loc $startpos($2) $endpos($2) $2 in
192193
let name_loc = wrap_loc $startpos(name) $endpos(name) name in
@@ -222,6 +223,7 @@ basic_atom:
222223
let name_loc = wrap_loc $startpos(name) $endpos(name) name in
223224
wrap_loc $startpos $endpos (Capture_as (name_loc, Some Float, $2))
224225
}
226+
| LPAREN pattern AS name = IDENT COLON EQUAL func = MOD_IDENT RPAREN
225227
| LPAREN pattern AS name = IDENT COLON EQUAL func = IDENT RPAREN {
226228
let name_loc = wrap_loc $startpos(name) $endpos(name) name in
227229
wrap_loc $startpos $endpos (Capture_as (name_loc, Some (Func func), $2))

ppx_regexp/ppx_regexp.ml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,19 @@ let rec wrap_group_bindings ~loc rhs offG = function
183183
| Some Regexp_types.Int -> [%expr int_of_string [%e eG]]
184184
| Some Regexp_types.Float -> [%expr float_of_string [%e eG]]
185185
| Some (Regexp_types.Func func_name) ->
186-
let func_ident = pexp_ident ~loc { txt = Lident func_name; loc } in
186+
let longident =
187+
match String.split_on_char '.' func_name with
188+
| [] -> assert false
189+
| [ name ] -> Lident name
190+
| module_path ->
191+
let rec build_longident = function
192+
| [] -> assert false
193+
| [ name ] -> Lident name
194+
| module_name :: rest -> Ldot (build_longident rest, module_name)
195+
in
196+
build_longident (List.rev module_path)
197+
in
198+
let func_ident = pexp_ident ~loc { txt = longident; loc } in
187199
[%expr [%e func_ident] [%e eG]]
188200
in
189201
let eG = if mustG then eG else [%expr try Some [%e eG] with Not_found -> None] in

0 commit comments

Comments
 (0)