Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file ppx_quickcheck_expander.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392open!Importletcustom_extension~loctagpayload=matchString.equaltag.txt"custom"with|false->unsupported~loc"uknown extension: %s"tag.txt|true->(matchpayloadwith|PStr[{pstr_desc=Pstr_eval(expr,attributes);_}]->assert_no_attributesattributes;expr|_->invalid~loc"[%%custom] extension expects a single expression as its payload");;letgenerator_attribute=Attribute.declare"quickcheck.generator"Attribute.Context.core_typeAst_pattern.(pstr(pstr_eval__nil^::nil))(funx->x);;letrecgenerator_of_core_typecore_type~gen_env~obs_env=letloc=core_type.ptyp_locinmatchAttribute.getgenerator_attributecore_typewith|Someexpr->expr|None->(matchcore_type.ptyp_descwith|Ptyp_constr(constr,args)->type_constr_conv~loc~f:generator_nameconstr(List.mapargs~f:(generator_of_core_type~gen_env~obs_env))|Ptyp_vartyvar->Environment.lookupgen_env~loc~tyvar|Ptyp_arrow(arg_label,input_type,output_type)->Ppx_generator_expander.arrow~generator_of_core_type:(generator_of_core_type~gen_env~obs_env)~observer_of_core_type:(observer_of_core_type~gen_env~obs_env)~loc~arg_label~input_type~output_type|Ptyp_tuplefields->Ppx_generator_expander.compound~generator_of_core_type:(generator_of_core_type~gen_env~obs_env)~loc~fields(moduleField_syntax.Tuple)|Ptyp_variant(clauses,Closed,None)->Ppx_generator_expander.variant~generator_of_core_type:(generator_of_core_type~gen_env~obs_env)~loc~variant_type:core_type~clauses~rec_names:(Set.empty(moduleString))(moduleClause_syntax.Polymorphic_variant)|Ptyp_variant(_,Open,_)->unsupported~loc"polymorphic variant type with [>]"|Ptyp_variant(_,_,Some_)->unsupported~loc"polymorphic variant type with [<]"|Ptyp_extension(tag,payload)->custom_extension~loctagpayload|Ptyp_any|Ptyp_object_|Ptyp_class_|Ptyp_alias_|Ptyp_poly_|Ptyp_package_->unsupported~loc"%s"(short_string_of_core_typecore_type))andobserver_of_core_typecore_type~obs_env~gen_env=letloc=core_type.ptyp_locinmatchcore_type.ptyp_descwith|Ptyp_constr(constr,args)->type_constr_conv~loc~f:observer_nameconstr(List.mapargs~f:(observer_of_core_type~obs_env~gen_env))|Ptyp_vartyvar->Environment.lookupobs_env~loc~tyvar|Ptyp_arrow(arg_label,input_type,output_type)->Ppx_observer_expander.arrow~observer_of_core_type:(observer_of_core_type~obs_env~gen_env)~generator_of_core_type:(generator_of_core_type~obs_env~gen_env)~loc~arg_label~input_type~output_type|Ptyp_tuplefields->Ppx_observer_expander.compound~observer_of_core_type:(observer_of_core_type~obs_env~gen_env)~loc~fields(moduleField_syntax.Tuple)|Ptyp_variant(clauses,Closed,None)->Ppx_observer_expander.variant~observer_of_core_type:(observer_of_core_type~obs_env~gen_env)~loc~clauses(moduleClause_syntax.Polymorphic_variant)|Ptyp_variant(_,Open,_)->unsupported~loc"polymorphic variant type with [>]"|Ptyp_variant(_,_,Some_)->unsupported~loc"polymorphic variant type with [<]"|Ptyp_extension(tag,payload)->custom_extension~loctagpayload|Ptyp_any->Ppx_observer_expander.any~loc|Ptyp_object_|Ptyp_class_|Ptyp_alias_|Ptyp_poly_|Ptyp_package_->unsupported~loc"%s"(short_string_of_core_typecore_type);;letrecshrinker_of_core_typecore_type~env=letloc=core_type.ptyp_locinmatchcore_type.ptyp_descwith|Ptyp_constr(constr,args)->type_constr_conv~loc~f:shrinker_nameconstr(List.mapargs~f:(shrinker_of_core_type~env))|Ptyp_vartyvar->Environment.lookupenv~loc~tyvar|Ptyp_arrow_->Ppx_shrinker_expander.arrow~loc|Ptyp_tuplefields->Ppx_shrinker_expander.compound~shrinker_of_core_type:(shrinker_of_core_type~env)~loc~fields(moduleField_syntax.Tuple)|Ptyp_variant(clauses,Closed,None)->Ppx_shrinker_expander.variant~shrinker_of_core_type:(shrinker_of_core_type~env)~loc~variant_type:core_type~clauses(moduleClause_syntax.Polymorphic_variant)|Ptyp_variant(_,Open,_)->unsupported~loc"polymorphic variant type with [>]"|Ptyp_variant(_,_,Some_)->unsupported~loc"polymorphic variant type with [<]"|Ptyp_extension(tag,payload)->custom_extension~loctagpayload|Ptyp_any->Ppx_shrinker_expander.any~loc|Ptyp_object_|Ptyp_class_|Ptyp_alias_|Ptyp_poly_|Ptyp_package_->unsupported~loc"%s"(short_string_of_core_typecore_type);;typeimpl={loc:location;pat:pattern;var:expression;exp:expression}letgenerator_impltype_decl~rec_names=letloc=type_decl.ptype_locinletpat=pgeneratortype_decl.ptype_nameinletvar=egeneratortype_decl.ptype_nameinletexp=letpat_list,`Covariantgen_env,`Contravariantobs_env=Environment.create_with_variance~loc~covariant:"generator"~contravariant:"observer"type_decl.ptype_paramsinletbody=matchtype_decl.ptype_kindwith|Ptype_open->unsupported~loc"open type"|Ptype_variantclauses->Ppx_generator_expander.variant~generator_of_core_type:(generator_of_core_type~gen_env~obs_env)~loc~variant_type:[%type:_]~clauses~rec_names(moduleClause_syntax.Variant)|Ptype_recordfields->Ppx_generator_expander.compound~generator_of_core_type:(generator_of_core_type~gen_env~obs_env)~loc~fields(moduleField_syntax.Record)|Ptype_abstract->(matchtype_decl.ptype_manifestwith|Somecore_type->generator_of_core_typecore_type~gen_env~obs_env|None->unsupported~loc"abstract type")inList.fold_rightpat_list~init:body~f:(funpatbody->[%exprfun[%ppat]->[%ebody]])in{loc;pat;var;exp};;letobserver_impltype_decl~rec_names:_=letloc=type_decl.ptype_locinletpat=pobservertype_decl.ptype_nameinletvar=eobservertype_decl.ptype_nameinletexp=letpat_list,`Covariantobs_env,`Contravariantgen_env=Environment.create_with_variance~loc~covariant:"observer"~contravariant:"generator"type_decl.ptype_paramsinletbody=matchtype_decl.ptype_kindwith|Ptype_open->unsupported~loc"open type"|Ptype_variantclauses->Ppx_observer_expander.variant~observer_of_core_type:(observer_of_core_type~obs_env~gen_env)~loc~clauses(moduleClause_syntax.Variant)|Ptype_recordfields->Ppx_observer_expander.compound~observer_of_core_type:(observer_of_core_type~obs_env~gen_env)~loc~fields(moduleField_syntax.Record)|Ptype_abstract->(matchtype_decl.ptype_manifestwith|Somecore_type->observer_of_core_typecore_type~obs_env~gen_env|None->unsupported~loc"abstract type")inList.fold_rightpat_list~init:body~f:(funpatbody->[%exprfun[%ppat]->[%ebody]])in{loc;pat;var;exp};;letshrinker_impltype_decl~rec_names:_=letloc=type_decl.ptype_locinletpat=pshrinkertype_decl.ptype_nameinletvar=eshrinkertype_decl.ptype_nameinletexp=letpat_list,env=Environment.create~loc~prefix:"shrinker"type_decl.ptype_paramsinletbody=matchtype_decl.ptype_kindwith|Ptype_open->unsupported~loc"open type"|Ptype_variantclauses->Ppx_shrinker_expander.variant~shrinker_of_core_type:(shrinker_of_core_type~env)~loc~variant_type:[%type:_]~clauses(moduleClause_syntax.Variant)|Ptype_recordfields->Ppx_shrinker_expander.compound~shrinker_of_core_type:(shrinker_of_core_type~env)~loc~fields(moduleField_syntax.Record)|Ptype_abstract->(matchtype_decl.ptype_manifestwith|Somecore_type->shrinker_of_core_typecore_type~env|None->unsupported~loc"abstract type")inList.fold_rightpat_list~init:body~f:(funpatbody->[%exprfun[%ppat]->[%ebody]])in{loc;pat;var;exp};;letmaybe_mutually_recursivedecls~loc~rec_flag~of_lazy~impl=letdecls=List.mapdecls~f:name_type_params_in_tdinletrec_names=matchrec_flagwith|Nonrecursive->Set.empty(moduleString)|Recursive->Set.of_list(moduleString)(List.mapdecls~f:(fundecl->decl.ptype_name.txt))inletimpls=List.mapdecls~f:(fundecl->impldecl~rec_names)inmatchrec_flagwith|Nonrecursive->pstr_value_list~locNonrecursive(List.mapimpls~f:(funimpl->value_binding~loc:impl.loc~pat:impl.pat~expr:impl.exp))|Recursive->letpats=List.mapimpls~f:(funimpl->impl.pat)inletbindings=letinner_bindings=List.mapimpls~f:(funinner->value_binding~loc:inner.loc~pat:inner.pat~expr:[%expr[%eof_lazy][%einner.var]])inList.mapimpls~f:(funimpl->letbody=pexp_let~loc:impl.locNonrecursiveinner_bindingsimpl.expinletlazy_expr=[%exprlazy[%ebody]]invalue_binding~loc:impl.loc~pat:impl.pat~expr:lazy_expr)inletbody=pexp_tuple~loc(List.mapimpls~f:(funimpl->[%expr[%eof_lazy][%eimpl.var]]))inpstr_value_list~locNonrecursive[value_binding~loc~pat:(ppat_tuple~locpats)~expr:(pexp_let~locRecursivebindingsbody)];;letgenerator_impl_listdecls~loc~rec_flag=maybe_mutually_recursivedecls~loc~rec_flag~of_lazy:[%exprBase_quickcheck.Generator.of_lazy]~impl:generator_impl;;letobserver_impl_listdecls~loc~rec_flag=maybe_mutually_recursivedecls~loc~rec_flag~of_lazy:[%exprBase_quickcheck.Observer.of_lazy]~impl:observer_impl;;letshrinker_impl_listdecls~loc~rec_flag=maybe_mutually_recursivedecls~loc~rec_flag~of_lazy:[%exprBase_quickcheck.Shrinker.of_lazy]~impl:shrinker_impl;;letintftype_decl~f~covar~contravar=letcovar=Longident.parse("Base_quickcheck."^covar^".t")inletcontravar=Longident.parse("Base_quickcheck."^contravar^".t")inlettype_decl=name_type_params_in_tdtype_declinletloc=type_decl.ptype_locinletname=loc_maptype_decl.ptype_name~finletresult=ptyp_constr~loc{loc;txt=covar}[ptyp_constr~loc(lident_loctype_decl.ptype_name)(List.maptype_decl.ptype_params~f:fst)]inlettype_=List.fold_righttype_decl.ptype_params~init:result~f:(fun(core_type,variance)result->letid=matchvariancewith|Invariant|Covariant->covar|Contravariant->contravarinletarg=ptyp_constr~loc{loc;txt=id}[core_type]in[%type:[%targ]->[%tresult]])inpsig_value~loc(value_description~loc~name~type_~prim:[]);;letshrinker_intf=intf~f:shrinker_name~covar:"Shrinker"~contravar:"Shrinker"letgenerator_intf=intf~f:generator_name~covar:"Generator"~contravar:"Observer"letobserver_intf=intf~f:observer_name~covar:"Observer"~contravar:"Generator"letgenerator_intf_listtype_decl_list=List.maptype_decl_list~f:generator_intfletobserver_intf_listtype_decl_list=List.maptype_decl_list~f:observer_intfletshrinker_intf_listtype_decl_list=List.maptype_decl_list~f:shrinker_intfletsig_type_decl=Deriving.Generator.make_noarg(fun~loc:_~path:_(_,decls)->generator_intf_listdecls@observer_intf_listdecls@shrinker_intf_listdecls);;letstr_type_decl=Deriving.Generator.make_noarg(fun~loc~path:_(rec_flag,decls)->letrec_flag=really_recursiverec_flagdeclsingenerator_impl_list~loc~rec_flagdecls@observer_impl_list~loc~rec_flagdecls@shrinker_impl_list~loc~rec_flagdecls);;letgenerator_extension~loc:_~path:_core_type=generator_of_core_typecore_type~gen_env:Environment.empty~obs_env:Environment.empty;;letobserver_extension~loc:_~path:_core_type=observer_of_core_typecore_type~obs_env:Environment.empty~gen_env:Environment.empty;;letshrinker_extension~loc:_~path:_core_type=shrinker_of_core_typecore_type~env:Environment.empty;;