Summary: Just moving code around. This is needed later to make some types in `PulseTrace` depend on a new that I'll have to define in `PulseDomain`. Also, this gives better names all around I think Reviewed By: mbouaziz Differential Revision: D15881281 fbshipit-source-id: e86c1472emaster
parent
b03aeb49c2
commit
695b493b56
@ -1,143 +0,0 @@
|
||||
(*
|
||||
* 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
|
||||
|
||||
type breadcrumb =
|
||||
| VariableDeclaration of Location.t
|
||||
| CppTemporaryCreated of Location.t
|
||||
| Assignment of {lhs: HilExp.AccessExpression.t; location: Location.t}
|
||||
| Capture of
|
||||
{ captured_as: AccessPath.base
|
||||
; captured: HilExp.AccessExpression.t
|
||||
; location: Location.t }
|
||||
| Call of
|
||||
{ f: [`HilCall of HilInstr.call | `Model of string]
|
||||
; actuals: HilExp.t list
|
||||
; location: Location.t }
|
||||
[@@deriving compare]
|
||||
|
||||
let pp_breadcrumb_no_location fmt = function
|
||||
| VariableDeclaration _ ->
|
||||
F.pp_print_string fmt "variable declared"
|
||||
| CppTemporaryCreated _ ->
|
||||
F.pp_print_string fmt "C++ temporary created"
|
||||
| Capture {captured_as; captured; location= _} ->
|
||||
F.fprintf fmt "`%a` captured as `%a`" HilExp.AccessExpression.pp captured AccessPath.pp_base
|
||||
captured_as
|
||||
| Assignment {lhs; location= _} ->
|
||||
F.fprintf fmt "assigned to `%a`" HilExp.AccessExpression.pp lhs
|
||||
| Call {f; actuals; location= _} ->
|
||||
let pp_f fmt = function
|
||||
| `HilCall call ->
|
||||
F.fprintf fmt "%a" HilInstr.pp_call call
|
||||
| `Model model ->
|
||||
F.pp_print_string fmt model
|
||||
in
|
||||
F.fprintf fmt "returned from call to `%a(%a)`" pp_f f (Pp.seq ~sep:"," HilExp.pp) actuals
|
||||
|
||||
|
||||
let location_of_breadcrumb = function
|
||||
| VariableDeclaration location
|
||||
| CppTemporaryCreated location
|
||||
| Assignment {location}
|
||||
| Capture {location}
|
||||
| Call {location} ->
|
||||
location
|
||||
|
||||
|
||||
let pp_breadcrumb fmt crumb =
|
||||
F.fprintf fmt "%a at %a" pp_breadcrumb_no_location crumb Location.pp_line
|
||||
(location_of_breadcrumb crumb)
|
||||
|
||||
|
||||
let errlog_trace_elem_of_breadcrumb ~nesting crumb =
|
||||
let location = location_of_breadcrumb crumb in
|
||||
let description = F.asprintf "%a" pp_breadcrumb_no_location crumb in
|
||||
let tags = [] in
|
||||
Errlog.make_trace_element nesting location description tags
|
||||
|
||||
|
||||
type breadcrumbs = breadcrumb list [@@deriving compare]
|
||||
|
||||
let pp_breadcrumbs f breadcrumbs = Pp.seq ~print_env:Pp.text_break pp_breadcrumb f breadcrumbs
|
||||
|
||||
let add_errlog_of_breadcrumbs ~nesting breadcrumbs errlog =
|
||||
List.rev_map_append ~f:(errlog_trace_elem_of_breadcrumb ~nesting) breadcrumbs errlog
|
||||
|
||||
|
||||
let start_location_of_breadcrumbs = function
|
||||
| [] ->
|
||||
None
|
||||
| crumb :: _ ->
|
||||
Some (location_of_breadcrumb crumb)
|
||||
|
||||
|
||||
type 'a action =
|
||||
| Immediate of {imm: 'a; location: Location.t}
|
||||
| ViaCall of {action: 'a action; proc_name: Typ.Procname.t; location: Location.t}
|
||||
[@@deriving compare]
|
||||
|
||||
let rec immediate_of_action = function
|
||||
| Immediate {imm; _} ->
|
||||
imm
|
||||
| ViaCall {action; _} ->
|
||||
immediate_of_action action
|
||||
|
||||
|
||||
let pp_action pp_immediate fmt = function
|
||||
| Immediate {imm; _} ->
|
||||
pp_immediate fmt imm
|
||||
| ViaCall {proc_name; action; _} ->
|
||||
F.fprintf fmt "%a in call to `%a`" pp_immediate (immediate_of_action action)
|
||||
Typ.Procname.describe proc_name
|
||||
|
||||
|
||||
let add_errlog_of_action ~nesting pp_immediate action errlog =
|
||||
let rec aux ~nesting rev_errlog action =
|
||||
match action with
|
||||
| Immediate {imm; location} ->
|
||||
let rev_errlog =
|
||||
Errlog.make_trace_element nesting location (F.asprintf "%a here" pp_immediate imm) []
|
||||
:: rev_errlog
|
||||
in
|
||||
List.rev_append rev_errlog errlog
|
||||
| ViaCall {action; proc_name; location} ->
|
||||
aux ~nesting:(nesting + 1)
|
||||
( Errlog.make_trace_element nesting location
|
||||
(F.asprintf "when calling `%a` here" Typ.Procname.describe proc_name)
|
||||
[]
|
||||
:: rev_errlog )
|
||||
action
|
||||
in
|
||||
aux ~nesting [] action
|
||||
|
||||
|
||||
let outer_location_of_action = function Immediate {location} | ViaCall {location} -> location
|
||||
|
||||
type 'a t = {action: 'a action; breadcrumbs: breadcrumbs} [@@deriving compare]
|
||||
|
||||
let pp pp_immediate f {action; _} = pp_action pp_immediate f action
|
||||
|
||||
let add_errlog_header ~title location errlog =
|
||||
let depth = 0 in
|
||||
let tags = [] in
|
||||
Errlog.make_trace_element depth location title tags :: errlog
|
||||
|
||||
|
||||
let add_to_errlog ~header pp_immediate trace errlog =
|
||||
let start_location =
|
||||
match start_location_of_breadcrumbs trace.breadcrumbs with
|
||||
| Some location ->
|
||||
location
|
||||
| None ->
|
||||
outer_location_of_action trace.action
|
||||
in
|
||||
add_errlog_header ~title:header start_location
|
||||
@@ add_errlog_of_breadcrumbs ~nesting:1 trace.breadcrumbs
|
||||
@@ add_errlog_of_action ~nesting:1 pp_immediate trace.action
|
||||
@@ errlog
|
@ -1,51 +0,0 @@
|
||||
(*
|
||||
* 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
|
||||
|
||||
type breadcrumb =
|
||||
| VariableDeclaration of Location.t
|
||||
| CppTemporaryCreated of Location.t
|
||||
| Assignment of {lhs: HilExp.AccessExpression.t; location: Location.t}
|
||||
| Capture of
|
||||
{ captured_as: AccessPath.base
|
||||
; captured: HilExp.AccessExpression.t
|
||||
; location: Location.t }
|
||||
| Call of
|
||||
{ f: [`HilCall of HilInstr.call | `Model of string]
|
||||
; actuals: HilExp.t list
|
||||
; location: Location.t }
|
||||
|
||||
type breadcrumbs = breadcrumb list [@@deriving compare]
|
||||
|
||||
val pp_breadcrumbs : F.formatter -> breadcrumbs -> unit
|
||||
|
||||
val add_errlog_of_breadcrumbs :
|
||||
nesting:int -> breadcrumbs -> Errlog.loc_trace_elem list -> Errlog.loc_trace_elem list
|
||||
|
||||
type 'a action =
|
||||
| Immediate of {imm: 'a; location: Location.t}
|
||||
| ViaCall of {action: 'a action; proc_name: Typ.Procname.t; location: Location.t}
|
||||
[@@deriving compare]
|
||||
|
||||
val pp_action : (F.formatter -> 'a -> unit) -> F.formatter -> 'a action -> unit
|
||||
|
||||
val immediate_of_action : 'a action -> 'a
|
||||
|
||||
val outer_location_of_action : 'a action -> Location.t
|
||||
|
||||
type 'a t = {action: 'a action; breadcrumbs: breadcrumbs} [@@deriving compare]
|
||||
|
||||
val pp : (F.formatter -> 'a -> unit) -> F.formatter -> 'a t -> unit
|
||||
|
||||
val add_to_errlog :
|
||||
header:string
|
||||
-> (F.formatter -> 'a -> unit)
|
||||
-> 'a t
|
||||
-> Errlog.loc_trace_elem list
|
||||
-> Errlog.loc_trace_elem list
|
Loading…
Reference in new issue