Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file ppx_deriving_map.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153# 1 "ppx_deriving_map.cppo.ml"openPpxlibopenAsttypesopenParsetreeopenAst_helperopenPpx_deriving.Ast_convenienceletderiver="map"letraise_errorf=Ppx_deriving.raise_errorfletparse_optionsoptions=options|>List.iter(fun(name,expr)->matchnamewith|_->raise_errorf~loc:expr.pexp_loc"%s does not support option %s"derivername)letattr_nobuiltinattrs=Ppx_deriving.(attrs|>attr~deriver"nobuiltin"|>Arg.get_flag~deriver)letargn=Printf.sprintf"a%d"letargl=Printf.sprintf"a%s"letpattntyps=List.mapi(funi_->pvar(argni))typsletpattllabels=List.map(fun{pld_name={txt=n}}->n,pvar(argln))labelsletpconstrrecnamefields=pconstrname[precord~closed:Closedfields]letconstrrecnamefields=constrname[recordfields]letrecexpr_of_typ?decltyp=letloc=typ.ptyp_locinlettyp=Ppx_deriving.remove_pervasives~derivertypinmatchtypwith|_whenPpx_deriving.free_vars_in_core_typetyp=[]->[%exprfunx->x]|{ptyp_desc=Ptyp_constr_}->letbuiltin=not(attr_nobuiltintyp.ptyp_attributes)inbeginmatchbuiltin,typwith|true,[%type:[%t?typ]list]->[%exprPpx_deriving_runtime.List.map[%eexpr_of_typ?decltyp]]|true,[%type:[%t?typ]array]->[%exprPpx_deriving_runtime.Array.map[%eexpr_of_typ?decltyp]]|true,[%type:[%t?typ]option]->[%exprfunctionNone->None|Somex->Some([%eexpr_of_typ?decltyp]x)]|true,([%type:([%t?ok_t],[%t?err_t])result]|[%type:([%t?ok_t],[%t?err_t])Result.result])->[%exprfunction|Result.Okok->Result.Ok([%eexpr_of_typ?declok_t]ok)|Result.Errorerr->Result.Error([%eexpr_of_typ?declerr_t]err)]|_,{ptyp_desc=Ptyp_constr({txt=lid},args)}->app(Exp.ident(mknoloc(Ppx_deriving.mangle_lid(`Prefixderiver)lid)))(List.map(expr_of_typ?decl)args)|_->assertfalseend|{ptyp_desc=Ptyp_tupletyps}->[%exprfun[%pptuple(List.mapi(funi_->pvar(argni))typs)]->[%etuple(List.mapi(funityp->app(expr_of_typ?decltyp)[evar(argni)])typs)]];|{ptyp_desc=Ptyp_variant(fields,_,_);ptyp_loc}->letcases=fields|>List.map(funfield->letpat_variantlabelpopt=Pat.variantlabel.txtpoptinletexp_variantlabelpopt=Exp.variantlabel.txtpoptinmatchfield.prf_descwith|Rtag(label,true(*empty*),[])->Exp.case(pat_variantlabelNone)(exp_variantlabelNone)|Rtag(label,false,[typ])->Exp.case(pat_variantlabel(Some[%pat?x]))(exp_variantlabel(Some[%expr[%eexpr_of_typ?decltyp]x]))|Rinherit({ptyp_desc=Ptyp_constr(tname,_)}astyp)->beginmatchdeclwith|None->raise_errorf"inheritance of polymorphic variants not supported"|Some(d)->Exp.case[%pat?[%pPat.type_tname]asx][%expr([%eexpr_of_typ?decltyp]x:>[%tPpx_deriving.core_type_of_type_decld])]end|_->raise_errorf~loc:ptyp_loc"%s cannot be derived for %s"deriver(Ppx_deriving.string_of_core_typetyp))inExp.function_cases|{ptyp_desc=Ptyp_varname}->evar("poly_"^name)|{ptyp_desc=Ptyp_alias(typ,name)}->[%exprfunx->[%eevar("poly_"^name)]([%eexpr_of_typ?decltyp]x)]|{ptyp_loc}->raise_errorf~loc:ptyp_loc"%s cannot be derived for %s"deriver(Ppx_deriving.string_of_core_typetyp)andexpr_of_label_decl?decl{pld_type;pld_attributes}=letattrs=pld_type.ptyp_attributes@pld_attributesinexpr_of_typ?decl{pld_typewithptyp_attributes=attrs}letstr_of_type~options~path({ptype_loc=loc}astype_decl)=parse_optionsoptions;letmapper=matchtype_decl.ptype_kind,type_decl.ptype_manifestwith|Ptype_abstract,Somemanifest->expr_of_typ~decl:type_declmanifest|Ptype_variantconstrs,_->constrs|>List.map(fun{pcd_name={txt=name'};pcd_args}->matchpcd_argswith|Pcstr_tuple(typs)->letargs=List.mapi(funityp->app(expr_of_typ~decl:type_decltyp)[evar(argni)])typsinExp.case(pconstrname'(pattntyps))(constrname'args)|Pcstr_record(labels)->letargs=labels|>List.map(fun({pld_name={txt=n};_}aspld)->n,[%expr[%eexpr_of_label_decl~decl:type_declpld][%eevar(argln)]])inExp.case(pconstrrecname'(pattllabels))(constrrecname'args))|>Exp.function_|Ptype_recordlabels,_->letfields=labels|>List.mapi(funi({pld_name={txt=name};_}aspld)->name,[%expr[%eexpr_of_label_decl~decl:type_declpld][%eExp.field(evar"x")(mknoloc(Lidentname))]])inletannot_typ=Ppx_deriving.core_type_of_type_decltype_declin[%exprfun(x:[%tannot_typ])->[%erecordfields]]|Ptype_abstract,None->raise_errorf~loc"%s cannot be derived for fully abstract types"deriver|Ptype_open,_->raise_errorf~loc"%s cannot be derived for open types"deriverinletpolymorphize=Ppx_deriving.poly_fun_of_type_decltype_declin[Vb.mk~attrs:[Ppx_deriving.attr_warning[%expr"-39"]](pvar(Ppx_deriving.mangle_type_decl(`Prefixderiver)type_decl))(polymorphizemapper)]letsig_of_type~options~pathtype_decl=letloc=type_decl.ptype_locinparse_optionsoptions;lettyp_arg,var_arg,bound=Ppx_deriving.instantiate[]type_declinlettyp_ret,var_ret,_=Ppx_deriving.instantiateboundtype_declinletarrow=Typ.arrowLabel.nolabelinletpoly_fns=List.map2(funar->[%type:[%tTyp.vara]->[%tTyp.varr]])var_argvar_retinlettyp=List.fold_rightarrowpoly_fns(arrowtyp_argtyp_ret)in[Sig.value(Val.mk(mknoloc(Ppx_deriving.mangle_type_decl(`Prefixderiver)type_decl))typ)]let()=Ppx_deriving.(register(createderiver~core_type:(expr_of_typ?decl:None)~type_decl_str:(fun~options~pathtype_decls->[Str.valueRecursive(List.concat(List.map(str_of_type~options~path)type_decls))])~type_decl_sig:(fun~options~pathtype_decls->List.concat(List.map(sig_of_type~options~path)type_decls))()))