106 lines
3.9 KiB
OCaml
106 lines
3.9 KiB
OCaml
(**************************************************************************)
|
|
(* *)
|
|
(* OCaml *)
|
|
(* *)
|
|
(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *)
|
|
(* Gabriel Scherer, projet Parsifal, INRIA Saclay *)
|
|
(* *)
|
|
(* Copyright 2019 Institut National de Recherche en Informatique et *)
|
|
(* en Automatique. *)
|
|
(* *)
|
|
(* All rights reserved. This file is distributed under the terms of *)
|
|
(* the GNU Lesser General Public License version 2.1, with the *)
|
|
(* special exception on linking described in the file LICENSE. *)
|
|
(* *)
|
|
(**************************************************************************)
|
|
|
|
open Misc
|
|
|
|
module Consistbl : module type of struct
|
|
include Consistbl.Make (Misc.Stdlib.String)
|
|
end
|
|
|
|
type error =
|
|
| Illegal_renaming of modname * modname * filepath
|
|
| Inconsistent_import of modname * filepath * filepath
|
|
| Need_recursive_types of modname
|
|
| Depend_on_unsafe_string_unit of modname
|
|
|
|
exception Error of error
|
|
|
|
val report_error: Format.formatter -> error -> unit
|
|
|
|
module Persistent_signature : sig
|
|
type t =
|
|
{ filename : string; (** Name of the file containing the signature. *)
|
|
cmi : Cmi_format.cmi_infos }
|
|
|
|
(** Function used to load a persistent signature. The default is to look for
|
|
the .cmi file in the load path. This function can be overridden to load
|
|
it from memory, for instance to build a self-contained toplevel. *)
|
|
val load : (unit_name:string -> t option) ref
|
|
end
|
|
|
|
type can_load_cmis =
|
|
| Can_load_cmis
|
|
| Cannot_load_cmis of Misc.EnvLazy.log
|
|
|
|
type 'a t
|
|
|
|
val empty : unit -> 'a t
|
|
|
|
val clear : 'a t -> unit
|
|
val clear_missing : 'a t -> unit
|
|
|
|
val fold : 'a t -> (modname -> 'a -> 'b -> 'b) -> 'b -> 'b
|
|
|
|
val read : 'a t -> (Persistent_signature.t -> 'a)
|
|
-> modname -> filepath -> 'a
|
|
val find : 'a t -> (Persistent_signature.t -> 'a)
|
|
-> modname -> 'a
|
|
|
|
val find_in_cache : 'a t -> modname -> 'a option
|
|
|
|
val check : 'a t -> (Persistent_signature.t -> 'a)
|
|
-> loc:Location.t -> modname -> unit
|
|
|
|
(* [looked_up penv md] checks if one has already tried
|
|
to read the signature for [md] in the environment
|
|
[penv] (it may have failed) *)
|
|
val looked_up : 'a t -> modname -> bool
|
|
|
|
(* [is_imported penv md] checks if [md] has been successfully
|
|
imported in the environment [penv] *)
|
|
val is_imported : 'a t -> modname -> bool
|
|
|
|
(* [is_imported_opaque penv md] checks if [md] has been imported
|
|
in [penv] as an opaque module *)
|
|
val is_imported_opaque : 'a t -> modname -> bool
|
|
|
|
(* [register_import_as_opaque penv md] registers [md] in [penv] as an
|
|
opaque module *)
|
|
val register_import_as_opaque : 'a t -> modname -> unit
|
|
|
|
val make_cmi : 'a t -> modname -> Types.signature -> alerts
|
|
-> Cmi_format.cmi_infos
|
|
|
|
val save_cmi : 'a t -> Persistent_signature.t -> 'a -> unit
|
|
|
|
val can_load_cmis : 'a t -> can_load_cmis
|
|
val set_can_load_cmis : 'a t -> can_load_cmis -> unit
|
|
val without_cmis : 'a t -> ('b -> 'c) -> 'b -> 'c
|
|
(* [without_cmis penv f arg] applies [f] to [arg], but does not
|
|
allow [penv] to openi cmis during its execution *)
|
|
|
|
(* may raise Consistbl.Inconsistency *)
|
|
val import_crcs : 'a t -> source:filepath -> crcs -> unit
|
|
|
|
(* Return the set of compilation units imported, with their CRC *)
|
|
val imports : 'a t -> crcs
|
|
|
|
(* Return the CRC of the interface of the given compilation unit *)
|
|
val crc_of_unit: 'a t -> (Persistent_signature.t -> 'a) -> modname -> Digest.t
|
|
|
|
(* Forward declaration to break mutual recursion with Typecore. *)
|
|
val add_delayed_check_forward: ((unit -> unit) -> unit) ref
|