lean4-htt/src/Lean/Util/PPExt.lean
2020-12-21 15:03:27 -08:00

74 lines
2.5 KiB
Text

/-
Copyright (c) 2020 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
-/
import Lean.Environment
import Lean.Syntax
import Lean.MetavarContext
import Lean.Data.OpenDecl
namespace Lean
builtin_initialize
registerOption `pp.raw { defValue := false, group := "pp", descr := "(pretty printer) print raw expression/syntax tree" }
registerOption `pp.raw.showInfo { defValue := false, group := "pp", descr := "(pretty printer) print `SourceInfo` metadata with raw printer" }
registerOption `pp.raw.maxDepth { defValue := (32 : Nat), group := "pp", descr := "(pretty printer) maximum `Syntax` depth for raw printer" };
def getSyntaxMaxDepth (opts : Options) : Nat :=
opts.getNat `pp.raw.maxDepth 32
def getPPRaw (opts : Options) : Bool :=
opts.getBool `pp.raw false
def getPPRawShowInfo (opts : Options) : Bool :=
opts.getBool `pp.raw.showInfo false
structure PPContext where
env : Environment
mctx : MetavarContext := {}
lctx : LocalContext := {}
opts : Options := {}
currNamespace : Name := Name.anonymous
openDecls : List OpenDecl := []
structure PPFns where
ppExpr : PPContext → Expr → IO Format
ppTerm : PPContext → Syntax → IO Format
ppGoal : PPContext → MVarId → IO Format
instance : Inhabited PPFns := ⟨⟨arbitrary, arbitrary, arbitrary⟩⟩
builtin_initialize ppFnsRef : IO.Ref PPFns ←
IO.mkRef {
ppExpr := fun ctx e => return format (toString e),
ppTerm := fun ctx stx => return stx.formatStx (getSyntaxMaxDepth ctx.opts)
ppGoal := fun ctx mvarId => return "goal"
}
builtin_initialize ppExt : EnvExtension PPFns ←
registerEnvExtension ppFnsRef.get
def ppExpr (ctx : PPContext) (e : Expr) : IO Format := do
let e := ctx.mctx.instantiateMVars e |>.1
if getPPRaw ctx.opts then
return format (toString e)
else
try
ppExt.getState ctx.env |>.ppExpr ctx e
catch ex =>
pure f!"[Error pretty printing expression: {ex}. Falling back to raw printer.]{Format.line}{e}"
def ppTerm (ctx : PPContext) (stx : Syntax) : IO Format :=
if getPPRaw ctx.opts then
return stx.formatStx (getSyntaxMaxDepth ctx.opts) (getPPRawShowInfo ctx.opts)
else
try
ppExt.getState ctx.env |>.ppTerm ctx stx
catch ex =>
pure f!"[Error pretty printing syntax: {ex}. Falling back to raw printer.]{Format.line}{stx}"
def ppGoal (ctx : PPContext) (mvarId : MVarId) : IO Format :=
ppExt.getState ctx.env |>.ppGoal ctx mvarId
end Lean