You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

55 lines
1.5 KiB

(*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open! IStd
module F = Format
(** Location in the original source file *)
type t =
{ line: int (** The line number. -1 means "do not know" *)
; col: int (** The column number. -1 means "do not know" *)
; file: SourceFile.t (** The name of the source file *) }
[@@deriving compare]
let equal = [%compare.equal: t]
let none file = {line= -1; col= -1; file}
let dummy = none (SourceFile.invalid __FILE__)
let pp_line f loc = F.fprintf f "line %d" loc.line
(** Pretty print a location *)
let pp f (loc : t) =
pp_line f loc ;
if loc.col <> -1 then F.fprintf f ", column %d" loc.col
let pp_short f loc =
F.pp_print_int f loc.line ;
if loc.col <> -1 then F.fprintf f ":%d" loc.col
let to_string loc = F.asprintf "%a" pp_short loc
(** Pretty print a file-position of a location *)
let pp_file_pos f (loc : t) = F.fprintf f "%a:%a" SourceFile.pp loc.file pp_short loc
let pp_range f (loc_start, loc_end) =
let pp_end loc_start f loc_end =
if Int.equal loc_end.line loc_start.line then
if Int.equal loc_end.col loc_start.col then () else F.fprintf f "-%d" loc_end.col
else F.fprintf f "-%a" pp_short loc_end
in
F.fprintf f "%a%a" pp_file_pos loc_start (pp_end loc_start) loc_end
module Map = PrettyPrintable.MakePPMap (struct
type nonrec t = t [@@deriving compare]
let pp = pp
end)