import Lean /-- Foo structure is just a test -/ structure Foo where /-- main name -/ name : String := "hello" /-- documentation for the second field -/ val : Nat := 0 /-- documenting test axiom -/ axiom myAxiom : Nat structure Boo (α : Type) where /-- Boo constructor has a custom name -/ makeBoo :: /-- Boo.x docString -/ x : Nat y : Bool /-- inductive datatype Tree documentation -/ inductive Tree (α : Type) where /-- Tree.node documentation -/ | node : List (Tree α) → Tree α /-- Tree.leaf stores the values -/ | leaf : α → Tree α namespace Bla /-- documenting definition in namespace -/ def test (x : Nat) : Nat := aux x + 1 where /-- We can document 'where' functions too ... and indentation is stripped, even after an empty line. -/ aux x := x + 2 end Bla def f (x : Nat) : IO Nat := do let rec /-- let rec documentation at f -/ foo | 0 => 1 | x+1 => foo x + 2 return foo x def g (x : Nat) : Nat := let rec /-- let rec documentation at g -/ foo | 0 => 1 | x+1 => foo x + 2 foo x open Lean def printDocString (declName : Name) : MetaM Unit := do match (← findDocString? (← getEnv) declName) with | some docStr => IO.println (repr docStr) | none => IO.println s!"doc string for '{declName}' is not available" def printDocStringTest : MetaM Unit := do printDocString `Foo printDocString `Foo.name printDocString `Foo.val printDocString `myAxiom printDocString `Boo printDocString `Boo.makeBoo printDocString `Boo.x printDocString `Boo.y printDocString `Tree printDocString `Tree.node printDocString `Tree.leaf printDocString `Bla.test printDocString `Bla.test.aux printDocString `f printDocString `f.foo printDocString `g printDocString `g.foo printDocString `optParam printDocString `namedPattern printDocString `Lean.Meta.forallTelescopeReducing #eval printDocStringTest def printRanges (declName : Name) : MetaM Unit := do match (← findDeclarationRanges? declName) with | some range => IO.println f!"{declName} :={Std.Format.indentD <| repr range}" | none => IO.println s!"range for '{declName}' is not available" def printRangesTest : MetaM Unit := do printRanges `Foo printRanges `Foo.name printRanges `Foo.val printRanges `myAxiom printRanges `Boo printRanges `Boo.makeBoo printRanges `Boo.x printRanges `Boo.y printRanges `Tree printRanges `Tree.rec printRanges `Tree.casesOn printRanges `Tree.node printRanges `Tree.leaf printRanges `Bla.test printRanges `Bla.test.aux printRanges `f printRanges `f.foo printRanges `g printRanges `g.foo #eval printRangesTest /-- no dice -/ add_decl_doc Nat.add