123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513openCilopenCodeQuery(* Default output if the input-query is not supported *)letloc_default={line=-1;file="";byte=-1;column=-1}letrecdelete_elem(name1,loc1,typ1,id1)list=matchlistwith|(name2,loc2,typ2,id2)::xs->ifString.comparename1name2=0&&loc1.line=loc2.line&&loc1.byte=loc2.byte&&loc1.column=loc2.column&&String.compareloc1.fileloc2.file=0&&String.comparetyp1typ2=0&&id1=id2thendelete_elem(name1,loc1,typ1,id1)xselse(name2,loc2,typ2,id2)::delete_elem(name1,loc1,typ1,id1)xs|[]->[]letrecdelete_duplicateslisttbl=matchlistwith|x::xs->(let_=tryHashtbl.findtblxwithNot_found->Hashtbl.addtblx1;1inx::delete_duplicatesxstbl)|[]->[]letrecand_one_elem(name1,loc1,typ1,id1)list=matchlistwith|(name2,loc2,typ2,id2)::xs->ifloc1.line=loc2.linethen[(name1,loc1,typ1,id1);(name2,loc2,typ2,id2)]@and_one_elem(name1,loc1,typ1,id1)xselseand_one_elem(name1,loc1,typ1,id1)xs|[]->[]letrecand_two_listslist1list2=matchlist1with|x::xs->and_one_elemxlist2@and_two_listsxslist2|[]->[]letrecand_several_listslist_of_lists=matchlist_of_listswith|x::y::xs->and_several_lists(and_two_listsxy::xs)|[x]->x|[]->[](* Naming of functions: resolve_query_[kind]_[find]_[structure] *)(* Resolution of datatype-oriented queries *)letresolve_query_datatype_uses_funquerycilfilefunname=matchquery.tarwith|Name_tname->FuncDatatype.find_uses_in_funnamefunnamecilfile|And_tlist->and_several_lists(List.map(funx->FuncDatatype.find_uses_in_funxfunnamecilfile)list)|Or_tlist->List.flatten(List.map(funx->FuncDatatype.find_uses_in_funxfunnamecilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_datatype_uses_nonequerycilfile=matchquery.tarwith|Name_tname->FuncDatatype.find_usesnamecilfile|And_tlist->and_several_lists(List.map(funx->FuncDatatype.find_usesxcilfile)list)|Or_tlist->List.flatten(List.map(funx->FuncDatatype.find_usesxcilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_datatype_uses_condquerycilfile=matchquery.tarwith|Name_tname->FuncDatatype.find_uses_in_condnamecilfile|And_tlist->and_several_lists(List.map(funx->FuncDatatype.find_uses_in_condxcilfile)list)|Or_tlist->List.flatten(List.map(funx->FuncDatatype.find_uses_in_condxcilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_datatype_uses_noncondquerycilfile=matchquery.tarwith|Name_tname->FuncDatatype.find_uses_in_noncondnamecilfile|And_tlist->and_several_lists(List.map(funx->FuncDatatype.find_uses_in_noncondxcilfile)list)|Or_tlist->List.flatten(List.map(funx->FuncDatatype.find_uses_in_condxcilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_datatype_usesquerycilfile=matchquery.strwith|Fun_sfunname->resolve_query_datatype_uses_funquerycilfilefunname|Cond_s->resolve_query_datatype_uses_condquerycilfile|NonCond_s->resolve_query_datatype_uses_noncondquerycilfile|None_s->resolve_query_datatype_uses_nonequerycilfileletresolve_query_datatype_defs_nonequerycilfile=matchquery.tarwith|Name_tname->FuncDatatype.find_defnamecilfile|Or_tlist->List.flatten(List.map(funx->FuncDatatype.find_defxcilfile)list)|All_t->FuncDatatype.find_def_allcilfile|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_datatype_defsquerycilfile=matchquery.strwith|None_s->resolve_query_datatype_defs_nonequerycilfile|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_datatypequerycilfile=matchquery.fwith|Uses_f->resolve_query_datatype_usesquerycilfile|Defs_f->resolve_query_datatype_defsquerycilfile|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)](* Resolution of variable-oriented queries *)letresolve_query_var_uses_funquerycilfilefunname=matchquery.tarwith|Name_tname->FuncVar.find_uses_in_funname(-1)funnamecilfilefalse|ID_tid->FuncVar.find_uses_in_fun""idfunnamecilfilefalse|AllGlobVar_t->FuncVar.find_uses_in_fun_all_globfunnamecilfilefalse|All_t->FuncVar.find_uses_in_fun_allfunnamecilfilefalse|And_tlist->and_several_lists(List.map(funx->FuncVar.find_uses_in_funx(-1)funnamecilfilefalse)list)|Or_tlist->List.flatten(List.map(funx->FuncVar.find_uses_in_funx(-1)funnamecilfilefalse)list)letresolve_query_var_uses_nonequerycilfile=matchquery.tarwith|Name_tname->FuncVar.find_usesname(-1)cilfilefalse|ID_tid->FuncVar.find_uses""idcilfilefalse|AllGlobVar_t->FuncVar.find_uses_all_globcilfilefalse|All_t->FuncVar.find_uses_allcilfilefalse|And_tlist->and_several_lists(List.map(funx->FuncVar.find_usesx(-1)cilfilefalse)list)|Or_tlist->List.flatten(List.map(funx->FuncVar.find_usesx(-1)cilfilefalse)list)letresolve_query_var_uses_condquerycilfile=matchquery.tarwith|Name_tname->FuncVar.find_uses_in_condname(-1)cilfilefalse|ID_tid->FuncVar.find_uses_in_cond""idcilfilefalse|AllGlobVar_t->FuncVar.find_uses_in_cond_all_globcilfilefalse|All_t->FuncVar.find_uses_in_cond_allcilfilefalse|And_tlist->and_several_lists(List.map(funx->FuncVar.find_uses_in_condx(-1)cilfilefalse)list)|Or_tlist->List.flatten(List.map(funx->FuncVar.find_uses_in_condx(-1)cilfilefalse)list)letresolve_query_var_uses_noncondquerycilfile=matchquery.tarwith|Name_tname->FuncVar.find_uses_in_noncondname(-1)cilfilefalse|ID_tid->FuncVar.find_uses_in_noncond""idcilfilefalse|AllGlobVar_t->FuncVar.find_uses_in_noncond_all_globcilfilefalse|All_t->FuncVar.find_uses_in_noncond_allcilfilefalse|And_tlist->and_several_lists(List.map(funx->FuncVar.find_uses_in_noncondx(-1)cilfilefalse)list)|Or_tlist->List.flatten(List.map(funx->FuncVar.find_uses_in_noncondx(-1)cilfilefalse)list)letresolve_query_var_usesquerycilfile=matchquery.strwith|Fun_sfunname->resolve_query_var_uses_funquerycilfilefunname|Cond_s->resolve_query_var_uses_condquerycilfile|NonCond_s->resolve_query_var_uses_noncondquerycilfile|None_s->resolve_query_var_uses_nonequerycilfileletresolve_query_var_decl_funquerycilfilefunname=matchquery.tarwith|Name_tname->FuncVar.find_decl_in_funname(-1)funnamecilfile|ID_tid->FuncVar.find_decl_in_fun""idfunnamecilfile|All_t->FuncVar.find_decl_in_fun_allfunnamecilfile|Or_tlist->List.flatten(List.map(funx->FuncVar.find_decl_in_funx(-1)funnamecilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_var_decl_nonequerycilfile=matchquery.tarwith|AllGlobVar_t->FuncVar.find_decl_all_globcilfile|Name_tname->FuncVar.find_declname(-1)cilfile|ID_tid->FuncVar.find_decl""idcilfile|All_t->FuncVar.find_decl_allcilfile|Or_tlist->List.flatten(List.map(funx->FuncVar.find_declx(-1)cilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_var_declquerycilfile=matchquery.strwith|Fun_sfunname->resolve_query_var_decl_funquerycilfilefunname|None_s->resolve_query_var_decl_nonequerycilfile|NonCond_s->resolve_query_var_decl_nonequerycilfile|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_var_defs_funquerycilfilefunname=matchquery.tarwith|Name_tname->FuncVar.find_defs_in_funname(-1)funnamecilfile|ID_tid->FuncVar.find_defs_in_fun""idfunnamecilfile|AllGlobVar_t->FuncVar.find_defs_in_fun_all_globfunnamecilfile|All_t->FuncVar.find_defs_in_fun_allfunnamecilfile|Or_tlist->List.flatten(List.map(funx->FuncVar.find_defs_in_funx(-1)funnamecilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_var_defs_nonequerycilfile=matchquery.tarwith|Name_tname->FuncVar.find_defsname(-1)cilfile|ID_tid->FuncVar.find_defs""idcilfile|AllGlobVar_t->FuncVar.find_defs_all_globcilfile|All_t->FuncVar.find_defs_allcilfile|Or_tlist->List.flatten(List.map(funx->FuncVar.find_defsx(-1)cilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_var_defsquerycilfile=matchquery.strwith|Fun_sfunname->resolve_query_var_defs_funquerycilfilefunname|None_s->resolve_query_var_defs_nonequerycilfile|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_varquerycilfile=matchquery.fwith|Uses_f->resolve_query_var_usesquerycilfile|Decl_f->resolve_query_var_declquerycilfile|Defs_f->resolve_query_var_defsquerycilfile|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_fun_return_nonequerycilfile=matchquery.tarwith|Name_tname->FuncFunction.find_returnsname(-1)cilfile|ID_tid->FuncFunction.find_returns""idcilfile|All_t->FuncFunction.find_returns_allcilfile|Or_tlist->List.flatten(List.map(funx->FuncFunction.find_returnsx(-1)cilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_fun_returnquerycilfile=matchquery.strwith|None_s->resolve_query_fun_return_nonequerycilfile|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_fun_defs_nonequerycilfile=matchquery.tarwith|Name_tname->FuncFunction.find_defname(-1)cilfile|ID_tid->FuncFunction.find_def""idcilfile|All_t->FuncFunction.find_def_allcilfile|Or_tlist->List.flatten(List.map(funx->FuncFunction.find_defx(-1)cilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_fun_defsquerycilfile=matchquery.strwith|None_s->resolve_query_fun_defs_nonequerycilfile|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_fun_uses_nonequerycilfile=matchquery.tarwith|Name_tname->FuncFunction.find_usesname(-1)cilfile|ID_tid->FuncFunction.find_uses""idcilfile|All_t->FuncFunction.find_uses_allcilfile|And_tlist->and_several_lists(List.map(funx->FuncFunction.find_usesx(-1)cilfile)list)|Or_tlist->List.flatten(List.map(funx->FuncFunction.find_usesx(-1)cilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_fun_uses_funquerycilfilefunname=matchquery.tarwith|Name_tname->FuncFunction.find_uses_in_funname(-1)funnamecilfile|ID_tid->FuncFunction.find_uses_in_fun""idfunnamecilfile|All_t->FuncFunction.find_uses_in_fun_allfunnamecilfile|And_tlist->and_several_lists(List.map(funx->FuncFunction.find_uses_in_funx(-1)funnamecilfile)list)|Or_tlist->List.flatten(List.map(funx->FuncFunction.find_uses_in_funx(-1)funnamecilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_fun_uses_condquerycilfile=matchquery.tarwith|Name_tname->FuncFunction.find_uses_condname(-1)cilfile|ID_tid->FuncFunction.find_uses_cond""idcilfile|All_t->FuncFunction.find_uses_allcilfile|And_tlist->and_several_lists(List.map(funx->FuncFunction.find_uses_condx(-1)cilfile)list)|Or_tlist->List.flatten(List.map(funx->FuncFunction.find_uses_condx(-1)cilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_fun_uses_noncondquerycilfile=matchquery.tarwith|Name_tname->FuncFunction.find_uses_noncondname(-1)cilfile|ID_tid->FuncFunction.find_uses_noncond""idcilfile|All_t->FuncFunction.find_uses_noncond_allcilfile|And_tlist->and_several_lists(List.map(funx->FuncFunction.find_uses_noncondx(-1)cilfile)list)|Or_tlist->List.flatten(List.map(funx->FuncFunction.find_uses_noncondx(-1)cilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_fun_usesquerycilfile=matchquery.strwith|None_s->resolve_query_fun_uses_nonequerycilfile|Fun_sfunname->resolve_query_fun_uses_funquerycilfilefunname|Cond_s->resolve_query_fun_uses_condquerycilfile|NonCond_s->resolve_query_fun_uses_noncondquerycilfileletresolve_query_fun_usesvar_funquerycilfilevarnamestrucfunname=matchquery.tarwith|Name_tfunname->FuncFunction.find_usesvar_in_funfunname(-1)strucfunnamevarnamecilfile|ID_tid->FuncFunction.find_usesvar_in_fun""idstrucfunnamevarnamecilfile|All_t->FuncFunction.find_usesvar_in_fun_allstrucfunnamevarnamecilfile|And_tlist->and_several_lists(List.map(funx->FuncFunction.find_usesvar_in_funx(-1)strucfunnamevarnamecilfile)list)|Or_tlist->List.flatten(List.map(funx->FuncFunction.find_usesvar_in_funx(-1)strucfunnamevarnamecilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_fun_usesvar_nonequerycilfilevarname=matchquery.tarwith|Name_tfunname->FuncFunction.find_usesvarfunname(-1)varnamecilfile|ID_tid->FuncFunction.find_usesvar""idvarnamecilfile|All_t->FuncFunction.find_usesvar_allvarnamecilfile|And_tlist->and_several_lists(List.map(funx->FuncFunction.find_usesvarx(-1)varnamecilfile)list)|Or_tlist->List.flatten(List.map(funx->FuncFunction.find_usesvarx(-1)varnamecilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_fun_usesvar_condquerycilfilevarname=matchquery.tarwith|Name_tfunname->FuncFunction.find_usesvar_condfunname(-1)varnamecilfile|ID_tid->FuncFunction.find_usesvar_cond""idvarnamecilfile|All_t->FuncFunction.find_usesvar_cond_allvarnamecilfile|And_tlist->and_several_lists(List.map(funx->FuncFunction.find_usesvar_condx(-1)varnamecilfile)list)|Or_tlist->List.flatten(List.map(funx->FuncFunction.find_usesvar_condx(-1)varnamecilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_fun_usesvar_noncondquerycilfilevarname=matchquery.tarwith|Name_tfunname->FuncFunction.find_usesvar_noncondfunname(-1)varnamecilfile|ID_tid->FuncFunction.find_usesvar_noncond""idvarnamecilfile|All_t->FuncFunction.find_usesvar_noncond_allvarnamecilfile|And_tlist->and_several_lists(List.map(funx->FuncFunction.find_usesvar_noncondx(-1)varnamecilfile)list)|Or_tlist->List.flatten(List.map(funx->FuncFunction.find_usesvar_noncondx(-1)varnamecilfile)list)|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)]letresolve_query_fun_usesvarquerycilfilevarname=matchquery.strwith|Fun_sstrucfunname->resolve_query_fun_usesvar_funquerycilfilevarnamestrucfunname|None_s->resolve_query_fun_usesvar_nonequerycilfilevarname|Cond_s->resolve_query_fun_usesvar_condquerycilfilevarname|NonCond_s->resolve_query_fun_usesvar_noncondquerycilfilevarnameletresolve_query_funquerycilfile=matchquery.fwith|Returns_f->resolve_query_fun_returnquerycilfile|Defs_f->resolve_query_fun_defsquerycilfile|Uses_f->resolve_query_fun_usesquerycilfile|UsesWithVar_fvarname->resolve_query_fun_usesvarquerycilfilevarname|_->Printf.printf"Not supported.\n";[("",loc_default,"",-1)](* Main mapping function *)letmap_queryquerycilfile=lettmp=ifquery.lim!=None_cthenPrintf.printf"Constraint is not supported yet. This parameter will be ignored.\n"else();matchquery.kwith|Datatype_k->resolve_query_datatypequerycilfile|Var_k->resolve_query_varquerycilfile|Fun_k->resolve_query_funquerycilfileinlethashtbl=Hashtbl.create(List.lengthtmp)indelete_duplicatestmphashtbl