Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file ppx_deriving_lens.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128openLongidentopenLocationopenAsttypesopenParsetreeopenAst_helperopenAst_convenienceletderiver="lens"letraise_errorf=Ppx_deriving.raise_errorftypelens_options={prefix:bool;submodule:bool;}letlens_default_options={prefix=false;submodule=false;}letbool_optionderivernameexpr=matchexprwith|[%exprtrue]|[%expr"true"]->true|[%exprfalse]|[%expr"false"]->false|_->raise_errorf~loc:expr.pexp_loc"%s %s option must be either true or false"derivernameletparse_optionsoptions=options|>List.fold_left(funderiver_options(name,expr)->matchnamewith|"prefix"|"affix"->{deriver_optionswithprefix=bool_optionderivernameexpr}|"submodule"->{deriver_optionswithsubmodule=bool_optionderivernameexpr}|_->raise_errorf~loc:expr.pexp_loc"%s does not support option %s"derivername)lens_default_options(* builds the expression: { record with field = value } *)letupdated_recordrecordfieldvalue=Exp.mk(Pexp_record([(mknoloc(Lidentfield),Exp.mk(Pexp_ident(mknoloc(Lidentvalue))))],Some(Exp.mk(Pexp_ident(mknoloc(Lidentrecord))))))(* wraps a list of signatures into a module signature *)letdeclare_modulelocmodule_namesignatures={psig_desc=Psig_module{pmd_name={txt=module_name;loc};pmd_type={pmty_desc=Pmty_signaturesignatures;pmty_loc=loc;pmty_attributes=[]};pmd_loc=loc;pmd_attributes=[]};psig_loc=loc}(* wraps a list of expression into a module *)letdefine_modulelocmodule_nameexpressions=letexpressions=List.map(funx->{pstr_desc=Pstr_value(Nonrecursive,[x]);pstr_loc=loc})expressionsinPstr_module{pmb_name={txt=module_name;loc};pmb_expr={pmod_desc=Pmod_structureexpressions;pmod_loc=loc;pmod_attributes=[]};pmb_loc=loc;pmb_attributes=[];}letlens_name~deriver_optionsrecord_type_declfield_name=ifderiver_options.submodulethenfield_nameelseifderiver_options.prefixthenPpx_deriving.mangle_type_decl(`PrefixSuffix(deriver,field_name))record_type_declelsePpx_deriving.mangle_type_decl(`Suffixfield_name)record_type_declletmodule_name~deriver_options{ptype_name={txt=name}}=ifderiver_options.prefixthen(String.capitalize_asciiname)^"Lens"else"Lens"letwrap_in_submodule_sig~deriver_optionsrecordlocsignatures=ifderiver_options.submodulethenletmodule_name=module_name~deriver_optionsrecordin[declare_modulelocmodule_namesignatures]elsesignaturesletwrap_in_submodule_struct~deriver_optionsrecordlocexpressions=ifderiver_options.submodulethenletmodule_name=module_name~deriver_optionsrecordin{pstr_desc=define_modulelocmodule_nameexpressions;pstr_loc=loc}else{pstr_desc=Pstr_value(Nonrecursive,expressions);pstr_loc=loc}letstr_of_type~options~path({ptype_loc=loc}astype_decl)=letderiver_options=parse_optionsoptionsinmatchtype_decl.ptype_kindwith|Ptype_recordlabels->labels|>List.map(fun{pld_name={txt=name;loc}}->name,[%exprLens.{get=(funr->[%eExp.field(evar"r")(mknoloc(Lidentname))]);set=(funvr->[%eupdated_record"r"name"v"]);}])|>List.map(fun(name,lens)->Vb.mk(pvar(lens_name~deriver_optionstype_declname))lens)|>wrap_in_submodule_struct~deriver_optionstype_declloc|_->raise_errorf~loc"%s can be derived only for record types"deriverlettype_namedname=Typ.mk(Ptyp_constr(mknoloc(Lidentname),[]))letsig_of_type~options~path({ptype_loc=loc;ptype_name={txt=record_name}}astype_decl)=letderiver_options=parse_optionsoptionsinmatchtype_decl.ptype_kindwith|Ptype_recordlabels->labels|>List.map(fun{pld_name={txt=name;loc};pld_type}->letlens_type=[%type:([%ttype_namedrecord_name],[%tpld_type])Lens.t]inSig.value(Val.mk(mknoloc(lens_name~deriver_optionstype_declname))lens_type))|>wrap_in_submodule_sig~deriver_optionstype_declloc|_->raise_errorf~loc"%s can be derived only for record types"deriverlet()=Ppx_deriving.(register(createderiver~type_decl_str:(fun~options~pathtype_decls->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))()))