Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file gmap.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221(*
* Generic transformers (GT): `gmap` plugin.
* Copyright (C) 2017-2022
* Dmitrii Kosarev a.k.a. Kakadu
* St.Petersburg University, JetBrains Research
*)(** {i Gmap} plugin (functor).
For type declaration [type ('a,'b,...) typ = ...] it will create a transformation
function with type
[('a -> 'a2) -> ('b -> 'b2) -> ... -> ('a,'b,...) typ -> ('a2,'b2,...) typ ]
Inherited attributes' type (both default and for type parameters) is [unit].
*)openPpxlibopenPrintfopenGTCommonopenHelpersBaselettrait_name="gmap"letparam_name_mangler=sprintf"%s_2"moduleMake(AstHelpers:GTHELPERS_sig.S)=structlettrait_name=trait_namemoduleP=Plugin.Make(AstHelpers)openAstHelpers(* TODO: rethink this function *)lethack_params?(loc=noloc)ps=letparam_names=map_type_param_namesps~f:idinletrez_names=map_type_param_namesps~f:param_name_manglerinletname_migrations=List.zip_exnparam_namesrez_namesinletassocs=tryList.Assoc.find_exn~equal:String.equalname_migrationsswith|Stdlib.Not_found->Ppxlib.Location.raise_errorf~loc:Location.none"can't find new typ for param `%s"sinletblownup_params=List.concat_mapparam_names~f:(funs1->[named_type_arg~locs1;named_type_arg~loc@@assocs1])inparam_names,rez_names,assoc,blownup_params;;classgargstdecls=object(self:'self)inheritP.no_inherit_argargstdeclsassupermethodtrait_name=trait_namemethodinh_of_main~loc_tdecl=Typ.ident~loc"unit"methodsyn_of_param~locs=Typ.var~loc@@param_name_manglersmethodinh_of_param~loctdecl_name=self#inh_of_main~loctdeclmethodsyn_of_main~loc?(in_class=false)tdecl=ifin_class&&is_polyvariant_tdecltdeclthenTyp.var~loc@@sprintf"syn_%s"tdecl.ptype_name.txtelse(letparam_names,rez_names,find_param,blownup_params=hack_paramstdecl.ptype_paramsinletans=letident=Lident(self#cur_nametdecl)inTyp.constr~locident@@List.map~f:(Typ.var~loc)rez_namesinans)methodplugin_class_params~loc(typs:Ppxlib.core_typelist)~typname:Typ.tlist=lettyps2=List.maptyps~f:(funtyp->map_core_typetyp~onvar:(funs->letopenPpxlib.Ast_builder.DefaultinOption.some@@ptyp_var~loc:typ.ptyp_loc(param_name_manglers)))inletblownup_params=List.concat@@List.map2_exn~f:(funab->[a;b])typstyps2inList.mapblownup_params~f:Typ.from_caml@[Typ.var~loc@@Naming.make_extra_paramtypname;Typ.var~loc@@sprintf"syn_%s"typname]methodhack~loc(mangler:string->string)paramtdecl:Typ.t=letloc=loc_from_camltdecl.ptype_locinleton_abstract()=Typ.constr~loc(Lidenttdecl.ptype_name.txt)@@map_type_param_namestdecl.ptype_params~f:(funs->Typ.var~loc@@manglers)invisit_typedecl~loctdecl~onopen:(fun()->failwith"open types are not supported")~onrecord:(fun_->on_abstract())~onvariant:(fun_->on_abstract())~onabstract:(fun()->on_abstract())~onmanifest:(funtyp->ifnot(is_polyvarianttyp)thenon_abstract()else(matchtyp.ptyp_descwith|Ptyp_variant(rf,_,_)->letonvars=letopenAst_builder.DefaultinSome(ptyp_var~loc:tdecl.ptype_loc@@manglers)inTyp.variant~loc~is_open:true@@List.maprf~f:(funrf->matchrf.prf_descwith|Rtag(name,has_empty,ts)->letopenAst_builder.Defaultinleton_tt=map_core_type~onvar~onconstr:(funnamets->matchnamewith|LidentswhenString.equalstdecl.ptype_name.txt->Option.some@@ptyp_var~loc:tdecl.ptype_locparam|_->None)tin{rfwithprf_desc=Rtag(name,has_empty,List.mapts~f:on_t)}|Rinherittyp->{rfwithprf_desc=Rinherit(map_core_typetyp~onvar)})|_->failwith"should not happen"))method!extra_class_sig_memberstdecl=letloc=loc_from_camltdecl.ptype_locinsuper#extra_class_sig_memberstdecl@[(letsyn=sprintf"syn_%s"tdecl.ptype_name.txtinCtf.constraint_~loc(Typ.var~loc@@syn)(self#hack~locparam_name_manglersyntdecl))]method!extra_class_str_memberstdecl=letloc=loc_from_camltdecl.ptype_locinsuper#extra_class_str_memberstdecl@[(letsyn=sprintf"syn_%s"tdecl.ptype_name.txtinCf.constraint_~loc(Typ.var~loc@@syn)(self#hack~locparam_name_manglersyntdecl))]methodon_tuple_constr~loc~is_self_rec~mutual_decls~inhetdeclconstr_infots=letctuple=List.mapts~f:(fun(name,typ)->self#app_transformation_expr~loc(self#do_typ_gen~loc~is_self_rec~mutual_declstdecltyp)inhe(Exp.ident~locname))inmatchconstr_infowith|Some(`Normals)->Exp.construct~loc(lidents)ctuple|Some(`Polys)->Exp.variant~locsctuple|None->Exp.tuple~locctuplemethodon_record_declaration~loc~is_self_rec~mutual_declstdecllabs=letpat=Pat.record~loc@@List.maplabs~f:(funl->Lidentl.pld_name.txt,Pat.var~locl.pld_name.txt)inletmethname=sprintf"do_%s"tdecl.ptype_name.txtin[Cf.method_concrete~locmethname@@Exp.fun_~loc(Pat.unit~loc)@@Exp.fun_~locpat@@Exp.record~loc@@List.maplabs~f:(fun{pld_name;pld_type}->(lidentpld_name.txt,self#app_transformation_expr~loc(self#do_typ_gen~loc~is_self_rec~mutual_declstdeclpld_type)(Exp.unit~loc)(Exp.ident~locpld_name.txt)))]method!on_record_constr~loc~is_self_rec~mutual_decls~inhetdeclinfobindingslabs=assert(List.lengthlabs>0);letis_poly,cname=matchinfowith|`Normals->false,s|`Polys->true,sin(* Exp.fun_list ~loc (List.map bindings ~f:(fun (s,_,_) -> Pat.sprintf ~loc "%s" s)) @@ *)(ifis_polythenExp.variant~loccnameelseExp.construct~loc(lidentcname))[Exp.record~loc@@List.mapbindings~f:(fun(s,labname,typ)->(lidentlabname,self#app_transformation_expr~loc(self#do_typ_gen~loc~is_self_rec~mutual_declstdecltyp)inhe(Exp.ident~locs)))]method!make_inh~loc=Pat.unit~loc,Exp.unit~locendletcreate=(newg:>P.plugin_constructor)endletregister()=Expander.register_plugintrait_name(moduleMake:Plugin_intf.MAKE)let()=register()