From e47321100938852afffd41c3c882ba637662d354 Mon Sep 17 00:00:00 2001
From: Parth Shastri <31370288+cppio@users.noreply.github.com>
Date: Tue, 17 Dec 2024 08:46:50 -0500
Subject: [PATCH] feat: show inductive constructor argument names (#249)
* feat: show inductive constructor argument names
* refactor: move argToHtml to DocGen4.Output.Arg
---
DocGen4/Output/Arg.lean | 22 ++++++++++++++++++++++
DocGen4/Output/Inductive.lean | 8 +++++---
DocGen4/Output/Module.lean | 13 -------------
DocGen4/Process/Base.lean | 12 ++++++------
DocGen4/Process/InductiveInfo.lean | 8 +-------
static/style.css | 2 +-
6 files changed, 35 insertions(+), 30 deletions(-)
create mode 100644 DocGen4/Output/Arg.lean
diff --git a/DocGen4/Output/Arg.lean b/DocGen4/Output/Arg.lean
new file mode 100644
index 00000000..3d1c66c5
--- /dev/null
+++ b/DocGen4/Output/Arg.lean
@@ -0,0 +1,22 @@
+import DocGen4.Output.Base
+
+namespace DocGen4
+namespace Output
+
+open scoped DocGen4.Jsx
+
+/--
+Render an `Arg` as HTML, adding opacity effects etc. depending on what
+type of binder it has.
+-/
+def argToHtml (arg : Process.Arg) : HtmlM Html := do
+ let node ← infoFormatToHtml arg.binder
+ let inner := [node]
+ let html := Html.element "span" false #[("class", "decl_args")] #[inner]
+ if arg.implicit then
+ return {html}
+ else
+ return html
+
+end Output
+end DocGen4
diff --git a/DocGen4/Output/Inductive.lean b/DocGen4/Output/Inductive.lean
index ead0e067..042c8aa5 100644
--- a/DocGen4/Output/Inductive.lean
+++ b/DocGen4/Output/Inductive.lean
@@ -1,3 +1,4 @@
+import DocGen4.Output.Arg
import DocGen4.Output.Template
import DocGen4.Output.DocString
import DocGen4.Process
@@ -15,20 +16,21 @@ def instancesForToHtml (typeName : Name) : BaseHtmlM Html := do
-def ctorToHtml (c : Process.NameInfo) : HtmlM Html := do
+def ctorToHtml (c : Process.ConstructorInfo) : HtmlM Html := do
let shortName := c.name.componentsRev.head!.toString
let name := c.name.toString
+ let args ← c.args.mapM argToHtml
if let some doc := c.doc then
let renderedDoc ← docStringToHtml doc name
pure
- {shortName} : [← infoFormatToHtml c.type]
+ {shortName} [args] {" : "} [← infoFormatToHtml c.type]
[renderedDoc]
else
pure
- {shortName} : [← infoFormatToHtml c.type]
+ {shortName} [args] {" : "} [← infoFormatToHtml c.type]
def inductiveToHtml (i : Process.InductiveInfo) : HtmlM (Array Html) := do
diff --git a/DocGen4/Output/Module.lean b/DocGen4/Output/Module.lean
index 71b52785..3386e6ce 100644
--- a/DocGen4/Output/Module.lean
+++ b/DocGen4/Output/Module.lean
@@ -20,19 +20,6 @@ namespace Output
open scoped DocGen4.Jsx
open Lean Process
-/--
-Render an `Arg` as HTML, adding opacity effects etc. depending on what
-type of binder it has.
--/
-def argToHtml (arg : Arg) : HtmlM Html := do
- let node ← infoFormatToHtml arg.binder
- let inner := [node]
- let html := Html.element "span" false #[("class", "decl_args")] #[inner]
- if arg.implicit then
- return {html}
- else
- return html
-
/--
Render the structures this structure extends from as HTML so it can be
added to the top level.
diff --git a/DocGen4/Process/Base.lean b/DocGen4/Process/Base.lean
index 9e395ebc..6395f2f6 100644
--- a/DocGen4/Process/Base.lean
+++ b/DocGen4/Process/Base.lean
@@ -117,6 +117,11 @@ structure InstanceInfo extends DefinitionInfo where
typeNames : Array Name
deriving Inhabited
+/--
+Information about a constructor of an inductive type
+-/
+abbrev ConstructorInfo := Info
+
/--
Information about an `inductive` declaration
-/
@@ -124,7 +129,7 @@ structure InductiveInfo extends Info where
/--
List of all constructors of this inductive type.
-/
- ctors : List NameInfo
+ ctors : List ConstructorInfo
isUnsafe : Bool
deriving Inhabited
@@ -166,11 +171,6 @@ Information about a `class inductive` declaration.
abbrev ClassInductiveInfo := InductiveInfo
-/--
-Information about a constructor of an inductive type
--/
-abbrev ConstructorInfo := Info
-
/--
A general type for informations about declarations.
-/
diff --git a/DocGen4/Process/InductiveInfo.lean b/DocGen4/Process/InductiveInfo.lean
index 1c27a1d0..ebd111a4 100644
--- a/DocGen4/Process/InductiveInfo.lean
+++ b/DocGen4/Process/InductiveInfo.lean
@@ -12,15 +12,9 @@ namespace DocGen4.Process
open Lean Meta
-def getConstructorType (ctor : Name) : MetaM Expr := do
- let env ← getEnv
- match env.find? ctor with
- | some (ConstantInfo.ctorInfo i) => pure i.type
- | _ => panic! s!"Constructor {ctor} was requested but does not exist"
-
def InductiveInfo.ofInductiveVal (v : InductiveVal) : MetaM InductiveInfo := do
let info ← Info.ofConstantVal v.toConstantVal
- let ctors ← v.ctors.mapM (fun name => do NameInfo.ofTypedName name (← getConstructorType name))
+ let ctors ← v.ctors.mapM (fun name => do Info.ofConstantVal (← getConstInfoCtor name).toConstantVal)
return {
toInfo := info,
ctors,
diff --git a/static/style.css b/static/style.css
index 5817520e..1e7c1da9 100644
--- a/static/style.css
+++ b/static/style.css
@@ -753,7 +753,7 @@ a:hover {
transition: opacity 300ms ease-in;
}
-.decl_header:not(:hover) .impl_arg {
+.decl_header:not(:hover) .impl_arg, .constructor:not(:hover) .impl_arg {
opacity: 30%;
transition: opacity 1000ms ease-out;
}