bookshelf-doc/DocGen4/Process/InstanceInfo.lean

46 lines
1.5 KiB
Plaintext
Raw Permalink Normal View History

/-
Copyright (c) 2022 Henrik Böving. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Henrik Böving
-/
import Lean
import DocGen4.Process.Base
import DocGen4.Process.NameInfo
import DocGen4.Process.DefinitionInfo
namespace DocGen4.Process
2022-07-23 13:40:08 +00:00
open Lean Meta
def getInstanceTypes (typ : Expr) : MetaM (Array Name) := do
let (_, _, tail) ← forallMetaTelescopeReducing typ
let args := tail.getAppArgs
let (_, bis, _) ← forallMetaTelescopeReducing (← inferType tail.getAppFn)
let (_, names) ← (bis.zip args).mapM findName |>.run .empty
2022-11-20 10:47:53 +00:00
return names
2022-07-23 13:40:08 +00:00
where
findName : BinderInfo × Expr → StateRefT (Array Name) MetaM Unit
| (.default, .sort .zero) => modify (·.push "_builtin_prop")
| (.default, .sort (.succ _)) => modify (·.push "_builtin_typeu")
| (.default, .sort _) => modify (·.push "_builtin_sortu")
| (.default, e) =>
match e.getAppFn with
| .const name .. => modify (·.push name)
| _ => return ()
| _ => return ()
def InstanceInfo.ofDefinitionVal (v : DefinitionVal) : MetaM InstanceInfo := do
2022-07-23 11:37:17 +00:00
let mut info ← DefinitionInfo.ofDefinitionVal v
2023-09-18 20:54:37 +00:00
let some className ← isClass? v.type | panic! s!"isClass? on {v.name} returned none"
if let some instAttr ← getDefaultInstance v.name className then
2022-07-23 11:37:17 +00:00
info := { info with attrs := info.attrs.push instAttr }
2022-07-23 13:40:08 +00:00
let typeNames ← getInstanceTypes v.type
2022-11-20 10:47:53 +00:00
return {
2022-07-23 11:37:17 +00:00
toDefinitionInfo := info,
2022-07-23 13:40:08 +00:00
className,
typeNames
2022-07-23 11:37:17 +00:00
}
end DocGen4.Process