123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100(************************************************************************)(* * The Coq Proof Assistant / The Coq Development Team *)(* v * Copyright INRIA, CNRS and contributors *)(* <O___,, * (see version control and CREDITS file for authors & dates) *)(* VV/ **************************************************************)(* // * This file is distributed under the terms of the *)(* * GNU Lesser General Public License Version 2.1 *)(* * (see LICENSE file for the text of the license) *)(************************************************************************)(************************************************************************)(* coq-lsp / SerAPI *)(************************************************************************)(* Copyright 2016-2019 MINES ParisTech -- License LGPL 2.1+ *)(* Copyright 2019-2024 Inria -- License LGPL 2.1+ *)(* Written by: Emilio J. Gallego Arias and others *)(************************************************************************)[@@@ocamlformat"disable"]letlist_lastl=List.(nthl(lengthl-1))letnot_available_warnfl_pkginfo=Feedback.msg_warningPp.(str"Serlib plugin: "++strfl_pkg++str" is not available"++strinfo++str"."++fnl()++str"Incremental checking for commands in this plugin will be impacted.")letcheck_package_existsfl_pkg=trylet_=Findlib.package_directoryfl_pkginSomefl_pkgwith|Findlib.No_such_package(_,info)->not_available_warnfl_pkginfo;None(* Should improve *)letmap_serlibfl_pkg=letsupported=matchfl_pkgwith(* Supported by serlib *)(* directory *)|"coq-core.plugins.btauto"(* btauto *)|"coq-core.plugins.cc_core"(* cc_core *)|"coq-core.plugins.cc"(* cc *)|"coq-core.plugins.extraction"(* extraction *)|"coq-core.plugins.firstorder_core"(* firstorder_core *)|"coq-core.plugins.firstorder"(* firstorder *)|"coq-core.plugins.funind"(* funind *)|"coq-core.plugins.ltac"(* ltac *)|"coq-core.plugins.ltac2"(* ltac2 *)|"coq-core.plugins.micromega"(* micromega *)|"coq-core.plugins.micromega_core"(* micromega_core *)|"coq-core.plugins.ring"(* ring *)|"coq-core.plugins.ssreflect"(* ssreflect *)|"coq-core.plugins.ssrmatching"(* ssrmatching *)|"coq-core.plugins.number_string_notation"(* syntax *)|"coq-core.plugins.tauto"(* tauto *)|"coq-core.plugins.zify"(* zify *)->true|_->not_available_warnfl_pkg": serlib support is missing";falseinifsupportedthenletplugin_name=String.split_on_char'.'fl_pkg|>list_lastinletserlib_name="coq-serapi.serlib."^plugin_nameincheck_package_existsserlib_nameelseNone(* We used to be liberal here in the case a SerAPI plugin was not available.
This proved to be a bad choice as Coq got confused when plugin loading
failed. Par-contre, we now need to make the list in `map_serlib` open, so
plugins can register whether they support serialization. I'm afraid that'll
have to happen via the finlib database as we cannot load anticipatedly a
plugin that may not exist. *)letsafe_loaderloaderfl_pkg=tryloader[fl_pkg]withexn->letiexn=Exninfo.captureexninletexn_msg=CErrors.iprintiexninFeedback.msg_warningPp.(str"Loading findlib plugin: "++strfl_pkg++str"failed"++fnl()++exn_msg);Exninfo.iraiseiexnletdefault_loaderpkgs:unit=Fl_dynload.load_packages~debug:falsepkgsletplugin_handleruser_loader=letloader=Option.defaultdefault_loaderuser_loaderinletsafe_loader=safe_loaderloaderinfunfl_pkg->let_,fl_pkg=Mltop.PluginSpec.reprfl_pkginmatchmap_serlibfl_pkgwith|Someserlib_pkg->safe_loaderserlib_pkg|None->safe_loaderfl_pkg