feat: Show arguments of types of decls separately

main
Henrik Böving 2021-12-25 16:55:30 +01:00
parent 5e0956c4b0
commit 02d8c528d9
2 changed files with 54 additions and 3 deletions

View File

@ -49,6 +49,24 @@ partial def infoFormatToHtml (i : CodeWithInfos) : HtmlM (Array Html) := do
#[Html.element "span" true #[("class", "fn")] (←infoFormatToHtml t)] #[Html.element "span" true #[("class", "fn")] (←infoFormatToHtml t)]
| _ => #[Html.element "span" true #[("class", "fn")] (←infoFormatToHtml t)] | _ => #[Html.element "span" true #[("class", "fn")] (←infoFormatToHtml t)]
def argToHtml (arg : Arg) : HtmlM Html := do
let (l, r, implicit) := match arg.binderInfo with
| BinderInfo.default => ("(", ")", false)
| BinderInfo.implicit => ("{", "}", true)
| BinderInfo.strictImplicit => ("⦃", "⦄", true)
| BinderInfo.instImplicit => ("[", "]", true)
-- TODO: Can this ever be reached here? What does it mean?
| BinderInfo.auxDecl => unreachable!
let mut nodes := #[Html.text s!"{l}{arg.name.toString} : "]
nodes := nodes.append (←infoFormatToHtml arg.type)
nodes := nodes.push r
let inner := Html.element "span" true #[("class", "fn")] nodes
let html := Html.element "span" false #[("class", "decl_args")] #[inner]
if implicit then
<span «class»="impl_arg">{html}</span>
else
html
def docInfoHeader (doc : DocInfo) : HtmlM Html := do def docInfoHeader (doc : DocInfo) : HtmlM Html := do
let mut nodes := #[] let mut nodes := #[]
-- TODO: noncomputable, partial -- TODO: noncomputable, partial
@ -61,7 +79,8 @@ def docInfoHeader (doc : DocInfo) : HtmlM Html := do
{doc.getName.toString} {doc.getName.toString}
</a> </a>
</span> </span>
-- TODO: Figure out how we can get explicit, implicit and TC args and put them here for arg in doc.getArgs do
nodes := nodes.push (←argToHtml arg)
nodes := nodes.push <span «class»="decl_args">:</span> nodes := nodes.push <span «class»="decl_args">:</span>
nodes := nodes.push $ Html.element "div" true #[("class", "decl_type")] (←infoFormatToHtml doc.getType) nodes := nodes.push $ Html.element "div" true #[("class", "decl_type")] (←infoFormatToHtml doc.getType)
-- TODO: The final type of the declaration -- TODO: The final type of the declaration

View File

@ -20,7 +20,13 @@ structure NameInfo where
type : CodeWithInfos type : CodeWithInfos
deriving Inhabited deriving Inhabited
structure Arg where
name : Name
type : CodeWithInfos
binderInfo : BinderInfo
structure Info extends NameInfo where structure Info extends NameInfo where
args : Array Arg
doc : Option String doc : Option String
declarationRange : DeclarationRange declarationRange : DeclarationRange
deriving Inhabited deriving Inhabited
@ -89,6 +95,20 @@ structure Module where
members : Array DocInfo members : Array DocInfo
deriving Inhabited deriving Inhabited
partial def typeToArgsType (e : Expr) : (Array (Name × Expr × BinderInfo) × Expr) :=
match e.consumeMData with
| Expr.lam name type body data =>
let name := name.eraseMacroScopes
let arg := (name, type, data.binderInfo)
let (args, final) := typeToArgsType (Expr.instantiate1 body (mkFVar ⟨name⟩))
(#[arg] ++ args, final)
| Expr.forallE name type body data =>
let name := name.eraseMacroScopes
let arg := (name, type, data.binderInfo)
let (args, final) := typeToArgsType (Expr.instantiate1 body (mkFVar ⟨name⟩))
(#[arg] ++ args, final)
| _ => (#[], e)
def prettyPrintTerm (expr : Expr) : MetaM CodeWithInfos := do def prettyPrintTerm (expr : Expr) : MetaM CodeWithInfos := do
let (fmt, infos) ← formatInfos expr let (fmt, infos) ← formatInfos expr
let tt := TaggedText.prettyTagged fmt let tt := TaggedText.prettyTagged fmt
@ -104,11 +124,13 @@ def prettyPrintTerm (expr : Expr) : MetaM CodeWithInfos := do
def Info.ofConstantVal (v : ConstantVal) : MetaM Info := do def Info.ofConstantVal (v : ConstantVal) : MetaM Info := do
let env ← getEnv let env ← getEnv
let t ← prettyPrintTerm v.type let (args, type) := typeToArgsType v.type
let type ← prettyPrintTerm type
let args ← args.mapM (λ (n, e, b) => do Arg.mk n (←prettyPrintTerm e) b)
let doc ← findDocString? env v.name let doc ← findDocString? env v.name
match ←findDeclarationRanges? v.name with match ←findDeclarationRanges? v.name with
-- TODO: Maybe selection range is more relevant? Figure this out in the future -- TODO: Maybe selection range is more relevant? Figure this out in the future
| some range => return Info.mk ⟨v.name, t⟩ doc range.range | some range => return Info.mk ⟨v.name, type args doc range.range
| none => panic! s!"{v.name} is a declaration without position" | none => panic! s!"{v.name} is a declaration without position"
def AxiomInfo.ofAxiomVal (v : AxiomVal) : MetaM AxiomInfo := do def AxiomInfo.ofAxiomVal (v : AxiomVal) : MetaM AxiomInfo := do
@ -274,6 +296,16 @@ def getType : DocInfo → CodeWithInfos
| structureInfo i => i.type | structureInfo i => i.type
| classInfo i => i.type | classInfo i => i.type
def getArgs : DocInfo → Array Arg
| axiomInfo i => i.args
| theoremInfo i => i.args
| opaqueInfo i => i.args
| definitionInfo i => i.args
| instanceInfo i => i.args
| inductiveInfo i => i.args
| structureInfo i => i.args
| classInfo i => i.args
end DocInfo end DocInfo
structure AnalyzerResult where structure AnalyzerResult where