summaryrefslogtreecommitdiff
path: root/typing/env.mli
diff options
context:
space:
mode:
Diffstat (limited to 'typing/env.mli')
-rw-r--r--typing/env.mli109
1 files changed, 80 insertions, 29 deletions
diff --git a/typing/env.mli b/typing/env.mli
index 20a8509e21..8a92525b7e 100644
--- a/typing/env.mli
+++ b/typing/env.mli
@@ -16,6 +16,17 @@
open Types
+type summary =
+ Env_empty
+ | Env_value of summary * Ident.t * value_description
+ | Env_type of summary * Ident.t * type_declaration
+ | Env_exception of summary * Ident.t * exception_declaration
+ | Env_module of summary * Ident.t * module_type
+ | Env_modtype of summary * Ident.t * modtype_declaration
+ | Env_class of summary * Ident.t * class_declaration
+ | Env_cltype of summary * Ident.t * class_type_declaration
+ | Env_open of summary * Path.t
+
type t
val empty: t
@@ -26,12 +37,13 @@ val iter_types: (Path.t -> Path.t * type_declaration -> unit) -> t -> unit
(* Lookup by paths *)
val find_value: Path.t -> t -> value_description
+val find_annot: Path.t -> t -> Annot.ident
val find_type: Path.t -> t -> type_declaration
val find_constructors: Path.t -> t -> constructor_description list
val find_module: Path.t -> t -> module_type
val find_modtype: Path.t -> t -> modtype_declaration
val find_class: Path.t -> t -> class_declaration
-val find_cltype: Path.t -> t -> cltype_declaration
+val find_cltype: Path.t -> t -> class_type_declaration
val find_type_expansion:
?level:int -> Path.t -> t -> type_expr list * type_expr * int option
@@ -51,24 +63,25 @@ val add_gadt_instance_chain: t -> int -> type_expr -> unit
val lookup_value: Longident.t -> t -> Path.t * value_description
val lookup_annot: Longident.t -> t -> Path.t * Annot.ident
-val lookup_constructor: Longident.t -> t -> constructor_description
-val lookup_label: Longident.t -> t -> label_description
+val lookup_constructor: Longident.t -> t -> Path.t * constructor_description
+val lookup_label: Longident.t -> t -> Path.t * label_description
val lookup_type: Longident.t -> t -> Path.t * type_declaration
val lookup_module: Longident.t -> t -> Path.t * module_type
val lookup_modtype: Longident.t -> t -> Path.t * modtype_declaration
val lookup_class: Longident.t -> t -> Path.t * class_declaration
-val lookup_cltype: Longident.t -> t -> Path.t * cltype_declaration
+val lookup_cltype: Longident.t -> t -> Path.t * class_type_declaration
(* Insertion by identifier *)
-val add_value: ?check:(string -> Warnings.t) -> Ident.t -> value_description -> t -> t
+val add_value:
+ ?check:(string -> Warnings.t) -> Ident.t -> value_description -> t -> t
val add_annot: Ident.t -> Annot.ident -> t -> t
val add_type: Ident.t -> type_declaration -> t -> t
val add_exception: Ident.t -> exception_declaration -> t -> t
val add_module: Ident.t -> module_type -> t -> t
val add_modtype: Ident.t -> modtype_declaration -> t -> t
val add_class: Ident.t -> class_declaration -> t -> t
-val add_cltype: Ident.t -> cltype_declaration -> t -> t
+val add_cltype: Ident.t -> class_type_declaration -> t -> t
val add_local_constraint: Ident.t -> type_declaration -> int -> t -> t
(* Insertion of all fields of a signature. *)
@@ -79,21 +92,24 @@ val add_signature: signature -> t -> t
(* Insertion of all fields of a signature, relative to the given path.
Used to implement open. *)
-val open_signature: ?loc:Location.t -> Path.t -> signature -> t -> t
+val open_signature: ?loc:Location.t -> ?toplevel:bool -> Path.t -> signature -> t -> t
val open_pers_signature: string -> t -> t
(* Insertion by name *)
-val enter_value: ?check:(string -> Warnings.t) -> string -> value_description -> t -> Ident.t * t
+val enter_value:
+ ?check:(string -> Warnings.t) ->
+ string -> value_description -> t -> Ident.t * t
val enter_type: string -> type_declaration -> t -> Ident.t * t
val enter_exception: string -> exception_declaration -> t -> Ident.t * t
val enter_module: string -> module_type -> t -> Ident.t * t
val enter_modtype: string -> modtype_declaration -> t -> Ident.t * t
val enter_class: string -> class_declaration -> t -> Ident.t * t
-val enter_cltype: string -> cltype_declaration -> t -> Ident.t * t
+val enter_cltype: string -> class_type_declaration -> t -> Ident.t * t
(* Initialize the cache of in-core module interfaces. *)
val reset_cache: unit -> unit
+val reset_missing_cmis: unit -> unit
(* Remember the name of the current compilation unit. *)
val set_unit_name: string -> unit
@@ -102,10 +118,10 @@ val set_unit_name: string -> unit
val read_signature: string -> string -> signature
(* Arguments: module name, file name. Results: signature. *)
-val save_signature: signature -> string -> string -> unit
+val save_signature: signature -> string -> string -> signature
(* Arguments: signature, module name, file name. *)
val save_signature_with_imports:
- signature -> string -> string -> (string * Digest.t) list -> unit
+ signature -> string -> string -> (string * Digest.t) list -> signature
(* Arguments: signature, module name, file name,
imported units with their CRCs. *)
@@ -124,25 +140,19 @@ val crc_units: Consistbl.t
(* Summaries -- compact representation of an environment, to be
exported in debugging information. *)
-type summary =
- Env_empty
- | Env_value of summary * Ident.t * value_description
- | Env_type of summary * Ident.t * type_declaration
- | Env_exception of summary * Ident.t * exception_declaration
- | Env_module of summary * Ident.t * module_type
- | Env_modtype of summary * Ident.t * modtype_declaration
- | Env_class of summary * Ident.t * class_declaration
- | Env_cltype of summary * Ident.t * cltype_declaration
- | Env_open of summary * Path.t
-
val summary: t -> summary
+(* Return an equivalent environment where all fields have been reset,
+ except the summary. The initial environment can be rebuilt from the
+ summary, using Envaux.env_of_only_summary. *)
+
+val keep_only_summary : t -> t
+val env_of_only_summary : (summary -> Subst.t -> t) -> t -> t
+
+
(* Error report *)
type error =
- Not_an_interface of string
- | Wrong_version_interface of string * string
- | Corrupted_interface of string
| Illegal_renaming of string * string
| Inconsistent_import of string * string * string
| Need_recursive_types of string * string
@@ -153,16 +163,57 @@ open Format
val report_error: formatter -> error -> unit
+
val mark_value_used: string -> value_description -> unit
val mark_type_used: string -> type_declaration -> unit
-val mark_constructor_used: string -> type_declaration -> string -> unit
-val mark_constructor: t -> string -> constructor_description -> unit
-val set_value_used_callback: string -> value_description -> (unit -> unit) -> unit
-val set_type_used_callback: string -> type_declaration -> ((unit -> unit) -> unit) -> unit
+type constructor_usage = Positive | Pattern | Privatize
+val mark_constructor_used:
+ constructor_usage -> string -> type_declaration -> string -> unit
+val mark_constructor:
+ constructor_usage -> t -> string -> constructor_description -> unit
+val mark_exception_used:
+ constructor_usage -> exception_declaration -> string -> unit
+
+val in_signature: t -> t
+
+val set_value_used_callback:
+ string -> value_description -> (unit -> unit) -> unit
+val set_type_used_callback:
+ string -> type_declaration -> ((unit -> unit) -> unit) -> unit
(* Forward declaration to break mutual recursion with Includemod. *)
val check_modtype_inclusion:
(t -> module_type -> Path.t -> module_type -> unit) ref
(* Forward declaration to break mutual recursion with Typecore. *)
val add_delayed_check_forward: ((unit -> unit) -> unit) ref
+
+(** Folding over all identifiers (for analysis purpose) *)
+
+val fold_values:
+ (string -> Path.t -> Types.value_description -> 'a -> 'a) ->
+ Longident.t option -> t -> 'a -> 'a
+val fold_types:
+ (string -> Path.t -> Types.type_declaration -> 'a -> 'a) ->
+ Longident.t option -> t -> 'a -> 'a
+val fold_constructors:
+ (string -> Path.t -> Types.constructor_description -> 'a -> 'a) ->
+ Longident.t option -> t -> 'a -> 'a
+val fold_labels:
+ (string -> Path.t -> Types.label_description -> 'a -> 'a) ->
+ Longident.t option -> t -> 'a -> 'a
+
+(** Persistent structures are only traversed if they are already loaded. *)
+val fold_modules:
+ (string -> Path.t -> Types.module_type -> 'a -> 'a) ->
+ Longident.t option -> t -> 'a -> 'a
+
+val fold_modtypes:
+ (string -> Path.t -> Types.modtype_declaration -> 'a -> 'a) ->
+ Longident.t option -> t -> 'a -> 'a
+val fold_classs:
+ (string -> Path.t -> Types.class_declaration -> 'a -> 'a) ->
+ Longident.t option -> t -> 'a -> 'a
+val fold_cltypes:
+ (string -> Path.t -> Types.class_type_declaration -> 'a -> 'a) ->
+ Longident.t option -> t -> 'a -> 'a