| import Lean | |
| /-! | |
| Tests that Verso docstrings on `class` declarations can use the class as a type class. | |
| See https://github.com/leanprover/lean4/issues/11651 | |
| -/ | |
| set_option doc.verso true | |
| /-- | |
| {name}`Foo` is a type class. | |
| ```lean | |
| instance : Foo := ⟨0, 1⟩ | |
| example [Foo] : Unit := () | |
| example : Nat := Foo.x | |
| ``` | |
| -/ | |
| class Foo where | |
| /-- | |
| Docs! | |
| ```lean | |
| def x [Foo] : String := "abc" | |
| /-- | |
| error: failed to synthesize instance of type class | |
| Foo | |
| Hint: Type class instance resolution failures can be inspected with the `set_option trace.Meta.synthInstance true` command. | |
| -/ | |
| #guard_msgs (whitespace := lax) in | |
| #eval x | |
| /-- info: "abc" -/ | |
| #guard_msgs in | |
| #eval have : Foo := .mk 0 1; x | |
| ``` | |
| -/ | |
| mk :: | |
| x : Nat | |
| /-- | |
| Uses {name}`Foo` as a class: | |
| ```lean | |
| example [Foo] : Nat := Foo.y | |
| ``` | |
| -/ | |
| y : Nat | |
| open Lean Elab Command in | |
| def printVersoDocstring (name : Name) : CommandElabM Unit := do | |
| match (← findInternalDocString? (← getEnv) name) with | |
| | none => IO.println s!"No docstring for {name}" | |
| | some (.inl md) => IO.println s!"Markdown:\n{md}" | |
| | some (.inr v) => IO.println (repr v.text); IO.println (repr v.subsections) | |
| /-- | |
| info: #[Lean.Doc.Block.para | |
| #[Lean.Doc.Inline.other { val := Dynamic.mk `Lean.Doc.Data.Const _ } #[Lean.Doc.Inline.code "Foo"], | |
| Lean.Doc.Inline.text " is a type class."], | |
| Lean.Doc.Block.other | |
| { val := Dynamic.mk `Lean.Doc.Data.LeanBlock _ } | |
| #[Lean.Doc.Block.code "instance : Foo := ⟨0, 1⟩\nexample [Foo] : Unit := ()\nexample : Nat := Foo.x\n"]] | |
| #[] | |
| -/ | |
| #guard_msgs in | |
| #eval printVersoDocstring ``Foo | |
| /-- info: No docstring for Foo.x -/ | |
| #guard_msgs in | |
| #eval printVersoDocstring ``Foo.x | |
| /-- | |
| info: #[Lean.Doc.Block.para | |
| #[Lean.Doc.Inline.text "Uses ", | |
| Lean.Doc.Inline.other { val := Dynamic.mk `Lean.Doc.Data.Const _ } #[Lean.Doc.Inline.code "Foo"], | |
| Lean.Doc.Inline.text " as a class:"], | |
| Lean.Doc.Block.other | |
| { val := Dynamic.mk `Lean.Doc.Data.LeanBlock _ } | |
| #[Lean.Doc.Block.code "example [Foo] : Nat := Foo.y\n"]] | |
| #[] | |
| -/ | |
| #guard_msgs in | |
| #eval printVersoDocstring ``Foo.y |