lean4-htt/tests/lean/run/versoDocClass.lean
David Thrane Christiansen 2a02685d95
fix: make classes appear as classes rather than structures in docs (#12373)
This PR moves the elaboration of structure/class Verso docstrings until
after the fact that it's a class is registered, so code samples in the
docstring can use it as a class. Redundant addition of structure and
constructor docstrings are also removed, because they're already handled
in MutualInductive.lean.

Closes #11651
2026-02-07 13:06:41 +00:00

88 lines
2.2 KiB
Text

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
{ name := `Lean.Doc.Data.Const val := Dynamic.mk `Lean.Doc.Data.Const _ }
#[Lean.Doc.Inline.code "Foo"],
Lean.Doc.Inline.text " is a type class."],
Lean.Doc.Block.other
{ name := `Lean.Doc.Data.LeanBlock 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
{ name := `Lean.Doc.Data.Const val := Dynamic.mk `Lean.Doc.Data.Const _ }
#[Lean.Doc.Inline.code "Foo"],
Lean.Doc.Inline.text " as a class:"],
Lean.Doc.Block.other
{ name := `Lean.Doc.Data.LeanBlock val := Dynamic.mk `Lean.Doc.Data.LeanBlock _ }
#[Lean.Doc.Block.code "example [Foo] : Nat := Foo.y\n"]]
#[]
-/
#guard_msgs in
#eval printVersoDocstring ``Foo.y