lean4-htt/tests/playground/reelab.lean
Leonardo de Moura 17b6957f6c chore: fix tests
2020-05-26 15:05:01 -07:00

42 lines
2 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Lean
open Lean
open Lean.Elab
open Lean.Elab.Term
instance : HasMonadLift MetaM MetaIO :=
⟨fun α x ⟨env, opts⟩ => Prod.fst <$> IO.runMeta x env { opts := opts }⟩
private def liftTermElabMSimple {α} (elab : TermElabM α) : MetaM (Except MessageLog α) := do
ctx ← read;
st ← get;
match elab { ctx with fileName := "<delaborator>", fileMap := arbitrary _, cmdPos := 0, currNamespace := Name.anonymous } { st with } with
| EStateM.Result.ok a newS => if !newS.messages.hasErrors then pure (Except.ok a) else pure (Except.error newS.messages)
| EStateM.Result.error (Term.Exception.ex (Exception.error msg)) newS => pure (Except.error $ MessageLog.empty.add msg)
| EStateM.Result.error _ newS => unreachable!
#eval show MetaIO Unit from do
opts ← MetaIO.getOptions;
let stx := Unhygienic.run `(id $ @pure (fun _ => Nat) ⟨fun x => 0⟩ _ (id false));
IO.println $ "syntax input: " ++ stx.reprint.get!;
Except.ok e ← liftM $ liftTermElabMSimple $ elabTermAndSynthesize stx none
| throw $ IO.userError "failed to elaborate?";
IO.println $ "elaboration output: " ++ toString e;
stx ← liftM $ delab e opts;
IO.println $ "delaboration output: " ++ stx.reprint.get!;
Except.error msgs ← liftM $ liftTermElabMSimple $ elabTermAndSynthesize stx none
| throw $ IO.userError "succeeded to elaborate?";
IO.println $ "re-elaboration output:";
msgs.forM IO.println;
let posOpts : OptionsPerPos := {};
let posOpts := msgs.toList.foldl (fun (posOpts : OptionsPerPos) msg =>
let opts := KVMap.empty.insert `pp.explicit true;
posOpts.insert msg.pos.column opts) posOpts;
stx ← liftM $ delab e opts posOpts;
IO.println $ "delaboration output after applying pp.explicit to error locations: " ++ stx.reprint.get!;
Except.ok e' ← liftM $ liftTermElabMSimple $ elabTermAndSynthesize stx none
| throw $ IO.userError "failed to elaborate?";
IO.println $ "new re-elaboration output: " ++ toString e';
condM (liftM (Meta.isDefEq e e'))
(IO.println "terms are defeq!")
(throw $ IO.userError "terms are not defeq?");
pure ()