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.
82 lines
3.3 KiB
82 lines
3.3 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
|
|
|
|
let pp_custom_of_report fmt report fields =
|
|
let pp_custom_of_issue fmt (issue : Jsonbug_t.jsonbug) =
|
|
let open Jsonbug_t in
|
|
let comma_separator index = if index > 0 then ", " else "" in
|
|
let pp_trace fmt trace comma =
|
|
let pp_trace_elem fmt {description} = F.pp_print_string fmt description in
|
|
let trace_without_empty_descs =
|
|
List.filter ~f:(fun {description} -> not (String.is_empty description)) trace
|
|
in
|
|
F.fprintf fmt "%s[%a]" comma (Pp.comma_seq pp_trace_elem) trace_without_empty_descs
|
|
in
|
|
let pp_field index field =
|
|
match (field : IssuesTestField.t) with
|
|
| BugType ->
|
|
F.fprintf fmt "%s%s" (comma_separator index) issue.bug_type
|
|
| Bucket ->
|
|
let bucket =
|
|
match
|
|
String.lsplit2 issue.qualifier ~on:']'
|
|
|> Option.map ~f:fst
|
|
|> Option.bind ~f:(String.chop_prefix ~prefix:"[")
|
|
with
|
|
| Some bucket ->
|
|
bucket
|
|
| None ->
|
|
"no_bucket"
|
|
in
|
|
F.fprintf fmt "%s%s" (comma_separator index) bucket
|
|
| Qualifier ->
|
|
F.fprintf fmt "%s%s" (comma_separator index) issue.qualifier
|
|
| Severity ->
|
|
F.fprintf fmt "%s%s" (comma_separator index) issue.severity
|
|
| Line ->
|
|
F.fprintf fmt "%s%d" (comma_separator index) issue.line
|
|
| Column ->
|
|
F.fprintf fmt "%s%d" (comma_separator index) issue.column
|
|
| Procedure ->
|
|
F.fprintf fmt "%s%s" (comma_separator index) issue.procedure
|
|
| ProcedureStartLine ->
|
|
F.fprintf fmt "%s%d" (comma_separator index) issue.procedure_start_line
|
|
| File ->
|
|
F.fprintf fmt "%s%s" (comma_separator index) issue.file
|
|
| BugTrace ->
|
|
pp_trace fmt issue.bug_trace (comma_separator index)
|
|
| Key ->
|
|
F.fprintf fmt "%s%s" (comma_separator index) (Caml.Digest.to_hex issue.key)
|
|
| Hash ->
|
|
F.fprintf fmt "%s%s" (comma_separator index) (Caml.Digest.to_hex issue.hash)
|
|
| LineOffset ->
|
|
F.fprintf fmt "%s%d" (comma_separator index) (issue.line - issue.procedure_start_line)
|
|
| QualifierContainsPotentialExceptionNote ->
|
|
F.pp_print_bool fmt
|
|
(String.is_substring issue.qualifier ~substring:InferPrint.potential_exception_message)
|
|
in
|
|
List.iteri ~f:pp_field fields ; F.fprintf fmt "@."
|
|
in
|
|
List.iter ~f:(pp_custom_of_issue fmt) report
|
|
|
|
|
|
let tests_jsonbug_compare (bug1 : Jsonbug_t.jsonbug) (bug2 : Jsonbug_t.jsonbug) =
|
|
let open Jsonbug_t in
|
|
[%compare: string * string * int * string * Caml.Digest.t]
|
|
(bug1.file, bug1.procedure, bug1.line - bug1.procedure_start_line, bug1.bug_type, bug1.hash)
|
|
(bug2.file, bug2.procedure, bug2.line - bug2.procedure_start_line, bug2.bug_type, bug2.hash)
|
|
|
|
|
|
let write_from_json ~json_path ~out_path issues_tests_fields =
|
|
Utils.with_file_out out_path ~f:(fun outf ->
|
|
let report = Atdgen_runtime.Util.Json.from_file Jsonbug_j.read_report json_path in
|
|
let sorted_report = List.sort ~compare:tests_jsonbug_compare report in
|
|
pp_custom_of_report (F.formatter_of_out_channel outf) sorted_report issues_tests_fields )
|