diff options
Diffstat (limited to 'typing/env.ml')
| -rw-r--r-- | typing/env.ml | 784 |
1 files changed, 0 insertions, 784 deletions
diff --git a/typing/env.ml b/typing/env.ml deleted file mode 100644 index 4ccb7f7e27..0000000000 --- a/typing/env.ml +++ /dev/null @@ -1,784 +0,0 @@ -(***********************************************************************) -(* *) -(* Objective Caml *) -(* *) -(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) -(* *) -(* Copyright 1996 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed *) -(* under the terms of the Q Public License version 1.0. *) -(* *) -(***********************************************************************) - -(* $Id$ *) - -(* Environment handling *) - -open Config -open Misc -open Asttypes -open Longident -open Path -open Types - - -type error = - Not_an_interface of string - | Corrupted_interface of string - | Illegal_renaming of string * string - | Inconsistent_import of string * string * string - -exception Error of error - -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 - -type t = { - values: (Path.t * value_description) Ident.tbl; - constrs: constructor_description Ident.tbl; - labels: label_description Ident.tbl; - types: (Path.t * type_declaration) Ident.tbl; - modules: (Path.t * module_type) Ident.tbl; - modtypes: (Path.t * modtype_declaration) Ident.tbl; - components: (Path.t * module_components) Ident.tbl; - classes: (Path.t * class_declaration) Ident.tbl; - cltypes: (Path.t * cltype_declaration) Ident.tbl; - summary: summary -} - -and module_components = module_components_repr Lazy.t - -and module_components_repr = - Structure_comps of structure_components - | Functor_comps of functor_components - -and structure_components = { - mutable comp_values: (string, (value_description * int)) Tbl.t; - mutable comp_constrs: (string, (constructor_description * int)) Tbl.t; - mutable comp_labels: (string, (label_description * int)) Tbl.t; - mutable comp_types: (string, (type_declaration * int)) Tbl.t; - mutable comp_modules: (string, (module_type * int)) Tbl.t; - mutable comp_modtypes: (string, (modtype_declaration * int)) Tbl.t; - mutable comp_components: (string, (module_components * int)) Tbl.t; - mutable comp_classes: (string, (class_declaration * int)) Tbl.t; - mutable comp_cltypes: (string, (cltype_declaration * int)) Tbl.t -} - -and functor_components = { - fcomp_param: Ident.t; (* Formal parameter *) - fcomp_arg: module_type; (* Argument signature *) - fcomp_res: module_type; (* Result signature *) - fcomp_env: t; (* Environment in which the result signature makes sense *) - fcomp_subst: Subst.t (* Prefixing substitution for the result signature *) -} - -let empty = { - values = Ident.empty; constrs = Ident.empty; - labels = Ident.empty; types = Ident.empty; - modules = Ident.empty; modtypes = Ident.empty; - components = Ident.empty; classes = Ident.empty; - cltypes = Ident.empty; - summary = Env_empty } - -let diff_keys tbl1 tbl2 = - let keys2 = Ident.keys tbl2 in - List.filter - (fun id -> - match Ident.find_same id tbl2 with Pident _, _ -> - (try ignore (Ident.find_same id tbl1); false with Not_found -> true) - | _ -> false) - keys2 - -let diff env1 env2 = - diff_keys env1.values env2.values @ - diff_keys env1.modules env2.modules @ - diff_keys env1.classes env2.classes - -(* Forward declarations *) - -let components_of_module' = - ref ((fun env sub path mty -> assert false) : - t -> Subst.t -> Path.t -> module_type -> module_components) -let components_of_functor_appl' = - ref ((fun f p1 p2 -> assert false) : - functor_components -> Path.t -> Path.t -> module_components) -let check_modtype_inclusion = - (* to be filled with Includemod.check_modtype_inclusion *) - ref ((fun env mty1 mty2 -> assert false) : - t -> module_type -> module_type -> unit) - -(* Persistent structure descriptions *) - -type pers_struct = - { ps_name: string; - ps_sig: signature; - ps_comps: module_components; - ps_crcs: (string * Digest.t) list; - ps_filename: string } - -let persistent_structures = - (Hashtbl.create 17 : (string, pers_struct) Hashtbl.t) - -(* Consistency between persistent structures *) - -let crc_units = Consistbl.create() - -let check_consistency filename crcs = - try - List.iter - (fun (name, crc) -> Consistbl.check crc_units name crc filename) - crcs - with Consistbl.Inconsistency(name, source, auth) -> - raise(Error(Inconsistent_import(name, auth, source))) - -(* Reading persistent structures from .cmi files *) - -let read_pers_struct modname filename = - let ic = open_in_bin filename in - try - let buffer = String.create (String.length cmi_magic_number) in - really_input ic buffer 0 (String.length cmi_magic_number); - if buffer <> cmi_magic_number then begin - close_in ic; - raise(Error(Not_an_interface filename)) - end; - let (name, sign) = input_value ic in - let crcs = input_value ic in - close_in ic; - let comps = - !components_of_module' empty Subst.identity - (Pident(Ident.create_persistent name)) - (Tmty_signature sign) in - let ps = { ps_name = name; - ps_sig = sign; - ps_comps = comps; - ps_crcs = crcs; - ps_filename = filename } in - if ps.ps_name <> modname then - raise(Error(Illegal_renaming(ps.ps_name, filename))); - check_consistency filename ps.ps_crcs; - Hashtbl.add persistent_structures modname ps; - ps - with End_of_file | Failure _ -> - close_in ic; - raise(Error(Corrupted_interface(filename))) - -let find_pers_struct name = - try - Hashtbl.find persistent_structures name - with Not_found -> - read_pers_struct name (find_in_path_uncap !load_path (name ^ ".cmi")) - -let reset_cache() = - Hashtbl.clear persistent_structures; - Consistbl.clear crc_units - -(* Lookup by identifier *) - -let rec find_module_descr path env = - match path with - Pident id -> - begin try - let (p, desc) = Ident.find_same id env.components - in desc - with Not_found -> - if Ident.persistent id - then (find_pers_struct (Ident.name id)).ps_comps - else raise Not_found - end - | Pdot(p, s, pos) -> - begin match Lazy.force(find_module_descr p env) with - Structure_comps c -> - let (descr, pos) = Tbl.find s c.comp_components in - descr - | Functor_comps f -> - raise Not_found - end - | Papply(p1, p2) -> - begin match Lazy.force(find_module_descr p1 env) with - Functor_comps f -> - !components_of_functor_appl' f p1 p2 - | Structure_comps c -> - raise Not_found - end - -let find proj1 proj2 path env = - match path with - Pident id -> - let (p, data) = Ident.find_same id (proj1 env) - in data - | Pdot(p, s, pos) -> - begin match Lazy.force(find_module_descr p env) with - Structure_comps c -> - let (data, pos) = Tbl.find s (proj2 c) in data - | Functor_comps f -> - raise Not_found - end - | Papply(p1, p2) -> - raise Not_found - -let find_value = - find (fun env -> env.values) (fun sc -> sc.comp_values) -and find_type = - find (fun env -> env.types) (fun sc -> sc.comp_types) -and find_modtype = - find (fun env -> env.modtypes) (fun sc -> sc.comp_modtypes) -and find_class = - find (fun env -> env.classes) (fun sc -> sc.comp_classes) -and find_cltype = - find (fun env -> env.cltypes) (fun sc -> sc.comp_cltypes) - -let find_type_expansion path env = - let decl = find_type path env in - match decl.type_manifest with - None -> raise Not_found - | Some body -> (decl.type_params, body) - -let find_modtype_expansion path env = - match find_modtype path env with - Tmodtype_abstract -> raise Not_found - | Tmodtype_manifest mty -> mty - -let find_module path env = - match path with - Pident id -> - begin try - let (p, data) = Ident.find_same id env.modules - in data - with Not_found -> - if Ident.persistent id then - let ps = find_pers_struct (Ident.name id) in - Tmty_signature(ps.ps_sig) - else raise Not_found - end - | Pdot(p, s, pos) -> - begin match Lazy.force (find_module_descr p env) with - Structure_comps c -> - let (data, pos) = Tbl.find s c.comp_modules in data - | Functor_comps f -> - raise Not_found - end - | Papply(p1, p2) -> - raise Not_found (* not right *) - -(* Lookup by name *) - -let rec lookup_module_descr lid env = - match lid with - Lident s -> - begin try - Ident.find_name s env.components - with Not_found -> - let ps = find_pers_struct s in - (Pident(Ident.create_persistent s), ps.ps_comps) - end - | Ldot(l, s) -> - let (p, descr) = lookup_module_descr l env in - begin match Lazy.force descr with - Structure_comps c -> - let (descr, pos) = Tbl.find s c.comp_components in - (Pdot(p, s, pos), descr) - | Functor_comps f -> - raise Not_found - end - | Lapply(l1, l2) -> - let (p1, desc1) = lookup_module_descr l1 env in - let (p2, mty2) = lookup_module l2 env in - begin match Lazy.force desc1 with - Functor_comps f -> - !check_modtype_inclusion env mty2 f.fcomp_arg; - (Papply(p1, p2), !components_of_functor_appl' f p1 p2) - | Structure_comps c -> - raise Not_found - end - -and lookup_module lid env = - match lid with - Lident s -> - begin try - Ident.find_name s env.modules - with Not_found -> - let ps = find_pers_struct s in - (Pident(Ident.create_persistent s), Tmty_signature ps.ps_sig) - end - | Ldot(l, s) -> - let (p, descr) = lookup_module_descr l env in - begin match Lazy.force descr with - Structure_comps c -> - let (data, pos) = Tbl.find s c.comp_modules in - (Pdot(p, s, pos), data) - | Functor_comps f -> - raise Not_found - end - | Lapply(l1, l2) -> - let (p1, desc1) = lookup_module_descr l1 env in - let (p2, mty2) = lookup_module l2 env in - let p = Papply(p1, p2) in - begin match Lazy.force desc1 with - Functor_comps f -> - !check_modtype_inclusion env mty2 f.fcomp_arg; - (p, Subst.modtype (Subst.add_module f.fcomp_param p2 f.fcomp_subst) - f.fcomp_res) - | Structure_comps c -> - raise Not_found - end - -let lookup proj1 proj2 lid env = - match lid with - Lident s -> - Ident.find_name s (proj1 env) - | Ldot(l, s) -> - let (p, desc) = lookup_module_descr l env in - begin match Lazy.force desc with - Structure_comps c -> - let (data, pos) = Tbl.find s (proj2 c) in - (Pdot(p, s, pos), data) - | Functor_comps f -> - raise Not_found - end - | Lapply(l1, l2) -> - raise Not_found - -let lookup_simple proj1 proj2 lid env = - match lid with - Lident s -> - Ident.find_name s (proj1 env) - | Ldot(l, s) -> - let (p, desc) = lookup_module_descr l env in - begin match Lazy.force desc with - Structure_comps c -> - let (data, pos) = Tbl.find s (proj2 c) in - data - | Functor_comps f -> - raise Not_found - end - | Lapply(l1, l2) -> - raise Not_found - -let lookup_value = - lookup (fun env -> env.values) (fun sc -> sc.comp_values) -and lookup_constructor = - lookup_simple (fun env -> env.constrs) (fun sc -> sc.comp_constrs) -and lookup_label = - lookup_simple (fun env -> env.labels) (fun sc -> sc.comp_labels) -and lookup_type = - lookup (fun env -> env.types) (fun sc -> sc.comp_types) -and lookup_modtype = - lookup (fun env -> env.modtypes) (fun sc -> sc.comp_modtypes) -and lookup_class = - lookup (fun env -> env.classes) (fun sc -> sc.comp_classes) -and lookup_cltype = - lookup (fun env -> env.cltypes) (fun sc -> sc.comp_cltypes) - -(* Expand manifest module type names at the top of the given module type *) - -let rec scrape_modtype mty env = - match mty with - Tmty_ident path -> - begin try - scrape_modtype (find_modtype_expansion path env) env - with Not_found -> - mty - end - | _ -> mty - -(* Compute constructor descriptions *) - -let constructors_of_type ty_path decl = - match decl.type_kind with - Type_variant(cstrs, priv) -> - Datarepr.constructor_descrs - (Btype.newgenty (Tconstr(ty_path, decl.type_params, ref Mnil))) - cstrs priv - | Type_record _ | Type_abstract -> [] - -(* Compute label descriptions *) - -let labels_of_type ty_path decl = - match decl.type_kind with - Type_record(labels, rep, priv) -> - Datarepr.label_descrs - (Btype.newgenty (Tconstr(ty_path, decl.type_params, ref Mnil))) - labels rep priv - | Type_variant _ | Type_abstract -> [] - -(* Given a signature and a root path, prefix all idents in the signature - by the root path and build the corresponding substitution. *) - -let rec prefix_idents root pos sub = function - [] -> ([], sub) - | Tsig_value(id, decl) :: rem -> - let p = Pdot(root, Ident.name id, pos) in - let nextpos = match decl.val_kind with Val_prim _ -> pos | _ -> pos+1 in - let (pl, final_sub) = prefix_idents root nextpos sub rem in - (p::pl, final_sub) - | Tsig_type(id, decl) :: rem -> - let p = Pdot(root, Ident.name id, nopos) in - let (pl, final_sub) = - prefix_idents root pos (Subst.add_type id p sub) rem in - (p::pl, final_sub) - | Tsig_exception(id, decl) :: rem -> - let p = Pdot(root, Ident.name id, pos) in - let (pl, final_sub) = prefix_idents root (pos+1) sub rem in - (p::pl, final_sub) - | Tsig_module(id, mty) :: rem -> - let p = Pdot(root, Ident.name id, pos) in - let (pl, final_sub) = - prefix_idents root (pos+1) (Subst.add_module id p sub) rem in - (p::pl, final_sub) - | Tsig_modtype(id, decl) :: rem -> - let p = Pdot(root, Ident.name id, nopos) in - let (pl, final_sub) = - prefix_idents root pos - (Subst.add_modtype id (Tmty_ident p) sub) rem in - (p::pl, final_sub) - | Tsig_class(id, decl) :: rem -> - let p = Pdot(root, Ident.name id, pos) in - let (pl, final_sub) = prefix_idents root (pos + 1) sub rem in - (p::pl, final_sub) - | Tsig_cltype(id, decl) :: rem -> - let p = Pdot(root, Ident.name id, nopos) in - let (pl, final_sub) = prefix_idents root pos sub rem in - (p::pl, final_sub) - -(* Compute structure descriptions *) - -let rec components_of_module env sub path mty = - lazy(match scrape_modtype mty env with - Tmty_signature sg -> - let c = - { comp_values = Tbl.empty; comp_constrs = Tbl.empty; - comp_labels = Tbl.empty; comp_types = Tbl.empty; - comp_modules = Tbl.empty; comp_modtypes = Tbl.empty; - comp_components = Tbl.empty; comp_classes = Tbl.empty; - comp_cltypes = Tbl.empty } in - let (pl, sub) = prefix_idents path 0 sub sg in - let env = ref env in - let pos = ref 0 in - List.iter2 (fun item path -> - match item with - Tsig_value(id, decl) -> - let decl' = Subst.value_description sub decl in - c.comp_values <- - Tbl.add (Ident.name id) (decl', !pos) c.comp_values; - begin match decl.val_kind with - Val_prim _ -> () | _ -> incr pos - end - | Tsig_type(id, decl) -> - let decl' = Subst.type_declaration sub decl in - c.comp_types <- - Tbl.add (Ident.name id) (decl', nopos) c.comp_types; - List.iter - (fun (name, descr) -> - c.comp_constrs <- Tbl.add name (descr, nopos) c.comp_constrs) - (constructors_of_type path decl'); - List.iter - (fun (name, descr) -> - c.comp_labels <- Tbl.add name (descr, nopos) c.comp_labels) - (labels_of_type path decl'); - env := store_type_infos id path decl !env - | Tsig_exception(id, decl) -> - let decl' = Subst.exception_declaration sub decl in - let cstr = Datarepr.exception_descr path decl' in - c.comp_constrs <- - Tbl.add (Ident.name id) (cstr, !pos) c.comp_constrs; - incr pos - | Tsig_module(id, mty) -> - let mty' = Subst.modtype sub mty in - c.comp_modules <- - Tbl.add (Ident.name id) (mty', !pos) c.comp_modules; - let comps = components_of_module !env sub path mty in - c.comp_components <- - Tbl.add (Ident.name id) (comps, !pos) c.comp_components; - env := store_module id path mty !env; - incr pos - | Tsig_modtype(id, decl) -> - let decl' = Subst.modtype_declaration sub decl in - c.comp_modtypes <- - Tbl.add (Ident.name id) (decl', nopos) c.comp_modtypes; - env := store_modtype id path decl !env - | Tsig_class(id, decl) -> - let decl' = Subst.class_declaration sub decl in - c.comp_classes <- - Tbl.add (Ident.name id) (decl', !pos) c.comp_classes; - incr pos - | Tsig_cltype(id, decl) -> - let decl' = Subst.cltype_declaration sub decl in - c.comp_cltypes <- - Tbl.add (Ident.name id) (decl', !pos) c.comp_cltypes) - sg pl; - Structure_comps c - | Tmty_functor(param, ty_arg, ty_res) -> - Functor_comps { - fcomp_param = param; - (* fcomp_arg must be prefixed eagerly, because it is interpreted - in the outer environment, not in env *) - fcomp_arg = Subst.modtype sub ty_arg; - (* fcomp_res is prefixed lazily, because it is interpreted in env *) - fcomp_res = ty_res; - fcomp_env = env; - fcomp_subst = sub } - | Tmty_ident p -> - Structure_comps { - comp_values = Tbl.empty; comp_constrs = Tbl.empty; - comp_labels = Tbl.empty; comp_types = Tbl.empty; - comp_modules = Tbl.empty; comp_modtypes = Tbl.empty; - comp_components = Tbl.empty; comp_classes = Tbl.empty; - comp_cltypes = Tbl.empty }) - -(* Insertion of bindings by identifier + path *) - -and store_value id path decl env = - { env with - values = Ident.add id (path, decl) env.values; - summary = Env_value(env.summary, id, decl) } - -and store_type id path info env = - { env with - constrs = - List.fold_right - (fun (name, descr) constrs -> - Ident.add (Ident.create name) descr constrs) - (constructors_of_type path info) - env.constrs; - labels = - List.fold_right - (fun (name, descr) labels -> - Ident.add (Ident.create name) descr labels) - (labels_of_type path info) - env.labels; - types = Ident.add id (path, info) env.types; - summary = Env_type(env.summary, id, info) } - -and store_type_infos id path info env = - (* Simplified version of store_type that doesn't compute and store - constructor and label infos, but simply record the arity and - manifest-ness of the type. Used in components_of_module to - keep track of type abbreviations (e.g. type t = float) in the - computation of label representations. *) - { env with - types = Ident.add id (path, info) env.types; - summary = Env_type(env.summary, id, info) } - -and store_exception id path decl env = - { env with - constrs = Ident.add id (Datarepr.exception_descr path decl) env.constrs; - summary = Env_exception(env.summary, id, decl) } - -and store_module id path mty env = - { env with - modules = Ident.add id (path, mty) env.modules; - components = - Ident.add id (path, components_of_module env Subst.identity path mty) - env.components; - summary = Env_module(env.summary, id, mty) } - -and store_modtype id path info env = - { env with - modtypes = Ident.add id (path, info) env.modtypes; - summary = Env_modtype(env.summary, id, info) } - -and store_class id path desc env = - { env with - classes = Ident.add id (path, desc) env.classes; - summary = Env_class(env.summary, id, desc) } - -and store_cltype id path desc env = - { env with - cltypes = Ident.add id (path, desc) env.cltypes; - summary = Env_cltype(env.summary, id, desc) } - -(* Compute the components of a functor application in a path. *) - -let components_of_functor_appl f p1 p2 = - let p = Papply(p1, p2) in - let mty = - Subst.modtype (Subst.add_module f.fcomp_param p2 Subst.identity) - f.fcomp_res in - components_of_module f.fcomp_env f.fcomp_subst p mty - -(* Define forward functions *) - -let _ = - components_of_module' := components_of_module; - components_of_functor_appl' := components_of_functor_appl - -(* Insertion of bindings by identifier *) - -let add_value id desc env = - store_value id (Pident id) desc env - -and add_type id info env = - store_type id (Pident id) info env - -and add_exception id decl env = - store_exception id (Pident id) decl env - -and add_module id mty env = - store_module id (Pident id) mty env - -and add_modtype id info env = - store_modtype id (Pident id) info env - -and add_class id ty env = - store_class id (Pident id) ty env - -and add_cltype id ty env = - store_cltype id (Pident id) ty env - -(* Insertion of bindings by name *) - -let enter store_fun name data env = - let id = Ident.create name in (id, store_fun id (Pident id) data env) - -let enter_value = enter store_value -and enter_type = enter store_type -and enter_exception = enter store_exception -and enter_module = enter store_module -and enter_modtype = enter store_modtype -and enter_class = enter store_class -and enter_cltype = enter store_cltype - -(* Insertion of all components of a signature *) - -let add_item comp env = - match comp with - Tsig_value(id, decl) -> add_value id decl env - | Tsig_type(id, decl) -> add_type id decl env - | Tsig_exception(id, decl) -> add_exception id decl env - | Tsig_module(id, mty) -> add_module id mty env - | Tsig_modtype(id, decl) -> add_modtype id decl env - | Tsig_class(id, decl) -> add_class id decl env - | Tsig_cltype(id, decl) -> add_cltype id decl env - -let rec add_signature sg env = - match sg with - [] -> env - | comp :: rem -> add_signature rem (add_item comp env) - -(* Open a signature path *) - -let open_signature root sg env = - (* First build the paths and substitution *) - let (pl, sub) = prefix_idents root 0 Subst.identity sg in - (* Then enter the components in the environment after substitution *) - let newenv = - List.fold_left2 - (fun env item p -> - match item with - Tsig_value(id, decl) -> - store_value (Ident.hide id) p - (Subst.value_description sub decl) env - | Tsig_type(id, decl) -> - store_type (Ident.hide id) p - (Subst.type_declaration sub decl) env - | Tsig_exception(id, decl) -> - store_exception (Ident.hide id) p - (Subst.exception_declaration sub decl) env - | Tsig_module(id, mty) -> - store_module (Ident.hide id) p (Subst.modtype sub mty) env - | Tsig_modtype(id, decl) -> - store_modtype (Ident.hide id) p - (Subst.modtype_declaration sub decl) env - | Tsig_class(id, decl) -> - store_class (Ident.hide id) p - (Subst.class_declaration sub decl) env - | Tsig_cltype(id, decl) -> - store_cltype (Ident.hide id) p - (Subst.cltype_declaration sub decl) env) - env sg pl in - { newenv with summary = Env_open(env.summary, root) } - -(* Open a signature from a file *) - -let open_pers_signature name env = - let ps = find_pers_struct name in - open_signature (Pident(Ident.create_persistent name)) ps.ps_sig env - -(* Read a signature from a file *) - -let read_signature modname filename = - let ps = read_pers_struct modname filename in ps.ps_sig - -(* Return the CRC of the interface of the given compilation unit *) - -let crc_of_unit name = - let ps = find_pers_struct name in - try - List.assoc name ps.ps_crcs - with Not_found -> - assert false - -(* Return the list of imported interfaces with their CRCs *) - -let imported_units() = - Consistbl.extract crc_units - -(* Save a signature to a file *) - -let save_signature_with_imports sg modname filename imports = - Btype.cleanup_abbrev (); - Subst.reset_for_saving (); - let sg = Subst.signature (Subst.for_saving Subst.identity) sg in - let oc = open_out_bin filename in - try - output_string oc cmi_magic_number; - output_value oc (modname, sg); - flush oc; - let crc = Digest.file filename in - let crcs = (modname, crc) :: imports in - output_value oc crcs; - close_out oc; - (* Enter signature in persistent table so that imported_unit() - will also return its crc *) - let comps = - components_of_module empty Subst.identity - (Pident(Ident.create_persistent modname)) (Tmty_signature sg) in - let ps = - { ps_name = modname; - ps_sig = sg; - ps_comps = comps; - ps_crcs = crcs; - ps_filename = filename } in - Hashtbl.add persistent_structures modname ps; - Consistbl.set crc_units modname crc filename - with exn -> - close_out oc; - remove_file filename; - raise exn - -let save_signature sg modname filename = - save_signature_with_imports sg modname filename (imported_units()) - -(* Make the initial environment *) - -let initial = Predef.build_initial_env add_type add_exception empty - -(* Return the environment summary *) - -let summary env = env.summary - -(* Error report *) - -open Format - -let report_error ppf = function - | Not_an_interface filename -> fprintf ppf - "%s@ is not a compiled interface" filename - | Corrupted_interface filename -> fprintf ppf - "Corrupted compiled interface@ %s" filename - | Illegal_renaming(modname, filename) -> fprintf ppf - "Wrong file naming: %s@ contains the compiled interface for@ %s" - filename modname - | Inconsistent_import(name, source1, source2) -> fprintf ppf - "@[<hov>The files %s@ and %s@ \ - make inconsistent assumptions@ over interface %s@]" - source1 source2 name |
