123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127typet=Vernacstate.t(* EJGA: This requires patches to Coq, they are in the lsp_debug branch
let any_out oc (a : Summary.Frozen.any) = (* let (Summary.Frozen.Any (tag,
_value)) = a in *) (* let name = Summary.Dyn.repr tag in *) (*
Lsp.Io.log_error "marshall" name; *) Marshal.to_channel oc a []
let _frozen_out oc (s : Summary.Frozen.t) = Summary.Frozen.iter (any_out oc)
s
let summary_out oc (s : Summary.frozen) = let { Summary.summaries; ml_module
} = s in (* frozen_out oc summaries; *) Marshal.to_channel oc summaries [];
Marshal.to_channel oc ml_module []; ()
let summary_in ic : Summary.frozen = let summaries = Marshal.from_channel ic
in let ml_module = Marshal.from_channel ic in { Summary.summaries; ml_module
}
let system_out oc ((l : Lib.frozen), (s : Summary.frozen)) = (* Both parts of
system have functional values !! Likely due to Lib.frozen having a
Summary.frozen inside? *) Marshal.to_channel oc l [ Closures ]; summary_out
oc s; ()
let system_in ic : Vernacstate.System.t = let l : Lib.frozen =
Marshal.from_channel ic in let s : Summary.frozen = summary_in ic in (l, s)
let _marshal_out oc st = let { Vernacstate.parsing; system; lemmas; program;
opaques; shallow } = st in Marshal.to_channel oc parsing []; system_out oc
system; (* lemmas doesn't !! *) Marshal.to_channel oc lemmas [];
Marshal.to_channel oc program []; Marshal.to_channel oc opaques [];
Marshal.to_channel oc shallow []; ()
let _marshal_in ic = let parsing = Marshal.from_channel ic in let system =
system_in ic in let lemmas = Marshal.from_channel ic in let program =
Marshal.from_channel ic in let opaques = Marshal.from_channel ic in let
shallow = Marshal.from_channel ic in { Vernacstate.parsing; system; lemmas;
program; opaques; shallow } *)letmarshal_inic:t=Marshal.from_channelicletmarshal_outocst=Marshal.to_channelocst[]letof_coqx=xletto_coqx=x(* let compare x y = compare x y *)letcompare(x:t)(y:t)=letopenVernacstateinlet{synterp={parsing=p1;system=ss1};interp={system=is1;lemmas=l1;program=g1;opaques=o1}}=xinlet{synterp={parsing=p2;system=ss2};interp={system=is2;lemmas=l2;program=g2;opaques=o2}}=yinifp1==p2&&ss1==ss2&&is1==is2&&l1==l2&&g1==g2&&o1==o2then0else1letequalxy=comparexy=0lethashx=Hashtbl.hashxletmode~st=Option.map(fun_->Synterp.get_default_proof_mode())st.Vernacstate.interp.lemmasletparsing~st=st.Vernacstate.synterp.parsingmoduleProof_=ProofmoduleProof=structtypet=Vernacstate.LemmaStack.tletto_coqx=xendletlemmas~st=st.Vernacstate.interp.lemmasletprogram~st=NeList.headst.Vernacstate.interp.program|>Declare.OblState.viewletdrop_proofs~st=letopenVernacstateinletinterp={st.interpwithlemmas=Option.cata(funs->snd@@Vernacstate.LemmaStack.pops)Nonest.interp.lemmas}in{stwithinterp}letin_state~st~fa=letfa=Vernacstate.unfreeze_full_statest;fainProtect.eval~faletadmit~st()=let()=Vernacstate.unfreeze_full_statestinmatchst.Vernacstate.interp.lemmaswith|None->st|Somelemmas->letpm=NeList.headst.Vernacstate.interp.programinletproof,lemmas=Vernacstate.(LemmaStack.poplemmas)inletpm=Declare.Proof.save_admitted~pm~proofinletprogram=NeList.map_head(fun_->pm)st.Vernacstate.interp.programinletst=Vernacstate.freeze_full_state()in{stwithinterp={st.interpwithlemmas;program}}letadmit~st=Protect.eval~f:(admit~st)()letadmit_goal~st()=let()=Vernacstate.unfreeze_full_statestinmatchst.Vernacstate.interp.lemmaswith|None->st|Somelemmas->letfpf=Declare.Proof.byProofview.give_uppf|>fstinletlemmas=Some(Vernacstate.LemmaStack.map_top~flemmas)in{stwithinterp={st.interpwithlemmas}}letadmit_goal~st=Protect.eval~f:(admit_goal~st)()