let pp_fun_set_by_file fmt set =
  let add_binding map filename fvinfo =
    let set =
      try
        let x = Datatype.String.Map.find filename map in
        Varinfo.Set.add fvinfo x
      with Not_found -> Varinfo.Set.add fvinfo Varinfo.Set.empty
    in Datatype.String.Map.add filename set map
  in
  let map =
    Varinfo.Set.fold
      (fun fvinfo acc ->
         if Metrics_base.consider_function fvinfo then
           let fname = Metrics_base.file_of_vinfodef fvinfo in
           add_binding acc fname fvinfo
         else acc
      ) set Datatype.String.Map.empty
  in
  Format.fprintf fmt "@[<v 0>";
  Datatype.String.Map.iter
    (fun fname fvinfoset ->
      Format.fprintf fmt "@[<hov 2><%s>:@ %a@]@ " fname
        (fun fmt vinfoset ->
          Varinfo.Set.iter
            (fun vinfo ->
              Format.fprintf fmt "%a;@ " !Ast_printer.d_var vinfo)
            vinfoset)
        fvinfoset
    ) map;
    Format.fprintf fmt "@]"