123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157(************************************************************************)(* * The Coq Proof Assistant / The Coq Development Team *)(* v * Copyright INRIA, CNRS and contributors *)(* <O___,, * (see version control and CREDITS file for authors & dates) *)(* \VV/ **************************************************************)(* // * This file is distributed under the terms of the *)(* * GNU Lesser General Public License Version 2.1 *)(* * (see LICENSE file for the text of the license) *)(************************************************************************)openPpopenGenargopenGeninterp(* We register printers at two levels:
- generic arguments for general printers
- generic values for printing ltac values *)(* Printing generic values *)type'awith_level={default_already_surrounded:Constrexpr.entry_relative_level;default_ensure_surrounded:Constrexpr.entry_relative_level;printer:'a}typeprinter_result=|PrinterBasicof(Environ.env->Evd.evar_map->Pp.t)|PrinterNeedsLevelof(Environ.env->Evd.evar_map->Constrexpr.entry_relative_level->Pp.t)with_leveltypeprinter_fun_with_level=Environ.env->Evd.evar_map->Constrexpr.entry_relative_level->Pp.ttypetop_printer_result=|TopPrinterBasicof(unit->Pp.t)|TopPrinterNeedsContextof(Environ.env->Evd.evar_map->Pp.t)|TopPrinterNeedsContextAndLevelofprinter_fun_with_levelwith_leveltype'aprinter='a->printer_resulttype'atop_printer='a->top_printer_resultmoduleValMap=ValTMap(structtype'at='a->top_printer_resultend)letprint0_val_map=refValMap.emptyletfind_print_val_funtagv=matchValMap.findtag!print0_val_mapwith|f->fv|exceptionNot_found->(* opening Pp shadows "tag" *)letthe_tag=taginTopPrinterBasicPp.(fun()->str"<no printer for "++str(Val.reprthe_tag)++str">")letgeneric_val_printv=letVal.Dyn(tag,v)=vinfind_print_val_funtagvletregister_val_print0spr=print0_val_map:=ValMap.addspr!print0_val_mapletcombine_dont_needspr_pairpr1=function|TopPrinterBasicpr2->TopPrinterBasic(fun()->pr_pair(pr1())(pr2()))|TopPrinterNeedsContextpr2->TopPrinterNeedsContext(funenvsigma->pr_pair(pr1())(pr2envsigma))|TopPrinterNeedsContextAndLevel{default_ensure_surrounded;printer}->TopPrinterNeedsContext(funenvsigma->pr_pair(pr1())(printerenvsigmadefault_ensure_surrounded))letcombine_needspr_pairpr1=function|TopPrinterBasicpr2->TopPrinterNeedsContext(funenvsigma->pr_pair(pr1envsigma)(pr2()))|TopPrinterNeedsContextpr2->TopPrinterNeedsContext(funenvsigma->pr_pair(pr1envsigma)(pr2envsigma))|TopPrinterNeedsContextAndLevel{default_ensure_surrounded;printer}->TopPrinterNeedsContext(funenvsigma->pr_pair(pr1envsigma)(printerenvsigmadefault_ensure_surrounded))letcombinepr_pairpr1v2=matchpr1with|TopPrinterBasicpr1->combine_dont_needspr_pairpr1(generic_val_printv2)|TopPrinterNeedsContextpr1->combine_needspr_pairpr1(generic_val_printv2)|TopPrinterNeedsContextAndLevel{default_ensure_surrounded;printer}->combine_needspr_pair(funenvsigma->printerenvsigmadefault_ensure_surrounded)(generic_val_printv2)let_=letpr_consab=Pp.(a++spc()++b)inregister_val_print0Val.typ_list(function|[]->TopPrinterBasicmt|a::l->List.fold_left(combinepr_cons)(generic_val_printa)l)let_=register_val_print0Val.typ_opt(function|None->TopPrinterBasicPp.mt|Somev->generic_val_printv)let_=letpr_pairab=Pp.(a++spc()++b)inregister_val_print0Val.typ_pair(fun(v1,v2)->combinepr_pair(generic_val_printv1)v2)(* Printing generic arguments *)type('raw,'glb,'top)genprinter={raw:'raw->printer_result;glb:'glb->printer_result;top:'top->top_printer_result;}modulePrintObj=structtype('raw,'glb,'top)obj=('raw,'glb,'top)genprinterletname="printer"letdefaultwit=matchwitwith|ExtraArgtag->letname=tryArgT.reprtagwithAssert_failure_when!Flags.in_debugger->"UNKNOWN"inletprinter={raw=(fun_->PrinterBasic(funenvsigma->str"<genarg:"++strname++str">"));glb=(fun_->PrinterBasic(funenvsigma->str"<genarg:"++strname++str">"));top=(fun_->TopPrinterBasic(fun()->str"<genarg:"++strname++str">"));}inSomeprinter|_->assertfalseendmodulePrint=Register(PrintObj)letregister_print0witrawglbtop=letprinter={raw;glb;top;}inPrint.register0witprinter;matchval_tag(Topwitwit),witwith|Val.Baset,ExtraArgt'whenGeninterp.Val.reprt=ArgT.reprt'->register_val_print0ttop|_->(* An alias, thus no primitive printer attached *)()letregister_vernac_print0witraw=letglb_=CErrors.anomaly(Pp.str"vernac argument needs not globwit printer.")inlettop_=CErrors.anomaly(Pp.str"vernac argument needs not wit printer.")inletprinter={raw;glb;top;}inPrint.register0witprinterletraw_printwitv=(Print.objwit).rawvletglb_printwitv=(Print.objwit).glbvlettop_printwitv=(Print.objwit).topvletgeneric_raw_print(GenArg(Rawwitw,v))=raw_printwvletgeneric_glb_print(GenArg(Glbwitw,v))=glb_printwvletgeneric_top_print(GenArg(Topwitw,v))=top_printwv