Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file ppx_interact.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188openPpxlibmoduleAst=Ast_builder.Defaulttypestring=labelletret_name="_ret"letget_namep=matchp.ppat_descwithPpat_var{txt=s;_}->[s]|_->[]letbuild_list~locxs=List.fold_right(funct->[%expr[%ec]::[%et]])xs[%expr[]]letbuild_qmodulexs=matchxswith|[]->failwith"invalid empty identifier"|[x]->Lidentx|x::xs->List.fold_left(funtc->Ldot(t,c))(Lidentx)xstypeenv={bindings:(string*stringlist*Longident.t)list;module_context:stringlist;}letempty_env={module_context=[];bindings=[]}(* copied from Ast_traverse *)letvar_names_of=objectinherit[stringlist]Ast_traverse.foldassupermethod!patternpacc=letacc=super#patternpaccinmatchp.ppat_descwithPpat_var{txt;_}->txt::acc|_->accendlettraverse()=objectinherit[env]Ast_traverse.fold_mapassupermethod!value_bindingvbenv=letv,_=super#value_bindingvbenvinletname=get_namev.pvb_patin(v,{envwithbindings=List.map(funn->letident=matchenv.module_contextwith|[]->Lidentn|_->build_qmodule(List.rev(n::env.module_context))in(n,env.module_context,ident))name@env.bindings;})method!structure_itemsenv=matchs.pstr_descwith|Pstr_module{pmb_name={txt=Somename;_};_}->lets,env1=super#structure_items{envwithmodule_context=name::env.module_context}in(* restore the old module context as we exit *)(s,{env1withmodule_context=env.module_context})|Pstr_value(_,_)->(* TODO mutually recursive bindings *)super#structure_itemsenv|_->super#structure_itemsenvmethod!expressioneenv=letopenAst_helperinmatche.pexp_descwith|Pexp_fun(_,_,pat,_)->letvs=var_names_of#patternpat[]in(* update env, and only then recurse into subexpressions *)letenv1=List.fold_right(funct->{twithbindings=(c,env.module_context,Lidentc)::t.bindings;})vsenvinlete,env=super#expressioneenv1in(e,env)|Pexp_extension({txt=s;_},payload)whenString.equals"interact"->letloc=e.pexp_locinletelt(name,original_ctx,ident)=lets=Exp.constant~loc(Const.string~locname)inletid=Exp.ident~loc{txt=(* check at the use site if we're still in that module, if so don't qualify *)(ifenv.module_context!=original_ctxthenidentelseLidentname);loc;}in[%exprV([%es],[%eid])]inletdump_variables=falseinletcount_variables=falseinletdebug=ifdump_variablesthenAst.estring~loc("\n\n"^String.concat", "(env.bindings|>List.rev|>List.map(fun(a,_,_)->a))^"\n\n")else[%expr""]inletvariable_stats=ifcount_variablesthen[%exprFormat.sprintf", with %d variables in scope"[%eExp.constant~loc(Const.int(List.lengthenv.bindings))]]else[%expr""]inlet_status_print=[%exprFormat.printf"At line %d in module %s%s.%s@."__LINE____MODULE__[%evariable_stats][%edebug]]in(* turning this back on requires utop to be added as a runtime dependency *)letutop=falseinletreturn_type=matchpayloadwithPTypt->Somet|_->Noneinletall_bindings=matchreturn_typewith|None->env.bindings|Some_->(ret_name,[],Lidentret_name)::env.bindingsinletelts=List.mapeltall_bindingsinlettoplevel_call=matchutopwith|true->[%exprPpx_interact.UTop_main.interact~unit:__MODULE__~loc:__POS__~values:[%ebuild_list~locelts]()]|false->[%exprPpx_interact_runtime.interact~unit:__MODULE__~loc:__POS__~values:[%ebuild_list~locelts]()]inletshow_source=letfile_name=loc.loc_start.pos_fnameinletline=loc.loc_start.pos_lnumin[%exprPpx_interact_runtime.view_file[%eAst.eint~locline][%eAst.estring~locfile_name]]inletbreakpoint=[%expr(* [%e status_print]; *)[%eshow_source];[%etoplevel_call]]inletbreakpoint_ret=letret_pat=Ast.ppat_var~loc{loc;txt=ret_name}inletret_var=Ast.pexp_ident~loc{loc;txt=Lidentret_name}inletref_typet=Ast.ptyp_constr~loc{loc;txt=Lident"ref"}[t]inmatchreturn_typewith|Somet->[%exprlet([%pret_pat]:[%tref_typet])=ref(Obj.magic())in[%ebreakpoint];![%eret_var]]|None->breakpointin(breakpoint_ret,env)|_->super#expressioneenvendlettransform_implctxtstr=let_file=Expansion_context.Base.code_pathctxt|>Code_path.file_pathinlets,_=(traverse())#structurestrempty_envinslet()=Driver.V2.register_transformation~impl:transform_impl"ppx_interact"