Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file metapp_ppx.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439moduleCounter=structtypet=intrefletmake()=ref0letcountcounter=letresult=!counterincounter:=succresult;resultendletextension_of_index(i:int):Ppxlib.extension=(Metapp_preutils.mkloc"meta",Metapp_preutils.payload_of_inti)letderef(e:Ppxlib.expression):Ppxlib.expression=Metapp_preutils.apply(Metapp_preutils.Exp.var"!")[e]letarray_get(a:Ppxlib.expression)(index:int):Ppxlib.expression=leti=Metapp_preutils.Exp.of_intindexinMetapp_preutils.apply(Metapp_preutils.Exp.ident(Ldot(Lident"Array","get")))[a;i]letarray_set(a:Ppxlib.expression)(index:int)(v:Ppxlib.expression):Ppxlib.expression=leti=Metapp_preutils.Exp.of_intindexinMetapp_preutils.apply(Metapp_preutils.Exp.ident(Ldot(Lident"Array","set")))[a;i;v]letstring_list_of_payload(payload:Ppxlib.payload):stringlist=List.mapMetapp_preutils.string_of_arbitrary_expression(Metapp_preutils.list_of_tuple(Metapp_preutils.Exp.of_payloadpayload))moduleOptions=structincludeDyncompile.Optionslethandle((({txt;_},payload),_):Metapp_preutils.destruct_extension):(t->t)option=matchtxtwith|"metaload"->letadd_object_fileobject_file=Dynlink.loadfileobject_file;letdir_name=Filename.dirnameobject_fileinifdir_name=Filename.current_dir_namethenNoneelseSomedir_nameinSome(add_directories(List.filter_mapadd_object_file(string_list_of_payloadpayload)))|"metapackage"->Some(add_packages(string_list_of_payloadpayload))|"metadir"->Some(add_directories(string_list_of_payloadpayload))|"metaflag"->Some(add_flags(string_list_of_payloadpayload))|"metaplainsource"->Some(set_plainsourcetrue)|"metadebug_findlib"->Some(set_debug_findlibtrue)|"metaverbose"->Some(set_verbosetrue)|_->Noneendtypeinstruction=|ExpressionofPpxlib.expression|DefinitionofPpxlib.structureLocation.locletget_expression(instruction:instruction):Ppxlib.expression=matchinstructionwith|Expressionexpression->expression|Definitiondefinition->Location.raise_errorf~loc:definition.loc"Definitions are only allowed at top-level"modulerecAccuTypes:sigtype'aescape={instructions:instructionlist;quotation:unit->'aMetapp_api.ArrayQuotation.quotation;}type'aquotations='aescapeMetapp_preutils.Accu.treftype'ametapoints=Location.tMetapp_preutils.Accu.trefend=structincludeAccuTypesendandMutableQuotations:Metapp_api.QuotationsWithMakeSwithtype'ax='aAccuQuotation.t=Metapp_api.QuotationsWithMake(AccuQuotation)andAccuQuotation:Metapp_api.UnaryMakeSwithtype'at='aAccuTypes.quotations=structtype'at='aAccuTypes.quotationsletmake()=refMetapp_preutils.Accu.emptyendandMutableMetapoints:Metapp_api.MetapointsWithMakeSwithtype'ax='aAccuMetapoint.t=Metapp_api.MetapointsWithMake(AccuMetapoint)andAccuMetapoint:Metapp_api.UnaryMakeSwithtype'at='aAccuTypes.metapoints=structtype'at='aAccuTypes.metapointsletmake()=refMetapp_preutils.Accu.emptyendmoduletypeMetapointsMapperS=functor(Metapoint:Metapp_api.MetapointS)->sigvalmap:Ppxlib.payload->Metapoint.tendmoduleMetapoint_mapper(Mapper:MetapointsMapperS)=structmoduleMapper'(Metapoint:Metapp_api.MetapointS)=structletmap(super:Metapoint.tMetapp_preutils.map)(m:Metapoint.t):Metapoint.t=Ppxlib.Ast_helper.with_default_loc(Metapoint.to_locm)@@fun()->matchMetapoint.destruct_extensionmwith|Some(({txt="meta";_},payload),_)->letmoduleMap=Mapper(Metapoint)inMap.mappayload|_->supermendclassmap=objectinheritPpxlib.Ast_traverse.mapassupermethod!expression=letmoduleM=Mapper'(Metapp_api.Exp)inM.mapsuper#expressionmethod!pattern=letmoduleM=Mapper'(Metapp_api.Pat)inM.mapsuper#patternmethod!core_type=letmoduleM=Mapper'(Metapp_api.Typ)inM.mapsuper#core_typemethod!class_type=letmoduleM=Mapper'(Metapp_api.Cty)inM.mapsuper#class_typemethod!class_type_field=letmoduleM=Mapper'(Metapp_api.Ctf)inM.mapsuper#class_type_fieldmethod!class_expr=letmoduleM=Mapper'(Metapp_api.Cl)inM.mapsuper#class_exprmethod!class_field=letmoduleM=Mapper'(Metapp_api.Cf)inM.mapsuper#class_fieldmethod!module_type=letmoduleM=Mapper'(Metapp_api.Mty)inM.mapsuper#module_typemethod!module_expr=letmoduleM=Mapper'(Metapp_api.Mod)inM.mapsuper#module_exprmethod!signature_item=letmoduleM=Mapper'(Metapp_api.Sigi)inM.mapsuper#signature_itemmethod!structure_item=letmoduleM=Mapper'(Metapp_api.Stri)inM.mapsuper#structure_itemendendletunmut_metapoints(context:MutableMetapoints.t):Metapp_api.OptionArrayMetapoints.t=letmoduleMap=Metapp_api.MetapointMap(MutableMetapoints)(Metapp_api.OptionArrayMetapoints)(structtype'ax='aAccuMetapoint.ttype'ay='aoptionarrayletmapaccu=Array.make(Metapp_preutils.Accu.length!accu)Noneend)inMap.mapcontextletunmut_loc(context:MutableMetapoints.t):Metapp_api.MetapointsLocation.t=letmoduleMap=Metapp_api.MetapointMap(MutableMetapoints)(Metapp_api.MetapointsLocation)(structtype'ax='aAccuMetapoint.ttype_y=Location.tarrayletmapaccu=Metapp_preutils.Accu.to_array!accuend)inMap.mapcontextletunmut_subquotations(context:MutableQuotations.t):Metapp_api.ArrayQuotations.t=letmoduleMap=Metapp_api.QuotationMap(MutableQuotations)(Metapp_api.ArrayQuotations)(structtype'ax='aAccuQuotation.ttype'ay='aMetapp_api.ArrayQuotation.tletmapaccu=Array.map(funquotation->quotation.AccuTypes.quotation)(Metapp_preutils.Accu.to_array!accu)end)inMap.mapcontextletcontext_var="__context"letfill_var="__fill"letmetapoints_field="metapoints"letloc_field="loc"letsubquotations_field="subquotations"letfield_get(expr:Ppxlib.expression)(field:string):Ppxlib.expression=Ppxlib.Ast_helper.Exp.fieldexpr(Metapp_preutils.mkloc(Longident.Lidentfield))letcontext_get(field:string):Ppxlib.expression=field_get(Metapp_preutils.Exp.varcontext_var)fieldletreplace_metapoints(contents:Metapp_api.OptionArrayMetapoints.t):Ppxlib.Ast_traverse.map=letmoduleMapper(Metapoint:Metapp_api.MetapointS)=structmoduleAccessor=Metapoint.MetapointAccessor(Metapp_api.OptionArrayMetapoints)letmap(payload:Ppxlib.payload):Metapoint.t=Option.get(Accessor.getcontents).(Metapp_preutils.int_of_payloadpayload)endinletmoduleMapper'=Metapoint_mapper(Mapper)innewMapper'.mapletmetapp_api=Longident.Lident"Metapp_api"moduletypeMap=sigclassmap:Ppxlib.Ast_traverse.mapendletrecextract_subquotations(quotations:MutableQuotations.t):Ppxlib.Ast_traverse.map=objectinheritPpxlib.Ast_traverse.mapassupermethod!expression(e:Ppxlib.expression):Ppxlib.expression=Ppxlib.Ast_helper.with_default_loce.pexp_loc@@fun()->matchmatche.pexp_descwith|Pexp_extension({txt;_},payload)->Option.map(funantiquotable->(antiquotable,payload))((matchtxtwith|"e"|"expr"->Some(moduleMetapp_api.Exp)|"p"|"pat"->Some(moduleMetapp_api.Pat)|"t"|"type"->Some(moduleMetapp_api.Typ)|"sig"->Some(moduleMetapp_api.Sig)|"sigi"->Some(moduleMetapp_api.Sigi)|"str"->Some(moduleMetapp_api.Str)|"stri"->Some(moduleMetapp_api.Stri)|_->None):((moduleMetapp_api.QuotationS)option))|_->Nonewith|None->super#expressione|Some(antiquotable,payload)->letmoduleM=(valantiquotable)inletmoduleQuotation=M.QuotationAccessor(MutableQuotations)inletmoduleName=M.QuotationAccessor(Metapp_api.QuotationName)inletquotation=M.of_payloadpayloadinlet(map_module,k)=extract_metapoints()inletmoduleMap=(valmap_module:Map)inletmap=newMap.mapinletquotation=M.mapmapquotationinletescape:'aAccuTypes.escape=k()inletquote()=letquotation'=escape.quotation()inletfill()=letmap=replace_metapointsquotation'.context.metapointsinM.mapmapquotationin{quotation'withfill}inletindex=Metapp_preutils.update(Metapp_preutils.Accu.add{escapewithquotation=quote})(Quotation.getquotations)inletloc=!Ppxlib.Ast_helper.default_locinletfield_name=Name.getMetapp_api.quotation_namein[%exprlet{Metapp_api.ArrayQuotation.context=__context;fill=__fill}=([%efield_get(context_getsubquotations_field)field_name]).([%eMetapp_preutils.Exp.of_intindex])()in[%e(Metapp_preutils.sequence(List.mapget_expressionescape.instructions@[[%expr__fill()]]))]]endandextract_metapoints():(moduleMap)*(unit->unitAccuTypes.escape)=letaccu=ref[]inletmetapoints=MutableMetapoints.make()inletsubquotations=MutableQuotations.make()inletmap_subquotations=extract_subquotationssubquotationsinletmoduleMapper(Metapoint:Metapp_api.MetapointS)=structmoduleAccessor=Metapoint.MetapointAccessor(MutableMetapoints)moduleName=Metapoint.MetapointAccessor(Metapp_api.MetapointName)letmap(payload:Ppxlib.payload):Metapoint.t=lete=Metapp_preutils.Exp.of_payloadpayloadinPpxlib.Ast_helper.with_default_loce.pexp_loc@@fun()->letextracted_expr=map_subquotations#expressioneinletindex=Metapp_preutils.update(Metapp_preutils.Accu.add!Ppxlib.Ast_helper.default_loc)(Accessor.getmetapoints)inletfield=Name.getMetapp_api.metapoint_nameinletmetapoint_field=field_get(context_getmetapoints_field)fieldinletloc=!Ppxlib.Ast_helper.default_locinletextracted_expr:Ppxlib.expression=[%exprSome(Ppxlib.Ast_helper.with_default_loc[%earray_get(field_get(context_getloc_field)field)index](function()->[%eextracted_expr]))]inaccu|>Metapp_preutils.mutate(List.cons(Expression(array_setmetapoint_fieldindexextracted_expr)));Metapoint.extension(extension_of_indexindex)endinletmoduleMeta_map=Metapoint_mapper(Mapper)inletmoduleMetadef(Item:Metapp_preutils.ItemS)=structletmap(super:Item.tMetapp_preutils.map)(item:Item.t):Item.t=Ppxlib.Ast_helper.with_default_loc(Item.to_locitem)@@fun()->matchItem.destruct_extensionitemwith|Some(({txt="metadef";_},payload),_)->letdefs=map_subquotations#structure(Metapp_preutils.Str.of_payloadpayload)inaccu|>Metapp_preutils.mutate(List.cons(Definition(Metapp_preutils.mklocdefs)));Item.of_list[]|_->superitemendinletmoduleMap=structclassmap=objectinheritMeta_map.mapassupermethod!structure_item=letmoduleM=Metadef(Metapp_preutils.Stri)inM.mapsuper#structure_itemmethod!signature_item=letmoduleM=Metadef(Metapp_preutils.Sigi)inM.mapsuper#signature_itemendendinletk():unitAccuTypes.escape={instructions=List.rev!accu;quotation=fun()->{fill=(fun()->());context={metapoints=unmut_metapointsmetapoints;loc=unmut_locmetapoints;subquotations=unmut_subquotationssubquotations;}}}in((moduleMap),k)lettransform(root_mapper:Ppxlib.structureMetapp_preutils.map)(get_mapper:#Ppxlib.Ast_traverse.map->'aMetapp_preutils.map)(s:'a):'a=let(meta_map_module,k)=extract_metapoints()inletmoduleMeta_map=(valmeta_map_module)inletaccu_options=ref{Options.emptywithpackages=["ppxlib"]}inletmoduleMetaopt(Item:Metapp_preutils.ItemS)=structletmap(super:Item.tMetapp_preutils.map)(item:Item.t):Item.t=Ppxlib.Ast_helper.with_default_loc(Item.to_locitem)@@fun()->matchOption.bind(Item.destruct_extensionitem)Options.handlewith|None->superitem|Someoption->accu_options|>Metapp_preutils.mutateoption;Item.of_list[]endinletmap=objectinheritMeta_map.mapassupermethod!structure_item=letmoduleM=Metaopt(Metapp_preutils.Stri)inM.mapsuper#structure_itemmethod!signature_item=letmoduleM=Metaopt(Metapp_preutils.Sigi)inM.mapsuper#signature_itemendinlets=get_mappermapsinmatchk()with|{instructions=[];_}->s|{instructions;quotation}->matchquotation()with{context;_}->letinitial_parsetree=[Ppxlib.Ast_helper.Str.valueNonrecursive[Ppxlib.Ast_helper.Vb.mk(Metapp_preutils.Pat.varcontext_var)(Ppxlib.Ast_helper.Exp.match_(deref(Metapp_preutils.Exp.ident(Ldot(metapp_api,"top_context"))))[Ppxlib.Ast_helper.Exp.case(Metapp_preutils.Pat.none())(Ppxlib.Ast_helper.Exp.assert_(Metapp_preutils.Exp.of_boolfalse));Ppxlib.Ast_helper.Exp.case(Metapp_preutils.Pat.some(Metapp_preutils.Pat.varcontext_var))(Metapp_preutils.Exp.varcontext_var)])]]inletmake_instruction(accu:Ppxlib.structure)(instruction:instruction):Ppxlib.structure=matchinstructionwith|Expressionexpr->letitem=Ppxlib.Ast_helper.Str.valueNonrecursive[Ppxlib.Ast_helper.Vb.mk(Metapp_preutils.Pat.of_unit())expr]initem::accu|Definitiondefinition->List.rev_appenddefinition.txtaccuinletaccu=List.fold_leftmake_instructioninitial_parsetreeinstructionsinletparsetree=root_mapper(List.revaccu)inMetapp_api.top_context:=Somecontext;letoptions=Options.rev!accu_optionsinifoptions.packages<>[]thenbeginFindlib_for_ppx.init_predicates();Findlib.init();Findlib_for_ppx.load_packages~debug:options.debug_findliboptions.packages;end;begintryDyncompile.compile_and_loadoptions(Ppxlib.Selected_ast.To_ocaml.copy_structureparsetree);withDynlink.Errorerror->Location.raise_errorf"%s"(Dynlink.error_messageerror)end;letmapper=replace_metapointscontext.metapointsinget_mappermappersletmap=object(self)inheritPpxlib.Ast_traverse.mapassupermethod!structures=transformself#structure(funmap->map#structure)smethod!signatures=transformself#structure(funmap->map#signature)sendlet()=Ppxlib.Driver.register_transformation"metapp"~preprocess_impl:map#structure~preprocess_intf:map#signature