open Import type t = Usexp.Loc.t = { start : Lexing.position ; stop : Lexing.position } let of_lexbuf lb = { start = Lexing.lexeme_start_p lb ; stop = Lexing.lexeme_end_p lb } exception Error of t * string let exnf t fmt = Format.pp_print_as err_ppf 7 ""; (* "Error: " *) kerrf fmt ~f:(fun s -> Error (t, s)) let fail t fmt = Format.pp_print_as err_ppf 7 ""; (* "Error: " *) kerrf fmt ~f:(fun s -> raise (Error (t, s))) let fail_lex lb fmt = fail (of_lexbuf lb) fmt let fail_opt t fmt = match t with | None -> die fmt | Some t -> fail t fmt let in_file fn = let pos : Lexing.position = { pos_fname = fn ; pos_lnum = 1 ; pos_cnum = 0 ; pos_bol = 0 } in { start = pos ; stop = pos } let of_pos (fname, lnum, cnum, enum) = let pos : Lexing.position = { pos_fname = fname ; pos_lnum = lnum ; pos_cnum = cnum ; pos_bol = 0 } in { start = pos ; stop = { pos with pos_cnum = enum } } let none = in_file "" let print ppf { start; stop } = let start_c = start.pos_cnum - start.pos_bol in let stop_c = stop.pos_cnum - start.pos_bol in Format.fprintf ppf "@{File \"%s\", line %d, characters %d-%d:@}@\n" start.pos_fname start.pos_lnum start_c stop_c let warn t fmt = Errors.kerrf ~f:print_to_console ("%a@{Warning@}: " ^^ fmt ^^ "@.") print t let to_file_colon_line t = sprintf "%s:%d" t.start.pos_fname t.start.pos_lnum let pp_file_colon_line ppf t = Format.pp_print_string ppf (to_file_colon_line t)