completion on variants and records
Ignore-this: 963eae3696632aa49a488a5a25020fd6 darcs-hash:20110727162738-c41ad-dbd180a191a306e4dffb4732d8474092b5c5b7b2
This commit is contained in:
parent
8ff6b099a6
commit
f7e913a26f
|
@ -120,6 +120,17 @@ let valid id =
|
||||||
| 'A' .. 'Z' | 'a' .. 'z' | '_' -> true
|
| 'A' .. 'Z' | 'a' .. 'z' | '_' -> true
|
||||||
| _ -> false)
|
| _ -> false)
|
||||||
|
|
||||||
|
let add id set = if valid id then String_set.add id set else set
|
||||||
|
|
||||||
|
let add_names_of_type decl acc =
|
||||||
|
match decl.type_kind with
|
||||||
|
| Type_variant constructors ->
|
||||||
|
List.fold_left (fun acc (name, _) -> add name acc) acc constructors
|
||||||
|
| Type_record(fields, _) ->
|
||||||
|
List.fold_left (fun acc (name, _, _) -> add name acc) acc fields
|
||||||
|
| Type_abstract ->
|
||||||
|
acc
|
||||||
|
|
||||||
(* List all names of the module with path [path] *)
|
(* List all names of the module with path [path] *)
|
||||||
let get_names_of_module path =
|
let get_names_of_module path =
|
||||||
try
|
try
|
||||||
|
@ -134,17 +145,14 @@ let get_names_of_module path =
|
||||||
List.fold_left
|
List.fold_left
|
||||||
(fun acc decl -> match decl with
|
(fun acc decl -> match decl with
|
||||||
| Tsig_value(id, _)
|
| Tsig_value(id, _)
|
||||||
| Tsig_type(id, _, _)
|
|
||||||
| Tsig_exception(id, _)
|
| Tsig_exception(id, _)
|
||||||
| Tsig_module(id, _, _)
|
| Tsig_module(id, _, _)
|
||||||
| Tsig_modtype(id, _)
|
| Tsig_modtype(id, _)
|
||||||
| Tsig_class(id, _, _)
|
| Tsig_class(id, _, _)
|
||||||
| Tsig_cltype(id, _, _) ->
|
| Tsig_cltype(id, _, _) ->
|
||||||
let id = Ident.name id in
|
add (Ident.name id) acc
|
||||||
if valid id then
|
| Tsig_type(id, decl, _) ->
|
||||||
String_set.add id acc
|
add_names_of_type decl (add (Ident.name id) acc))
|
||||||
else
|
|
||||||
acc)
|
|
||||||
String_set.empty decls
|
String_set.empty decls
|
||||||
| _ ->
|
| _ ->
|
||||||
String_set.empty
|
String_set.empty
|
||||||
|
@ -163,13 +171,13 @@ let names_of_module path =
|
||||||
let env_names () =
|
let env_names () =
|
||||||
let rec loop acc = function
|
let rec loop acc = function
|
||||||
| Env.Env_empty -> acc
|
| Env.Env_empty -> acc
|
||||||
| Env.Env_value(summary, id, _) -> let id = Ident.name id in loop (if valid id then String_set.add id acc else acc) summary
|
| Env.Env_value(summary, id, _) -> loop (add (Ident.name id) acc) summary
|
||||||
| Env.Env_type(summary, id, _) -> loop (String_set.add (Ident.name id) acc) summary
|
| Env.Env_type(summary, id, decl) -> loop (add_names_of_type decl (add (Ident.name id) acc)) summary
|
||||||
| Env.Env_exception(summary, id, _) -> loop (String_set.add (Ident.name id) acc) summary
|
| Env.Env_exception(summary, id, _) -> loop (add (Ident.name id) acc) summary
|
||||||
| Env.Env_module(summary, id, _) -> loop (String_set.add (Ident.name id) acc) summary
|
| Env.Env_module(summary, id, _) -> loop (add (Ident.name id) acc) summary
|
||||||
| Env.Env_modtype(summary, id, _) -> loop (String_set.add (Ident.name id) acc) summary
|
| Env.Env_modtype(summary, id, _) -> loop (add (Ident.name id) acc) summary
|
||||||
| Env.Env_class(summary, id, _) -> loop (String_set.add (Ident.name id) acc) summary
|
| Env.Env_class(summary, id, _) -> loop (add (Ident.name id) acc) summary
|
||||||
| Env.Env_cltype(summary, id, _) -> loop (String_set.add (Ident.name id) acc) summary
|
| Env.Env_cltype(summary, id, _) -> loop (add (Ident.name id) acc) summary
|
||||||
| Env.Env_open(summary, path) -> loop (String_set.union acc (names_of_module (Path path))) summary
|
| Env.Env_open(summary, path) -> loop (String_set.union acc (names_of_module (Path path))) summary
|
||||||
in
|
in
|
||||||
(* Add names of the environment: *)
|
(* Add names of the environment: *)
|
||||||
|
|
Loading…
Reference in New Issue