From 7cfc4e5146be5666419451bdd516f1f3f264d24a Mon Sep 17 00:00:00 2001 From: Enrico Tassi Date: Sun, 25 Jan 2015 14:42:51 +0100 Subject: Imported Upstream version 8.5~beta1+dfsg --- parsing/prettyp.ml | 794 ----------------------------------------------------- 1 file changed, 794 deletions(-) delete mode 100644 parsing/prettyp.ml (limited to 'parsing/prettyp.ml') diff --git a/parsing/prettyp.ml b/parsing/prettyp.ml deleted file mode 100644 index 3b3fb2c3..00000000 --- a/parsing/prettyp.ml +++ /dev/null @@ -1,794 +0,0 @@ -(************************************************************************) -(* v * The Coq Proof Assistant / The Coq Development Team *) -(* - * on May-June 2006 for implementation of abstraction of pretty-printing of objects. - *) - -open Pp -open Util -open Names -open Nameops -open Term -open Termops -open Declarations -open Inductive -open Inductiveops -open Sign -open Reduction -open Environ -open Declare -open Impargs -open Libobject -open Printer -open Printmod -open Libnames -open Nametab -open Recordops - -type object_pr = { - print_inductive : mutual_inductive -> std_ppcmds; - print_constant_with_infos : constant -> std_ppcmds; - print_section_variable : variable -> std_ppcmds; - print_syntactic_def : kernel_name -> std_ppcmds; - print_module : bool -> Names.module_path -> std_ppcmds; - print_modtype : module_path -> std_ppcmds; - print_named_decl : identifier * constr option * types -> std_ppcmds; - print_library_entry : bool -> (object_name * Lib.node) -> std_ppcmds option; - print_context : bool -> int option -> Lib.library_segment -> std_ppcmds; - print_typed_value_in_env : Environ.env -> Term.constr * Term.types -> Pp.std_ppcmds; - print_eval : Reductionops.reduction_function -> env -> Evd.evar_map -> Topconstr.constr_expr -> unsafe_judgment -> std_ppcmds; -} - -let gallina_print_module = print_module -let gallina_print_modtype = print_modtype - -(**************) -(** Utilities *) - -let print_closed_sections = ref false - -let pr_infos_list l = v 0 (prlist_with_sep cut (fun x -> x) l) ++ fnl() - -let with_line_skip l = if l = [] then mt() else fnl() ++ pr_infos_list l - -let blankline = mt() (* add a blank sentence in the list of infos *) - -let add_colon prefix = if ismt prefix then mt () else prefix ++ str ": " - -let int_or_no n = if n=0 then str "no" else int n - -(*******************) -(** Basic printing *) - -let print_basename sp = pr_global (ConstRef sp) - -let print_ref reduce ref = - let typ = Global.type_of_global ref in - let typ = - if reduce then - let ctx,ccl = Reductionops.splay_prod_assum (Global.env()) Evd.empty typ - in it_mkProd_or_LetIn ccl ctx - else typ in - hov 0 (pr_global ref ++ str " :" ++ spc () ++ pr_ltype typ) - -(********************************) -(** Printing implicit arguments *) - -let conjugate_verb_to_be = function [_] -> "is" | _ -> "are" - -let pr_impl_name imp = pr_id (name_of_implicit imp) - -let print_impargs_by_name max = function - | [] -> [] - | impls -> - [hov 0 (str (plural (List.length impls) "Argument") ++ spc() ++ - prlist_with_sep pr_comma pr_impl_name impls ++ spc() ++ - str (conjugate_verb_to_be impls) ++ str" implicit" ++ - (if max then strbrk " and maximally inserted" else mt()))] - -let print_one_impargs_list l = - let imps = List.filter is_status_implicit l in - let maximps = List.filter Impargs.maximal_insertion_of imps in - let nonmaximps = list_subtract imps maximps in - print_impargs_by_name false nonmaximps @ - print_impargs_by_name true maximps - -let print_impargs_list prefix l = - let l = extract_impargs_data l in - List.flatten (List.map (fun (cond,imps) -> - match cond with - | None -> - List.map (fun pp -> add_colon prefix ++ pp) - (print_one_impargs_list imps) - | Some (n1,n2) -> - [v 2 (prlist_with_sep cut (fun x -> x) - [(if ismt prefix then str "When" else prefix ++ str ", when") ++ - str " applied to " ++ - (if n1 = n2 then int_or_no n2 else - if n1 = 0 then str "less than " ++ int n2 - else int n1 ++ str " to " ++ int_or_no n2) ++ - str (plural n2 " argument") ++ str ":"; - v 0 (prlist_with_sep cut (fun x -> x) - (if List.exists is_status_implicit imps - then print_one_impargs_list imps - else [str "No implicit arguments"]))])]) l) - -let print_renames_list prefix l = - if l = [] then [] else - [add_colon prefix ++ str "Arguments are renamed to " ++ - hv 2 (prlist_with_sep pr_comma (fun x -> x) (List.map pr_name l))] - -let need_expansion impl ref = - let typ = Global.type_of_global ref in - let ctx = (prod_assum typ) in - let nprods = List.length (List.filter (fun (_,b,_) -> b=None) ctx) in - impl <> [] & List.length impl >= nprods & - let _,lastimpl = list_chop nprods impl in - List.filter is_status_implicit lastimpl <> [] - -let print_impargs ref = - let ref = Smartlocate.smart_global ref in - let impl = implicits_of_global ref in - let has_impl = impl <> [] in - (* Need to reduce since implicits are computed with products flattened *) - pr_infos_list - ([ print_ref (need_expansion (select_impargs_size 0 impl) ref) ref; - blankline ] @ - (if has_impl then print_impargs_list (mt()) impl - else [str "No implicit arguments"])) - -(*********************) -(** Printing Scopes *) - -let print_argument_scopes prefix = function - | [Some sc] -> - [add_colon prefix ++ str"Argument scope is [" ++ str sc ++ str"]"] - | l when not (List.for_all ((=) None) l) -> - [add_colon prefix ++ hov 2 (str"Argument scopes are" ++ spc() ++ - str "[" ++ - prlist_with_sep spc (function Some sc -> str sc | None -> str "_") l ++ - str "]")] - | _ -> [] - -(*****************************) -(** Printing simpl behaviour *) - -let print_simpl_behaviour ref = - match Tacred.get_simpl_behaviour ref with - | None -> [] - | Some (recargs, nargs, flags) -> - let never = List.mem `SimplNeverUnfold flags in - let nomatch = List.mem `SimplDontExposeCase flags in - let pp_nomatch = spc() ++ if nomatch then - str "avoiding to expose match constructs" else str"" in - let pp_recargs = spc() ++ str "when the " ++ - let rec aux = function - | [] -> mt() - | [x] -> str (ordinal (x+1)) - | [x;y] -> str (ordinal (x+1)) ++ str " and " ++ str (ordinal (y+1)) - | x::tl -> str (ordinal (x+1)) ++ str ", " ++ aux tl in - aux recargs ++ str (plural (List.length recargs) " argument") ++ - str (plural (if List.length recargs >= 2 then 1 else 2) " evaluate") ++ - str " to a constructor" in - let pp_nargs = - spc() ++ str "when applied to " ++ int nargs ++ - str (plural nargs " argument") in - [hov 2 (str "The simpl tactic " ++ - match recargs, nargs, never with - | _,_, true -> str "never unfolds " ++ pr_global ref - | [], 0, _ -> str "always unfolds " ++ pr_global ref - | _::_, n, _ when n < 0 -> - str "unfolds " ++ pr_global ref ++ pp_recargs ++ pp_nomatch - | _::_, n, _ when n > List.fold_left max 0 recargs -> - str "unfolds " ++ pr_global ref ++ pp_recargs ++ - str " and" ++ pp_nargs ++ pp_nomatch - | _::_, _, _ -> - str "unfolds " ++ pr_global ref ++ pp_recargs ++ pp_nomatch - | [], n, _ when n > 0 -> - str "unfolds " ++ pr_global ref ++ pp_nargs ++ pp_nomatch - | _ -> str "unfolds " ++ pr_global ref ++ pp_nomatch )] -;; - -(*********************) -(** Printing Opacity *) - -type opacity = - | FullyOpaque - | TransparentMaybeOpacified of Conv_oracle.level - -let opacity env = function - | VarRef v when pi2 (Environ.lookup_named v env) <> None -> - Some(TransparentMaybeOpacified (Conv_oracle.get_strategy(VarKey v))) - | ConstRef cst -> - let cb = Environ.lookup_constant cst env in - (match cb.const_body with - | Undef _ -> None - | OpaqueDef _ -> Some FullyOpaque - | Def _ -> Some - (TransparentMaybeOpacified (Conv_oracle.get_strategy(ConstKey cst)))) - | _ -> None - -let print_opacity ref = - match opacity (Global.env()) ref with - | None -> [] - | Some s -> - [pr_global ref ++ str " is " ++ - str (match s with - | FullyOpaque -> "opaque" - | TransparentMaybeOpacified Conv_oracle.Opaque -> - "basically transparent but considered opaque for reduction" - | TransparentMaybeOpacified lev when lev = Conv_oracle.transparent -> - "transparent" - | TransparentMaybeOpacified (Conv_oracle.Level n) -> - "transparent (with expansion weight "^string_of_int n^")" - | TransparentMaybeOpacified Conv_oracle.Expand -> - "transparent (with minimal expansion weight)")] - -(*******************) -(* *) - -let print_name_infos ref = - let impls = implicits_of_global ref in - let scopes = Notation.find_arguments_scope ref in - let renames = - try List.hd (Arguments_renaming.arguments_names ref) with Not_found -> [] in - let type_info_for_implicit = - if need_expansion (select_impargs_size 0 impls) ref then - (* Need to reduce since implicits are computed with products flattened *) - [str "Expanded type for implicit arguments"; - print_ref true ref; blankline] - else - [] in - type_info_for_implicit @ - print_renames_list (mt()) renames @ - print_impargs_list (mt()) impls @ - print_argument_scopes (mt()) scopes - -let print_id_args_data test pr id l = - if List.exists test l then - pr (str "For " ++ pr_id id) l - else - [] - -let print_args_data_of_inductive_ids get test pr sp mipv = - List.flatten (Array.to_list (Array.mapi - (fun i mip -> - print_id_args_data test pr mip.mind_typename (get (IndRef (sp,i))) @ - List.flatten (Array.to_list (Array.mapi - (fun j idc -> - print_id_args_data test pr idc (get (ConstructRef ((sp,i),j+1)))) - mip.mind_consnames))) - mipv)) - -let print_inductive_implicit_args = - print_args_data_of_inductive_ids - implicits_of_global (fun l -> positions_of_implicits l <> []) - print_impargs_list - -let print_inductive_renames = - print_args_data_of_inductive_ids - (fun r -> - try List.hd (Arguments_renaming.arguments_names r) - with e when Errors.noncritical e -> []) - ((<>) Anonymous) - print_renames_list - -let print_inductive_argument_scopes = - print_args_data_of_inductive_ids - Notation.find_arguments_scope ((<>) None) print_argument_scopes - -(*********************) -(* "Locate" commands *) - -type logical_name = - | Term of global_reference - | Dir of global_dir_reference - | Syntactic of kernel_name - | ModuleType of qualid * module_path - | Undefined of qualid - -let locate_any_name ref = - let module N = Nametab in - let (loc,qid) = qualid_of_reference ref in - try Term (N.locate qid) - with Not_found -> - try Syntactic (N.locate_syndef qid) - with Not_found -> - try Dir (N.locate_dir qid) - with Not_found -> - try ModuleType (qid, N.locate_modtype qid) - with Not_found -> Undefined qid - -let pr_located_qualid = function - | Term ref -> - let ref_str = match ref with - ConstRef _ -> "Constant" - | IndRef _ -> "Inductive" - | ConstructRef _ -> "Constructor" - | VarRef _ -> "Variable" in - str ref_str ++ spc () ++ pr_path (Nametab.path_of_global ref) - | Syntactic kn -> - str "Notation" ++ spc () ++ pr_path (Nametab.path_of_syndef kn) - | Dir dir -> - let s,dir = match dir with - | DirOpenModule (dir,_) -> "Open Module", dir - | DirOpenModtype (dir,_) -> "Open Module Type", dir - | DirOpenSection (dir,_) -> "Open Section", dir - | DirModule (dir,_) -> "Module", dir - | DirClosedSection dir -> "Closed Section", dir - in - str s ++ spc () ++ pr_dirpath dir - | ModuleType (qid,_) -> - str "Module Type" ++ spc () ++ pr_path (Nametab.full_name_modtype qid) - | Undefined qid -> - pr_qualid qid ++ spc () ++ str "not a defined object." - -let print_located_qualid ref = - let (loc,qid) = qualid_of_reference ref in - let module N = Nametab in - let expand = function - | TrueGlobal ref -> - Term ref, N.shortest_qualid_of_global Idset.empty ref - | SynDef kn -> - Syntactic kn, N.shortest_qualid_of_syndef Idset.empty kn in - match List.map expand (N.locate_extended_all qid) with - | [] -> - let (dir,id) = repr_qualid qid in - if dir = empty_dirpath then - str "No object of basename " ++ pr_id id - else - str "No object of suffix " ++ pr_qualid qid - | l -> - prlist_with_sep fnl - (fun (o,oqid) -> - hov 2 (pr_located_qualid o ++ - (if oqid <> qid then - spc() ++ str "(shorter name to refer to it in current context is " ++ pr_qualid oqid ++ str")" - else - mt ()))) l - -(******************************************) -(**** Printing declarations and judgments *) -(**** Gallina layer *****) - -let gallina_print_typed_value_in_env env (trm,typ) = - (pr_lconstr_env env trm ++ fnl () ++ - str " : " ++ pr_ltype_env env typ ++ fnl ()) - -(* To be improved; the type should be used to provide the types in the - abstractions. This should be done recursively inside pr_lconstr, so that - the pretty-print of a proposition (P:(nat->nat)->Prop)(P [u]u) - synthesizes the type nat of the abstraction on u *) - -let print_named_def name body typ = - let pbody = pr_lconstr body in - let ptyp = pr_ltype typ in - let pbody = if isCast body then surround pbody else pbody in - (str "*** [" ++ str name ++ str " " ++ - hov 0 (str ":=" ++ brk (1,2) ++ pbody ++ spc () ++ - str ":" ++ brk (1,2) ++ ptyp) ++ - str "]") - -let print_named_assum name typ = - str "*** [" ++ str name ++ str " : " ++ pr_ltype typ ++ str "]" - -let gallina_print_named_decl (id,c,typ) = - let s = string_of_id id in - match c with - | Some body -> print_named_def s body typ - | None -> print_named_assum s typ - -let assumptions_for_print lna = - List.fold_right (fun na env -> add_name na env) lna empty_names_context - -(*********************) -(* *) - -let gallina_print_inductive sp = - let env = Global.env() in - let mib = Environ.lookup_mind sp env in - let mipv = mib.mind_packets in - pr_mutual_inductive_body env sp mib ++ fnl () ++ - with_line_skip - (print_inductive_renames sp mipv @ - print_inductive_implicit_args sp mipv @ - print_inductive_argument_scopes sp mipv) - -let print_named_decl id = - gallina_print_named_decl (Global.lookup_named id) ++ fnl () - -let gallina_print_section_variable id = - print_named_decl id ++ - with_line_skip (print_name_infos (VarRef id)) - -let print_body = function - | Some lc -> pr_lconstr (Declarations.force lc) - | None -> (str"") - -let print_typed_body (val_0,typ) = - (print_body val_0 ++ fnl () ++ str " : " ++ pr_ltype typ) - -let ungeneralized_type_of_constant_type = function - | PolymorphicArity (ctx,a) -> mkArity (ctx, Type a.poly_level) - | NonPolymorphicType t -> t - -let print_constant with_values sep sp = - let cb = Global.lookup_constant sp in - let val_0 = body_of_constant cb in - let typ = ungeneralized_type_of_constant_type cb.const_type in - hov 0 ( - match val_0 with - | None -> - str"*** [ " ++ - print_basename sp ++ str " : " ++ cut () ++ pr_ltype typ ++ - str" ]" - | _ -> - print_basename sp ++ str sep ++ cut () ++ - (if with_values then print_typed_body (val_0,typ) else pr_ltype typ)) - ++ fnl () - -let gallina_print_constant_with_infos sp = - print_constant true " = " sp ++ - with_line_skip (print_name_infos (ConstRef sp)) - -let gallina_print_syntactic_def kn = - let qid = Nametab.shortest_qualid_of_syndef Idset.empty kn - and (vars,a) = Syntax_def.search_syntactic_definition kn in - let c = Topconstr.glob_constr_of_aconstr dummy_loc a in - hov 2 - (hov 4 - (str "Notation " ++ pr_qualid qid ++ - prlist (fun id -> spc () ++ pr_id id) (List.map fst vars) ++ - spc () ++ str ":=") ++ - spc () ++ Constrextern.without_symbols pr_glob_constr c) ++ fnl () - -let gallina_print_leaf_entry with_values ((sp,kn as oname),lobj) = - let sep = if with_values then " = " else " : " - and tag = object_tag lobj in - match (oname,tag) with - | (_,"VARIABLE") -> - (* Outside sections, VARIABLES still exist but only with universes - constraints *) - (try Some(print_named_decl (basename sp)) with Not_found -> None) - | (_,"CONSTANT") -> - Some (print_constant with_values sep (constant_of_kn kn)) - | (_,"INDUCTIVE") -> - Some (gallina_print_inductive (mind_of_kn kn)) - | (_,"MODULE") -> - let (mp,_,l) = repr_kn kn in - Some (print_module with_values (MPdot (mp,l))) - | (_,"MODULE TYPE") -> - let (mp,_,l) = repr_kn kn in - Some (print_modtype (MPdot (mp,l))) - | (_,("AUTOHINT"|"GRAMMAR"|"SYNTAXCONSTANT"|"PPSYNTAX"|"TOKEN"|"CLASS"| - "COERCION"|"REQUIRE"|"END-SECTION"|"STRUCTURE")) -> None - (* To deal with forgotten cases... *) - | (_,s) -> None - -let gallina_print_library_entry with_values ent = - let pr_name (sp,_) = pr_id (basename sp) in - match ent with - | (oname,Lib.Leaf lobj) -> - gallina_print_leaf_entry with_values (oname,lobj) - | (oname,Lib.OpenedSection (dir,_)) -> - Some (str " >>>>>>> Section " ++ pr_name oname) - | (oname,Lib.ClosedSection _) -> - Some (str " >>>>>>> Closed Section " ++ pr_name oname) - | (_,Lib.CompilingLibrary (dir,_)) -> - Some (str " >>>>>>> Library " ++ pr_dirpath dir) - | (oname,Lib.OpenedModule _) -> - Some (str " >>>>>>> Module " ++ pr_name oname) - | (oname,Lib.ClosedModule _) -> - Some (str " >>>>>>> Closed Module " ++ pr_name oname) - | (_,Lib.FrozenState _) -> - None - -let gallina_print_context with_values = - let rec prec n = function - | h::rest when n = None or Option.get n > 0 -> - (match gallina_print_library_entry with_values h with - | None -> prec n rest - | Some pp -> prec (Option.map ((+) (-1)) n) rest ++ pp ++ fnl ()) - | _ -> mt () - in - prec - -let gallina_print_eval red_fun env evmap _ {uj_val=trm;uj_type=typ} = - let ntrm = red_fun env evmap trm in - (str " = " ++ gallina_print_typed_value_in_env env (ntrm,typ)) - -(******************************************) -(**** Printing abstraction layer *) - -let default_object_pr = { - print_inductive = gallina_print_inductive; - print_constant_with_infos = gallina_print_constant_with_infos; - print_section_variable = gallina_print_section_variable; - print_syntactic_def = gallina_print_syntactic_def; - print_module = gallina_print_module; - print_modtype = gallina_print_modtype; - print_named_decl = gallina_print_named_decl; - print_library_entry = gallina_print_library_entry; - print_context = gallina_print_context; - print_typed_value_in_env = gallina_print_typed_value_in_env; - print_eval = gallina_print_eval; -} - -let object_pr = ref default_object_pr -let set_object_pr = (:=) object_pr - -let print_inductive x = !object_pr.print_inductive x -let print_constant_with_infos c = !object_pr.print_constant_with_infos c -let print_section_variable c = !object_pr.print_section_variable c -let print_syntactic_def x = !object_pr.print_syntactic_def x -let print_module x = !object_pr.print_module x -let print_modtype x = !object_pr.print_modtype x -let print_named_decl x = !object_pr.print_named_decl x -let print_library_entry x = !object_pr.print_library_entry x -let print_context x = !object_pr.print_context x -let print_typed_value_in_env x = !object_pr.print_typed_value_in_env x -let print_eval x = !object_pr.print_eval x - -(******************************************) -(**** Printing declarations and judgments *) -(**** Abstract layer *****) - -let print_typed_value x = print_typed_value_in_env (Global.env ()) x - -let print_judgment env {uj_val=trm;uj_type=typ} = - print_typed_value_in_env env (trm, typ) - -let print_safe_judgment env j = - let trm = Safe_typing.j_val j in - let typ = Safe_typing.j_type j in - print_typed_value_in_env env (trm, typ) - -(*********************) -(* *) - -let print_full_context () = - print_context true None (Lib.contents_after None) - -let print_full_context_typ () = - print_context false None (Lib.contents_after None) - -let print_full_pure_context () = - let rec prec = function - | ((_,kn),Lib.Leaf lobj)::rest -> - let pp = match object_tag lobj with - | "CONSTANT" -> - let con = Global.constant_of_delta_kn kn in - let cb = Global.lookup_constant con in - let typ = ungeneralized_type_of_constant_type cb.const_type in - hov 0 ( - match cb.const_body with - | Undef _ -> - str "Parameter " ++ - print_basename con ++ str " : " ++ cut () ++ pr_ltype typ - | OpaqueDef lc -> - str "Theorem " ++ print_basename con ++ cut () ++ - str " : " ++ pr_ltype typ ++ str "." ++ fnl () ++ - str "Proof " ++ pr_lconstr (Declarations.force_opaque lc) - | Def c -> - str "Definition " ++ print_basename con ++ cut () ++ - str " : " ++ pr_ltype typ ++ cut () ++ str " := " ++ - pr_lconstr (Declarations.force c)) - ++ str "." ++ fnl () ++ fnl () - | "INDUCTIVE" -> - let mind = Global.mind_of_delta_kn kn in - let mib = Global.lookup_mind mind in - pr_mutual_inductive_body (Global.env()) mind mib ++ - str "." ++ fnl () ++ fnl () - | "MODULE" -> - (* TODO: make it reparsable *) - let (mp,_,l) = repr_kn kn in - print_module true (MPdot (mp,l)) ++ str "." ++ fnl () ++ fnl () - | "MODULE TYPE" -> - (* TODO: make it reparsable *) - (* TODO: make it reparsable *) - let (mp,_,l) = repr_kn kn in - print_modtype (MPdot (mp,l)) ++ str "." ++ fnl () ++ fnl () - | _ -> mt () in - prec rest ++ pp - | _::rest -> prec rest - | _ -> mt () in - prec (Lib.contents_after None) - -(* For printing an inductive definition with - its constructors and elimination, - assume that the declaration of constructors and eliminations - follows the definition of the inductive type *) - -(* This is designed to print the contents of an opened section *) -let read_sec_context r = - let loc,qid = qualid_of_reference r in - let dir = - try Nametab.locate_section qid - with Not_found -> - user_err_loc (loc,"read_sec_context", str "Unknown section.") in - let rec get_cxt in_cxt = function - | (_,Lib.OpenedSection ((dir',_),_) as hd)::rest -> - if dir = dir' then (hd::in_cxt) else get_cxt (hd::in_cxt) rest - | (_,Lib.ClosedSection _)::rest -> - error "Cannot print the contents of a closed section." - (* LEM: Actually, we could if we wanted to. *) - | [] -> [] - | hd::rest -> get_cxt (hd::in_cxt) rest - in - let cxt = (Lib.contents_after None) in - List.rev (get_cxt [] cxt) - -let print_sec_context sec = - print_context true None (read_sec_context sec) - -let print_sec_context_typ sec = - print_context false None (read_sec_context sec) - -let print_any_name = function - | Term (ConstRef sp) -> print_constant_with_infos sp - | Term (IndRef (sp,_)) -> print_inductive sp - | Term (ConstructRef ((sp,_),_)) -> print_inductive sp - | Term (VarRef sp) -> print_section_variable sp - | Syntactic kn -> print_syntactic_def kn - | Dir (DirModule(dirpath,(mp,_))) -> print_module (printable_body dirpath) mp - | Dir _ -> mt () - | ModuleType (_,kn) -> print_modtype kn - | Undefined qid -> - try (* Var locale de but, pas var de section... donc pas d'implicits *) - let dir,str = repr_qualid qid in - if (repr_dirpath dir) <> [] then raise Not_found; - let (_,c,typ) = Global.lookup_named str in - (print_named_decl (str,c,typ)) - with Not_found -> - errorlabstrm - "print_name" (pr_qualid qid ++ spc () ++ str "not a defined object.") - -let print_name = function - | Genarg.ByNotation (loc,ntn,sc) -> - print_any_name - (Term (Notation.interp_notation_as_global_reference loc (fun _ -> true) - ntn sc)) - | Genarg.AN ref -> - print_any_name (locate_any_name ref) - -let print_opaque_name qid = - let env = Global.env () in - match global qid with - | ConstRef cst -> - let cb = Global.lookup_constant cst in - if constant_has_body cb then - print_constant_with_infos cst - else - error "Not a defined constant." - | IndRef (sp,_) -> - print_inductive sp - | ConstructRef cstr -> - let ty = Inductiveops.type_of_constructor env cstr in - print_typed_value (mkConstruct cstr, ty) - | VarRef id -> - let (_,c,ty) = lookup_named id env in - print_named_decl (id,c,ty) - -let print_about_any loc k = - match k with - | Term ref -> - Dumpglob.add_glob loc ref; - pr_infos_list - (print_ref false ref :: blankline :: - print_name_infos ref @ - print_simpl_behaviour ref @ - print_opacity ref @ - [hov 0 (str "Expands to: " ++ pr_located_qualid k)]) - | Syntactic kn -> - let () = match Syntax_def.search_syntactic_definition kn with - | [],Topconstr.ARef ref -> Dumpglob.add_glob loc ref - | _ -> () in - v 0 ( - print_syntactic_def kn ++ - hov 0 (str "Expands to: " ++ pr_located_qualid k)) ++ fnl() - | Dir _ | ModuleType _ | Undefined _ -> - hov 0 (pr_located_qualid k) ++ fnl() - -let print_about = function - | Genarg.ByNotation (loc,ntn,sc) -> - print_about_any loc - (Term (Notation.interp_notation_as_global_reference loc (fun _ -> true) - ntn sc)) - | Genarg.AN ref -> - print_about_any (loc_of_reference ref) (locate_any_name ref) - -(* for debug *) -let inspect depth = - print_context false (Some depth) (Lib.contents_after None) - - -(*************************************************************************) -(* Pretty-printing functions coming from classops.ml *) - -open Classops - -let print_coercion_value v = pr_lconstr (get_coercion_value v) - -let print_class i = - let cl,_ = class_info_from_index i in - pr_class cl - -let print_path ((i,j),p) = - hov 2 ( - str"[" ++ hov 0 (prlist_with_sep pr_semicolon print_coercion_value p) ++ - str"] : ") ++ - print_class i ++ str" >-> " ++ print_class j - -let _ = Classops.install_path_printer print_path - -let print_graph () = - prlist_with_sep pr_fnl print_path (inheritance_graph()) - -let print_classes () = - prlist_with_sep pr_spc pr_class (classes()) - -let print_coercions () = - prlist_with_sep pr_spc print_coercion_value (coercions()) - -let index_of_class cl = - try - fst (class_info cl) - with e when Errors.noncritical e -> - errorlabstrm "index_of_class" - (pr_class cl ++ spc() ++ str "not a defined class.") - -let print_path_between cls clt = - let i = index_of_class cls in - let j = index_of_class clt in - let p = - try - lookup_path_between_class (i,j) - with e when Errors.noncritical e -> - errorlabstrm "index_cl_of_id" - (str"No path between " ++ pr_class cls ++ str" and " ++ pr_class clt - ++ str ".") - in - print_path ((i,j),p) - -let print_canonical_projections () = - prlist_with_sep pr_fnl - (fun ((r1,r2),o) -> pr_cs_pattern r2 ++ - str " <- " ++ - pr_global r1 ++ str " ( " ++ pr_lconstr o.o_DEF ++ str " )") - (canonical_projections ()) - -(*************************************************************************) - -(*************************************************************************) -(* Pretty-printing functions for type classes *) - -open Typeclasses - -let pr_typeclass env t = - print_ref false t.cl_impl ++ fnl () - -let print_typeclasses () = - let env = Global.env () in - prlist_with_sep fnl (pr_typeclass env) (typeclasses ()) - -let pr_instance env i = - (* gallina_print_constant_with_infos i.is_impl *) - (* lighter *) - print_ref false (instance_impl i) ++ fnl () - -let print_all_instances () = - let env = Global.env () in - let inst = all_instances () in - prlist_with_sep fnl (pr_instance env) inst - -let print_instances r = - let env = Global.env () in - let inst = instances r in - prlist_with_sep fnl (pr_instance env) inst - -- cgit v1.2.3