123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174(* Extension of modules under Ast_<ver> *)openMigrate_parsetree.Ast_405openUtilsopenListmoduleLongident=structincludeLongidentopenFormatletrecformatppf=function|Lidentn->pp_print_stringppfn|Ldot(p,name)->fprintfppf"%a.%s"formatpname|Lapply(p1,p2)->fprintfppf"%a(%a)"formatp1formatp2letto_stringl=ksprintf(funx->x)"%a"formatlendmoduleIdent=structincludeIdentopenFormatletformatppfid=pp_print_stringppf(Ident.nameid)letformat_verbose=Ident.print_with_scopeendmodulePath=structincludePathopenFormatletrecformatppf=function|Pidentid->Ident.formatppfid|Pdot(p,name)->fprintfppf"%a.%s"formatpname|Papply(p1,p2)->fprintfppf"%a(%a)"formatp1formatp2letrecformat_verboseppf=function|Pidentid->Ident.format_verboseppfid|Pdot(p,name)->fprintfppf"%a.%s"format_verbosepname|Papply(p1,p2)->fprintfppf"%a(%a)"format_verbosep1format_verbosep2letto_stringl=ksprintf(funx->x)"%a"formatlendmoduleLocation=structincludeLocationletformat=print_locletmerget1t2={t1withloc_end=t2.loc_end}endmoduleXParsetree=struct(* We cannot include Parsetree since it lacks implementation *)openParsetreeletiter_core_typefty=matchty.ptyp_descwithPtyp_any|Ptyp_var_->()|Ptyp_arrow(_,ty1,ty2)->fty1;fty2|Ptyp_tuplel|Ptyp_constr(_,l)|Ptyp_class(_,l)->iterfl|Ptyp_alias(ty,_)->fty|Ptyp_object(s_a_cty_l,_)->iter(fun(_,_,cty)->fcty)s_a_cty_l|Ptyp_variant(rfs,_,_)->iter(function|Rtag(_,_,_,l)->iterfl|Rinheritt->ft)rfs|Ptyp_poly(_,t)->ft|Ptyp_package(_,l_cty_s)->iter(fun(_,t)->ft)l_cty_s|Ptyp_extension_->()moduleLongidentSet=Set.Make(structtypet=Longident.tletcompare=compareend)(* referred constrs and classes *)letconstrs_in_core_type_ty=lets=refLongidentSet.emptyinletaddl=s:=LongidentSet.addl!sinletrecfty=beginmatchty.ptyp_descwith|Ptyp_constr({txt},_)->addtxt|Ptyp_class({txt},_)->addtxt|_->()end;iter_core_typeftyinfty;!sletconstrs_in_core_typety=LongidentSet.elements&constrs_in_core_type_tyletconstrs_in_type_declarationtd=constrs_in_core_type&Ast_helper.Typ.tuple&concat_map(fun(ty1,ty2,_)->[ty1;ty2])td.ptype_cstrs@beginmatchtd.ptype_kindwith|Ptype_abstract->[]|Ptype_variantcds->concat_map(funcd->(matchcd.pcd_argswith|Pcstr_tuplectys->ctys|Pcstr_recordlds->map(funx->x.pld_type)lds)@Option.to_listcd.pcd_res)cds|Ptype_recordldl->map(funld->ld.pld_type)ldl|Ptype_open->[]end@Option.to_listtd.ptype_manifestletsccs(es:('v*'vlist)list):'vlistlist=matcheswith|[]->[]|_->letrecfcntrvnsspsccs(v:'v*'vlist)=let(v_,w_s)=vinletvns=(v_,cntr)::vnsinlets=v::sinletp=(v,cntr)::pinletcntr=cntr+1inletcntr,vns,s,p,sccs=fold_left(fun(cntr,vns,s,p,sccs)w_->letw=w_,assocw_esinmatchassoc_optw_vnswith|None->fcntrvnsspsccsw|Somen->letrecpop=function|((_,n')::_asp)whenn'<=n->p|_::vns->popvns|[]->assertfalseincntr,vns,s,popp,sccs)(cntr,vns,s,p,sccs)w_sinmatchpwith|[]->assertfalse|((v'_,_),_)::pwhenv_=v'_->letrecpopscc=function|(v'_,_)::s->ifv_=v'_then(v'_::scc),selsepop(v'_::scc)s|_->assertfalseinletscc,s=pop[]sincntr,vns,s,p,scc::sccs|_->cntr,vns,s,p,sccsinlet_,_,_,_,sccs=f0[][][][](List.hdes)insccsletgroup_type_declarationstds=letnames=List.map(funtd->td.ptype_name.txt)tdsinletalist=List.map(funtd->td.ptype_name.txt,td)tdsinletmutually_definedtd=filter_map(functionLongident.LidentswhenList.memsnames->Somes|_->None)&constrs_in_type_declarationtdinletgraph,nonrecs=List.partition_map(funtd->matchmutually_definedtdwith|[]->`Righttd.ptype_name.txt|ns->`Left(td.ptype_name.txt,ns))tdsinletgroups=sccsgraphin(List.map(List.map(flipList.assocalist))groups,List.map(flipList.assocalist)nonrecs)letis_gadttype_decl=matchtype_decl.ptype_kindwith|Ptype_variantconstrs->List.exists(func->c.pcd_res<>None)constrs|_->falseendletraise_errorf=Location.raise_errorftype'aloc='aLocation.loc={txt:'a;loc:Location.t}