1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162(************************************************************************)(* * The Coq Proof Assistant / The Coq Development Team *)(* v * INRIA, CNRS and contributors - Copyright 1999-2018 *)(* <O___,, * (see CREDITS file for the list of authors) *)(* \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 Language Server Protocol *)(* Copyright 2016-2019 MINES ParisTech -- Dual License LGPL 2.1 / GPL3+ *)(* Copyright 2019-2024 Inria -- Dual License LGPL 2.1 / GPL3+ *)(* Written by: Emilio J. Gallego Arias *)(************************************************************************)(* Taken from sertop / Coq *)letensure_no_pending_proofs~in_file~st=matchst.Vernacstate.interp.lemmaswith|Somelemmas->letpfs=Vernacstate.LemmaStack.get_all_proof_nameslemmasinCErrors.user_errPp.(str"There are pending proofs in file "++strin_file++str": "++(pfs|>List.rev|>prlist_with_seppr_commaNames.Id.print)++str".")|None->letpm=st.Vernacstate.interp.programinletwhat_for=Pp.str("file "^in_file)inNeList.iter(funpm->Declare.Obls.check_solved_obligations~what_for~pm)pmletensure_out_dirfile=letrecmkdir_pdir=ifnot(Sys.file_existsdir)then(mkdir_p(Filename.dirnamedir);Unix.mkdirdir0o755)inmkdir_p(Filename.dirnamefile)letsave_vo~st~ldirin_file=letst=State.to_coqstinlet()=ensure_no_pending_proofs~in_file~stinletout_vo=Filename.(remove_extensionin_file)^".vo"inletoutput_native_objects=falseinlettodo_proofs=Library.ProofsTodoNonein(* In some cases, such as in web-worker contexts, the output .vo directory may
not exist on the virtual worker filesystem, so we ensure the .vo creation
won't fail because of this. Note that this is really a hack and could have
security implications, a proper worker filesystem should be implemented
instead. *)let()=ensure_out_dirout_voinlet()=Library.save_library_totodo_proofs~output_native_objectsldirout_voin()letsave_vo~token~st~ldir~in_file=Protect.eval~token~f:(save_vo~st~ldir)in_file