123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899openPpxlibletlocation_errorf~locfmt=Format.kasprintf(funerr->raise(Ocaml_common.Location.Error(Ocaml_common.Location.error~locerr)))fmt(** {2 let expression} *)letexpand_let~ctxt(var:[`Varoflabelloc|`Unit])(name:string)body=letloc=Expansion_context.Extension.extension_point_locctxtinAst_builder.Default.(letvar_pat=matchvarwith|`Varv->ppat_var~loc:v.locv|`Unit->ppat_var~loc{loc;txt="_trace_span"}inletvar_exp=matchvarwith|`Varv->pexp_ident~loc:v.loc{txt=lidentv.txt;loc=v.loc}|`Unit->[%expr_trace_span]in[%exprlet[%pvar_pat]=Trace_core.enter_span~__FILE__~__LINE__[%eestring~locname]intryletres=[%ebody]inTrace_core.exit_span[%evar_exp];reswithexn->Trace_core.exit_span[%evar_exp];raiseexn])letextension_let=Extension.V3.declare"trace"Extension.Context.expression(letopen!Ast_patterninsingle_expr_payload(pexp_letnonrecursive(value_binding~pat:(letpat_var=ppat_var__'|>map~f:(funfv->f(`Varv))inletpat_unit=as__@@ppat_construct(lident(string"()"))none|>map~f:(funf_->f`Unit)inaltpat_varpat_unit)~expr:(estring__)^::nil)__))expand_letletrule_let=Ppxlib.Context_free.Rule.extensionextension_let(** {2 Toplevel binding} *)letexpand_top_let~ctxtrec_flag(vbs:_list)=letloc=Expansion_context.Extension.extension_point_locctxtinAst_builder.Default.((* go in functions, and add tracing around the body *)letrecpush_into_fun(e:expression):expression=matche.pexp_descwith|Pexp_fun(lbl,lbl_expr,pat,body)->pexp_fun~loc:e.pexp_loclbllbl_exprpat@@push_into_funbody|_->[%exprlet_trace_span=Trace_core.enter_span~__FILE__~__LINE____FUNCTION__inmatch[%ee]with|res->Trace_core.exit_span_trace_span;res|exceptionexn->letbt=Printexc.get_raw_backtrace()inTrace_core.exit_span_trace_span;Printexc.raise_with_backtraceexnbt]inlettr_vb(vb:value_binding):value_binding=letexpr=push_into_funvb.pvb_exprin{vbwithpvb_expr=expr}inletvbs=List.maptr_vbvbsinpstr_value~locrec_flagvbs)letextension_top_let=Extension.V3.declare"trace"Extension.Context.structure_item(letopen!Ast_patterninpstr(pstr_value____^::nil))expand_top_letletrule_top_let=Ppxlib.Context_free.Rule.extensionextension_top_letlet()=Driver.register_transformation~rules:[rule_let;rule_top_let]"ppx_trace"