dune/src/loc.ml

63 lines
1.3 KiB
OCaml
Raw Normal View History

2016-11-13 17:05:55 +00:00
open Import
2016-11-03 16:44:09 +00:00
type t =
{ start : Lexing.position
; stop : Lexing.position
}
2016-11-13 11:13:47 +00:00
let of_lexbuf lb =
2016-11-13 11:27:31 +00:00
{ start = Lexing.lexeme_start_p lb
; stop = Lexing.lexeme_end_p lb
2016-11-13 11:13:47 +00:00
}
exception Error of t * string
let fail t fmt =
2017-05-31 15:49:54 +00:00
Format.pp_print_as die_ppf 7 ""; (* "Error: " *)
Format.kfprintf
(fun ppf ->
Format.pp_print_flush ppf ();
let s = Buffer.contents die_buf in
Buffer.clear die_buf;
raise (Error (t, s)))
die_ppf fmt
2016-11-13 11:13:47 +00:00
let fail_lex lb fmt =
fail (of_lexbuf lb) fmt
2016-12-02 13:54:32 +00:00
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 }
}
2017-02-25 17:53:39 +00:00
let none = in_file "<none>"
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
"@{<loc>File \"%s\", line %d, characters %d-%d:@}@\n"
start.pos_fname start.pos_lnum start_c stop_c
let warn t fmt =
Format.eprintf ("%a@{<warning>Warning@}: " ^^ fmt ^^ "@.") print t