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
88 lines
2.2 KiB
Text
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
|