let toplevel_add (doc,params) x ~generalized v =
let ptypes =
match (T.deref v.V.t).T.descr with
| T.Arrow (p,_) -> p
| _ -> []
in
let pvalues =
match v.V.value with
| V.Fun (p,_,_,_) -> List.map (fun (l,_,o) -> l,o) p
| _ -> []
in
let params,pvalues =
List.fold_left
(fun (params,pvalues) (opt,label,t) ->
let descr,params =
try
List.assoc label params,
List.remove_assoc label params
with
| Not_found -> "",params
in
let default,pvalues =
try
`Known (List.assoc label pvalues),
List.remove_assoc label pvalues
with
| Not_found -> `Unknown, pvalues
in
let item = Doc.trivial (if descr="" then "(no doc)" else descr) in
item#add_subsection "type" (T.doc_of_type ~generalized t) ;
item#add_subsection "default"
(Doc.trivial (match default with
| `Unknown -> "???"
| `Known (Some v) -> V.print_value v
| `Known None -> "None")) ;
doc#add_subsection
(if label="" then "(unlabeled)" else label)
item ;
params,pvalues)
(params,pvalues)
ptypes
in
List.iter
(fun (s,_) ->
Printf.eprintf "WARNING: Unused @param %S for %s!\n" s x)
params ;
doc#add_subsection "_type" (T.doc_of_type ~generalized v.V.t) ;
builtins#register ~doc x (generalized,v)