diff --git a/infer/src/java/jClasspath.ml b/infer/src/java/jClasspath.ml index a26f9df58..12f896c57 100644 --- a/infer/src/java/jClasspath.ml +++ b/infer/src/java/jClasspath.ml @@ -40,15 +40,23 @@ let add_models jar_filename = let is_model procname = String.Set.mem !models_specs_filenames (Typ.Procname.to_filename procname) -let split_classpath cp = Str.split (Str.regexp JFile.sep) cp - -let append_path classpath path = - let full_path = Utils.filename_to_absolute ~root:Config.project_root path in - if Sys.file_exists full_path = `Yes then - if Int.equal (String.length classpath) 0 then full_path else classpath ^ JFile.sep ^ full_path - else ( - L.debug Capture Medium "Path %s not found" full_path ; - classpath ) +let split_classpath = + assert (Int.( = ) (String.length JFile.sep) 1) ; + let char_sep = JFile.sep.[0] in + fun cp -> String.split ~on:char_sep cp + + +let classpath_of_paths paths = + let of_path path = + let full_path = Utils.filename_to_absolute ~root:Config.project_root path in + match Sys.file_exists full_path with + | `Yes -> + Some full_path + | _ -> + L.debug Capture Medium "Path %s not found" full_path ; + None + in + List.filter_map paths ~f:of_path |> String.concat ~sep:JFile.sep type file_entry = Singleton of SourceFile.t | Duplicate of (string * SourceFile.t) list @@ -133,7 +141,7 @@ let load_from_verbose_output javac_verbose_out = match In_channel.input_line_exn file_in with | exception End_of_file -> In_channel.close file_in ; - let classpath = List.fold ~f:append_path ~init:"" (String.Set.elements roots @ paths) in + let classpath = classpath_of_paths (String.Set.elements roots @ paths) in (classpath, sources, classes) | line -> if Str.string_match class_filename_re line 0 then @@ -224,13 +232,9 @@ let search_sources () = let load_from_arguments classes_out_path = let roots, classes = search_classes classes_out_path in let split cp_option = Option.value_map ~f:split_classpath ~default:[] cp_option in - let combine path_list classpath = - List.fold ~f:append_path ~init:classpath (List.rev path_list) - in let classpath = - combine (split Config.bootclasspath) "" - |> combine (split Config.classpath) - |> combine (String.Set.elements roots) + split Config.bootclasspath @ split Config.classpath @ String.Set.elements roots + |> classpath_of_paths in (classpath, search_sources (), classes)