don't fail when a search path does not exist
This commit is contained in:
parent
3df2cccf51
commit
99618eafd7
|
@ -310,7 +310,8 @@ module Path_map = Map.Make(struct type t = Path.t let compare = compare end)
|
||||||
module Longident_map = Map.Make(struct type t = Longident.t let compare = compare end)
|
module Longident_map = Map.Make(struct type t = Longident.t let compare = compare end)
|
||||||
|
|
||||||
(* All names accessible without a path. *)
|
(* All names accessible without a path. *)
|
||||||
let global_names = ref (lazy String_set.empty)
|
let global_names = ref None
|
||||||
|
let global_names_revised = ref None
|
||||||
|
|
||||||
(* All names accessible with a path, by path. *)
|
(* All names accessible with a path, by path. *)
|
||||||
let local_names_by_path = ref Path_map.empty
|
let local_names_by_path = ref Path_map.empty
|
||||||
|
@ -319,7 +320,7 @@ let local_names_by_path = ref Path_map.empty
|
||||||
let local_names_by_longident = ref Longident_map.empty
|
let local_names_by_longident = ref Longident_map.empty
|
||||||
|
|
||||||
(* All record fields accessible without a path. *)
|
(* All record fields accessible without a path. *)
|
||||||
let global_fields = ref (lazy String_set.empty)
|
let global_fields = ref None
|
||||||
|
|
||||||
(* All record fields accessible with a path, by path. *)
|
(* All record fields accessible with a path, by path. *)
|
||||||
let local_fields_by_path = ref Path_map.empty
|
let local_fields_by_path = ref Path_map.empty
|
||||||
|
@ -327,16 +328,46 @@ let local_fields_by_path = ref Path_map.empty
|
||||||
(* All record fields accessible with a path, by long identifier. *)
|
(* All record fields accessible with a path, by long identifier. *)
|
||||||
let local_fields_by_longident = ref Longident_map.empty
|
let local_fields_by_longident = ref Longident_map.empty
|
||||||
|
|
||||||
(* Returns [acc] plus all modules from [dir]. *)
|
(* All visible modules according to Config.load_path. *)
|
||||||
let add_modules_from_directory acc dir =
|
let visible_modules = ref None
|
||||||
Array.fold_left
|
|
||||||
(fun acc fname ->
|
let reset () =
|
||||||
if Filename.check_suffix fname ".cmi" then
|
visible_modules := None;
|
||||||
String_set.add (String.capitalize (Filename.chop_suffix fname ".cmi")) acc
|
global_names := None;
|
||||||
else
|
global_names_revised := None;
|
||||||
acc)
|
local_names_by_path := Path_map.empty;
|
||||||
acc
|
local_names_by_longident := Longident_map.empty;
|
||||||
(Sys.readdir (if dir = "" then Filename.current_dir_name else dir))
|
global_fields := None;
|
||||||
|
local_fields_by_path := Path_map.empty;
|
||||||
|
local_fields_by_longident := Longident_map.empty
|
||||||
|
|
||||||
|
let get_cached var f =
|
||||||
|
match !var with
|
||||||
|
| Some x ->
|
||||||
|
x
|
||||||
|
| None ->
|
||||||
|
let x = f () in
|
||||||
|
var := Some x;
|
||||||
|
x
|
||||||
|
|
||||||
|
(* List all visible modules. *)
|
||||||
|
let visible_modules () =
|
||||||
|
get_cached visible_modules
|
||||||
|
(fun () ->
|
||||||
|
List.fold_left
|
||||||
|
(fun acc dir ->
|
||||||
|
try
|
||||||
|
Array.fold_left
|
||||||
|
(fun acc fname ->
|
||||||
|
if Filename.check_suffix fname ".cmi" then
|
||||||
|
String_set.add (String.capitalize (Filename.chop_suffix fname ".cmi")) acc
|
||||||
|
else
|
||||||
|
acc)
|
||||||
|
acc
|
||||||
|
(Sys.readdir (if dir = "" then Filename.current_dir_name else dir))
|
||||||
|
with Sys_error _ ->
|
||||||
|
acc)
|
||||||
|
String_set.empty !Config.load_path)
|
||||||
|
|
||||||
#if ocaml_version >= (4, 0, 0)
|
#if ocaml_version >= (4, 0, 0)
|
||||||
let field_name (id, _, _) = Ident.name id
|
let field_name (id, _, _) = Ident.name id
|
||||||
|
@ -524,7 +555,28 @@ let list_global_names () =
|
||||||
(* Add names of the environment: *)
|
(* Add names of the environment: *)
|
||||||
let acc = loop String_set.empty (Env.summary !Toploop.toplevel_env) in
|
let acc = loop String_set.empty (Env.summary !Toploop.toplevel_env) in
|
||||||
(* Add accessible modules: *)
|
(* Add accessible modules: *)
|
||||||
List.fold_left add_modules_from_directory acc !Config.load_path
|
String_set.union acc (visible_modules ())
|
||||||
|
|
||||||
|
let global_names () = get_cached global_names list_global_names
|
||||||
|
|
||||||
|
let replace x y set =
|
||||||
|
if String_set.mem x set then
|
||||||
|
String_set.add y (String_set.remove x set)
|
||||||
|
else
|
||||||
|
set
|
||||||
|
|
||||||
|
let global_names_revised () =
|
||||||
|
get_cached global_names_revised
|
||||||
|
(fun () ->
|
||||||
|
let set = global_names () in
|
||||||
|
replace "true" "True" (replace "false" "False" set))
|
||||||
|
|
||||||
|
let global_names syntax =
|
||||||
|
match syntax with
|
||||||
|
| UTop.Normal | UTop.Camlp4o ->
|
||||||
|
global_names ()
|
||||||
|
| UTop.Camlp4r ->
|
||||||
|
global_names_revised ()
|
||||||
|
|
||||||
let list_global_fields () =
|
let list_global_fields () =
|
||||||
let rec loop acc = function
|
let rec loop acc = function
|
||||||
|
@ -560,32 +612,9 @@ let list_global_fields () =
|
||||||
(* Add fields of the environment: *)
|
(* Add fields of the environment: *)
|
||||||
let acc = loop String_set.empty (Env.summary !Toploop.toplevel_env) in
|
let acc = loop String_set.empty (Env.summary !Toploop.toplevel_env) in
|
||||||
(* Add accessible modules: *)
|
(* Add accessible modules: *)
|
||||||
List.fold_left add_modules_from_directory acc !Config.load_path
|
String_set.union acc (visible_modules ())
|
||||||
|
|
||||||
let reset () =
|
let global_fields () = get_cached global_fields list_global_fields
|
||||||
global_names := Lazy.lazy_from_fun list_global_names;
|
|
||||||
local_names_by_path := Path_map.empty;
|
|
||||||
local_names_by_longident := Longident_map.empty;
|
|
||||||
global_fields := Lazy.lazy_from_fun list_global_fields;
|
|
||||||
local_fields_by_path := Path_map.empty;
|
|
||||||
local_fields_by_longident := Longident_map.empty
|
|
||||||
|
|
||||||
let replace x y set =
|
|
||||||
if String_set.mem x set then
|
|
||||||
String_set.add y (String_set.remove x set)
|
|
||||||
else
|
|
||||||
set
|
|
||||||
|
|
||||||
let global_names syntax =
|
|
||||||
let set = Lazy.force !global_names in
|
|
||||||
match syntax with
|
|
||||||
| UTop.Normal | UTop.Camlp4o ->
|
|
||||||
set
|
|
||||||
| UTop.Camlp4r ->
|
|
||||||
replace "true" "True" (replace "false" "False" set)
|
|
||||||
|
|
||||||
let global_fields () =
|
|
||||||
Lazy.force !global_fields
|
|
||||||
|
|
||||||
(* +-----------------------------------------------------------------+
|
(* +-----------------------------------------------------------------+
|
||||||
| Listing methods |
|
| Listing methods |
|
||||||
|
|
Loading…
Reference in New Issue