123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413openPpxlibletattr_nobuiltin:(core_type,unit->unit)Ppxlib.Attribute.t=Ppxlib.Attribute.declare"deriving.show.nobuiltin"Core_type(Ppxlib.Ast_pattern.(pstrnil))Fun.idletattr_opaque:(core_type,unit->unit)Ppxlib.Attribute.t=Ppxlib.Attribute.declare"deriving.show.opaque"Core_type(Ppxlib.Ast_pattern.(pstrnil))Fun.idletattr_printer:(core_type,expression)Ppxlib.Attribute.t=Ppxlib.Attribute.declare"deriving.show.printer"Core_type(Ppxlib.Ast_pattern.(single_expr_payload__))Fun.idletattr_polyprinter:(core_type,expression)Ppxlib.Attribute.t=Ppxlib.Attribute.declare"deriving.show.polyprinter"Core_type(Ppxlib.Ast_pattern.(single_expr_payload__))Fun.idletpp_open_boxi:expression=letloc=!Ast_helper.default_locin[%exprPpx_show_runtime.Format.pp_open_boxfmt[%e(Ast_helper.Exp.constant(Ast_helper.Const.inti))]]letpp_close_box():expression=letloc=!Ast_helper.default_locin[%exprPpx_show_runtime.Format.pp_close_boxfmt()]letpp_print_space():expression=letloc=!Ast_helper.default_locin[%exprPpx_show_runtime.Format.pp_print_spacefmt()]letpp_print_string_expressione:expression=letloc=!Ast_helper.default_locin[%exprPpx_show_runtime.Format.pp_print_stringfmt[%ee]]letpp_print_strings=pp_print_string_expression(Ast_helper.Exp.constant(Ast_helper.Const.strings))letpp_list_of_record~path(fields:(string*expressionlist)list):expressionlist=List.flatten[[pp_open_box2;pp_print_string"{ "];List.flattenbeginTools.separate[pp_print_string";";pp_print_space()]beginfields|>List.mapbeginfun(name,value)->letname=Tools.expand_path~pathnameinpp_open_box0::pp_print_string(name^" =")::pp_print_space()::value@[pp_close_box()]endendend;[pp_print_space();pp_print_string"}";pp_close_box()]]letpp_list_of_tuple(values:expressionlistlist):expressionlist=List.flatten[[pp_open_box1;pp_print_string"("];List.flattenbeginTools.separate[pp_print_string",";pp_print_space()]beginvalues|>List.mapbeginfunvalue->pp_open_box0::value@[pp_close_box()]endendend;[pp_print_string")";pp_close_box()]]letbinders_of_printersprinters=printers|>List.mapibeginfuniprinter->letbinder="x"^string_of_intiinTools.pat_var_of_stringbinder,printer(Tools.ident_of_stringbinder)end|>List.splittypeconstructor_arguments=|No_argument|Singletonof(expression->expressionlist)|Tupleof(expression->expressionlist)listtypekind=|Construct|Variantletpp_cases_of_cases?(path=[])kindcases=cases|>List.mapbeginfun(constr,arguments)->letpat,constr=matchkindwith|Construct->letloc=!Ast_helper.default_locinAst_helper.Pat.construct{loc;txt=Lidentconstr},Tools.expand_path~pathconstr|Variant->Ast_helper.Pat.variantconstr,"`"^constrinletarguments,printers=matchargumentswith|No_argument->None,[pp_print_stringconstr]|Singletonprinter->letbinder="x"inSome(Tools.pat_var_of_stringbinder),beginpp_open_box1::pp_print_string(constr^" (")::printer(Tools.ident_of_stringbinder)@[pp_print_string")";pp_close_box()]end|Tupleprinters->letbinders,printers=binders_of_printersprintersinSome(Ast_helper.Pat.tuplebinders),beginpp_open_box0::pp_print_stringconstr::pp_print_space()::pp_list_of_tupleprinters@[pp_close_box()]endinAst_helper.Exp.case(patarguments)(Tools.seqprinters)endletrecpp_list_of_type(ty:core_type)(value:expression):expressionlist=letloc=ty.ptyp_locinmatchPpxlib.Attribute.getattr_printertywith|Someprinter->[Ast_helper.Exp.applyprinter[Nolabel,[%exprfmt];Nolabel,value]]|None->ifPpxlib.Attribute.getattr_opaquety=Nonethenmatchtywith|{ptyp_desc=Ptyp_any;_}->[pp_print_string"_"]|{ptyp_desc=Ptyp_arrow_;_}->[pp_print_string"<fun>"]|{ptyp_desc=Ptyp_tupletypes;_}->letbinders,printers=binders_of_printers(types|>List.mappp_list_of_type)in[Ast_helper.Exp.let_Nonrecursive[Ast_helper.Vb.mk(Ast_helper.Pat.tuplebinders)value](Tools.seq(pp_list_of_tupleprinters))]|{ptyp_desc=Ptyp_variant(fields,_,_);_}->letcases=fields|>List.mapbeginfun(field:row_field)->matchfield.prf_descwith|Rtag(label,true,_)->label.txt,No_argument|Rtag(label,false,ty::_)->label.txt,Singleton(pp_list_of_typety)|_->failwith"Not implemented open tag"endin[Ast_helper.Exp.match_value(pp_cases_of_casesVariantcases)]|{ptyp_desc=Ptyp_varx;_}->[Ast_helper.Exp.apply(Ast_helper.Exp.ident{loc;txt=Lident(Tools.poly_varx)})[Nolabel,[%exprfmt];Nolabel,value]]|{ptyp_desc=Ptyp_constr(constr,arguments);_}->beginmatchifPpxlib.Attribute.getattr_nobuiltinty=Nonethenpp_list_of_builtin_typetyvalueelse[]with|[]->letprinter=matchPpxlib.Attribute.getattr_polyprintertywith|None->Ast_helper.Exp.ident(constr|>Tools.map_loc(Tools.mangle_lid(Prefix"pp")))|Someprinter->printerin[Ast_helper.Exp.applyprinterbeginbeginarguments|>List.mapbeginfunty:(arg_label*expression)->Nolabel,[%exprfunfmtx->[%eTools.seq(pp_list_of_typety[%exprx])]]endend@[Nolabel,[%exprfmt];Nolabel,value]end]|list->listend|_->Location.raise_errorf"ppx_show: Not implemented %a"(Pprintast.core_type)tyelse[pp_print_string"<opaque>"]andpp_list_of_builtin_type(ty:core_type)(value:expression):expressionlist=letloc=ty.ptyp_locinmatchtywith|[%type:unit]->[pp_print_string"()"]|[%type:int]->[[%exprPpx_show_runtime.Format.pp_print_intfmt[%evalue]]]|[%type:int32]->[pp_print_string_expression[%exprPpx_show_runtime.Int32.to_string[%evalue]];pp_print_string"l"]|[%type:int64]->[pp_print_string_expression[%exprPpx_show_runtime.Int64.to_string[%evalue]];pp_print_string"L"]|[%type:nativeint]->[pp_print_string_expression[%exprPpx_show_runtime.Nativeint.to_string[%evalue]];pp_print_string"n"]|[%type:float]->[[%exprPpx_show_runtime.Format.pp_print_floatfmt[%evalue]]]|[%type:bool]->[[%exprPpx_show_runtime.Format.pp_print_boolfmt[%evalue]]]|[%type:char]->[[%exprPpx_show_runtime.Format.pp_print_charfmt[%evalue]]]|[%type:string]->[pp_print_string"\"";pp_print_string_expression[%exprPpx_show_runtime.String.escaped[%evalue]];pp_print_string"\""]|[%type:bytes]->[pp_print_string"\"";pp_print_string_expression[%exprPpx_show_runtime.String.escaped(Ppx_show_runtime.Bytes.to_string[%evalue])];pp_print_string"\""]|[%type:[%t?ty]ref]->pp_open_box1::pp_print_string"ref ("::pp_list_of_typety[%expr![%evalue]]@[pp_print_string")";pp_close_box()]|[%type:[%t?ty]Lazy.t]->[pp_open_box1;pp_print_string"lazy (";[%exprifPpx_show_runtime.Lazy.is_val[%evalue]then[%eTools.seq(pp_list_of_typety[%exprPpx_show_runtime.Lazy.force[%evalue]])]elsePpx_show_runtime.Format.pp_print_stringfmt"<not evaluated>"];pp_print_string")";pp_close_box()]|[%type:[%t?sub]option]->[Ast_helper.Exp.match_(Ast_helper.Exp.constraint_value[%type:_option])beginpp_cases_of_casesConstruct["None",No_argument;"Some",Singleton(funx->pp_list_of_typesubx)]end]|[%type:([%t?ok],[%t?error])result]->[Ast_helper.Exp.match_(Ast_helper.Exp.constraint_value[%type:(_,_)result])beginpp_cases_of_casesConstruct["Ok",Singleton(funx->pp_list_of_typeokx);"Error",Singleton(funx->pp_list_of_typeerrorx)]end]|[%type:[%t?ty]list]->[[%exprPpx_show_runtime.pp_list(funfmtx->[%eTools.seq(pp_list_of_typety[%exprx])])fmt[%evalue]]]|_->[]letpp_list_of_label_declaration_list?(path=[])(labels:label_declarationlist)(value:expression):expressionlist=letfields=labels|>List.mapbeginfun(label:label_declaration)->label.pld_name.txt,pp_list_of_typelabel.pld_type(Ast_helper.Exp.fieldvalue(label.pld_name|>Tools.map_loc(funname:Longident.t->Lidentname)))endinpp_list_of_record~pathfieldsletpp_of_variant~with_path(constrs:constructor_declarationlist)(value:expression):expression=letcases=constrs|>List.mapbeginfun(constr:constructor_declaration)->constr.pcd_name.txt,matchconstr.pcd_argswith|Pcstr_tuple[]->No_argument|Pcstr_tuple[ty]->Singleton(pp_list_of_typety)|Pcstr_tuplelist->Tuple(list|>List.mappp_list_of_type)|Pcstr_recordlabels->Singleton(pp_list_of_label_declaration_listlabels)endinletpath=matchwith_pathwith|None->[]|Somepath->pathinAst_helper.Exp.match_value(pp_cases_of_cases~pathConstructcases)letpp_of_record~with_path(labels:label_declarationlist)(value:expression):expression=letpath=matchwith_pathwith|None->[]|Somepath->pathinTools.seq(pp_list_of_label_declaration_list~pathlabelsvalue)letpp="pp"letshow="show"letfmt_ty(ty:core_type):core_type=letloc=ty.ptyp_locin[%type:Ppx_show_runtime.Format.formatter->[%tty]->unit]lettype_of_type_decl(td:type_declaration):core_type=letloc=td.ptype_locinAst_helper.with_default_loclocbeginfun()->letty=Tools.core_type_of_type_decltdinTools.poly_arrow_of_type_declfmt_tytd(fmt_tyty)endletpp_of_type_decl~with_path(td:type_declaration):value_binding=letwith_path=matchwith_pathwith|None->None|Somepath->Some(Tools.path_of_type_decl~pathtd)inletloc=td.ptype_locinAst_helper.with_default_loclocbeginfun()->letname=Tools.mangle_type_decl(Prefixpp)tdinletprinter:expression=matchtd.ptype_kindwith|Ptype_abstract->beginmatchtd.ptype_manifestwith|None->Location.raise_errorf~loc"show cannot be derived for fully abstract types"|Somety->Tools.seq(pp_list_of_typety[%exprx])end|Ptype_variantconstrs->pp_of_variant~with_pathconstrs[%exprx]|Ptype_recordlabels->pp_of_record~with_pathlabels[%exprx]|Ptype_open->Location.raise_errorf~loc"show cannot be derived for open types"inletprinter:expression=[%exprfunfmtx->[%eprinter]]inletprinter=Tools.poly_fun_of_type_decltdprinterinletconstraint_=Ast_helper.Typ.poly(td.ptype_params|>List.mapbeginfun(ty,_):stringLocation.loc->{loc=ty.ptyp_loc;txt=Tools.var_of_typety}end)(type_of_type_decltd)inAst_helper.Vb.mk~attrs:[Ast_helper.Attr.mk{loc;txt="ocaml.warning"}(PStr[%str"-39"])](Ast_helper.Pat.constraint_(Ast_helper.Pat.varname)constraint_)printerendletshow_of_type_decl(td:type_declaration):value_binding=letloc=td.ptype_locinAst_helper.with_default_loclocbeginfun()->letname=Tools.mangle_type_decl(Prefixshow)tdinletprinter_name=Tools.mangle_type_decl(Prefixpp)tdinletprinter:expression=Tools.poly_apply_of_type_decltd(Tools.ident_of_strprinter_name)inletprinter:expression=[%exprfunx->Ppx_show_runtime.Format.asprintf"@[%a@]"[%eprinter]x]inletprinter=Tools.poly_fun_of_type_decltdprinterinAst_helper.Vb.mk(Ast_helper.Pat.varname)printerendletpp_type_of_type_decl(td:type_declaration):value_description=letloc=td.ptype_locinAst_helper.with_default_loclocbeginfun()->letname=Tools.mangle_type_decl(Prefixpp)tdinAst_helper.Val.mkname(type_of_type_decltd)endletshow_type_of_type_decl(td:type_declaration):value_description=letloc=td.ptype_locinAst_helper.with_default_loclocbeginfun()->letname=Tools.mangle_type_decl(Prefixshow)tdinletty=Tools.core_type_of_type_decltdinletty=Tools.poly_arrow_of_type_declfmt_tytd(Ast_helper.Typ.arrowNolabelty[%type:string])inAst_helper.Val.mknametyendletmake_str~ctxt(rec_flag,tds)(with_path:expressionoption):structure=letwith_path=matchwith_pathwith|Some[%exprfalse]->None|_->letcode_path=Ppxlib.Expansion_context.Deriver.code_pathctxtinletmain_module_name=Ppxlib.Code_path.main_module_namecode_pathinletsubmodule_path=Ppxlib.Code_path.submodule_pathcode_pathinSome(main_module_name::submodule_path)inletvbs=tds|>List.map(pp_of_type_decl~with_path)inletloc=Ppxlib.Expansion_context.Deriver.derived_item_locctxtin[Ast_helper.Str.value~locrec_flagvbs;Ast_helper.Str.value~locNonrecursive(tds|>List.mapshow_of_type_decl)]letstr_type_decl=Ppxlib.Deriving.Generator.V2.makePpxlib.Deriving.Args.(empty+>arg"with_path"__)make_strletmake_sig~loc~path:_(_rec_flag,tds):signature=letvds=tds|>List.mappp_type_of_type_declinletshows=tds|>List.mapshow_type_of_type_declin(vds|>List.map(funvd->Ast_helper.Sig.value~locvd))@(shows|>List.map(funvd->Ast_helper.Sig.value~locvd))letsig_type_decl=Ppxlib.Deriving.Generator.make_noargmake_sigletextension~loc~path:_ty:expression=letbinder="x"in[%exprfunfmtx->[%eTools.seq(pp_list_of_typety(Tools.ident_of_stringbinder))]]letderiver=Ppxlib.Deriving.add"show"~str_type_decl~sig_type_decl~extension