Source file parser_state.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
type mode = Normal | Ignore | Ident
let mode = ref Normal
let mode_normal () = mode := Normal
let mode_ignore () = mode := Ignore
let mode_ident () = mode := Ident
module Stmt_metadata = struct
let stmt_metadata: (int, (string * string) list) Hashtbl.t = Hashtbl.create 16
let add k v = Hashtbl.add stmt_metadata k v
let find_all k = Hashtbl.find_all stmt_metadata k
let reset () = Hashtbl.reset stmt_metadata
end
let current_lexbuf : Lexing.lexbuf option ref = ref None
let with_lexbuf lexbuf f =
let saved = !current_lexbuf in
current_lexbuf := Some lexbuf;
Fun.protect f ~finally:(fun () -> current_lexbuf := saved)
let (start_, end_) =
Stdlib.Option.bind !current_lexbuf (fun lexbuf ->
let len = end_ - start_ in
if len > 0 && start_ >= 0 && end_ <= lexbuf.Lexing.lex_buffer_len then
Some (Bytes.sub_string lexbuf.lex_buffer start_ len)
else
None)