/- 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 namespace DocGen4.Process open Lean Widget Meta /-- Stores information about a typed name. -/ structure NameInfo where /-- The name that has this info attached. -/ name : Name /-- The pretty printed type of this name. -/ type : CodeWithInfos /-- The doc string of the name if it exists. -/ doc : Option String deriving Inhabited /-- An argument to a declaration, e.g. the `(x : Nat)` in `def foo (x : Nat) := x`. -/ structure Arg where /-- The name of the argument. For auto generated argument names like `[Monad α]` this is none -/ name : Option Name /-- The pretty printed type of the argument. -/ type : CodeWithInfos /-- What kind of binder was used for the argument. -/ binderInfo : BinderInfo /-- A base structure for information about a declaration. -/ structure Info extends NameInfo where /-- The list of arguments to the declaration. -/ args : Array Arg /-- In which lines the declaration was created. -/ declarationRange : DeclarationRange /-- A list of (known) attributes that are attached to the declaration. -/ attrs : Array String /-- Whether this info item should be rendered -/ render : Bool := true deriving Inhabited /-- Information about an `axiom` declaration. -/ structure AxiomInfo extends Info where isUnsafe : Bool deriving Inhabited /-- Information about a `theorem` declaration. -/ structure TheoremInfo extends Info deriving Inhabited /-- Information about an `opaque` declaration. -/ structure OpaqueInfo extends Info where /-- The pretty printed value of the declaration. -/ value : CodeWithInfos /-- A value of partial is interpreted as this opaque being part of a partial def since the actual definition for a partial def is hidden behind an inaccessible value. -/ definitionSafety : DefinitionSafety deriving Inhabited /-- Information about a `def` declaration, note that partial defs are handled by `OpaqueInfo`. -/ structure DefinitionInfo extends Info where isUnsafe : Bool hints : ReducibilityHints equations : Option (Array CodeWithInfos) isNonComputable : Bool deriving Inhabited /-- Information about an `instance` declaration. -/ structure InstanceInfo extends DefinitionInfo where className : Name typeNames : Array Name deriving Inhabited /-- Information about an `inductive` declaration -/ structure InductiveInfo extends Info where /-- List of all constructors of this inductive type. -/ ctors : List NameInfo isUnsafe : Bool deriving Inhabited /-- Information about a `structure` declaration. -/ structure StructureInfo extends Info where /-- Information about all the fields of the structure. -/ fieldInfo : Array NameInfo /-- All the structures this one inherited from. -/ parents : Array Name /-- The constructor of the structure. -/ ctor : NameInfo deriving Inhabited /-- Information about a `class` declaration. -/ abbrev ClassInfo := StructureInfo /-- 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. -/ inductive DocInfo where | axiomInfo (info : AxiomInfo) : DocInfo | theoremInfo (info : TheoremInfo) : DocInfo | opaqueInfo (info : OpaqueInfo) : DocInfo | definitionInfo (info : DefinitionInfo) : DocInfo | instanceInfo (info : InstanceInfo) : DocInfo | inductiveInfo (info : InductiveInfo) : DocInfo | structureInfo (info : StructureInfo) : DocInfo | classInfo (info : ClassInfo) : DocInfo | classInductiveInfo (info : ClassInductiveInfo) : DocInfo | ctorInfo (info : ConstructorInfo) : DocInfo deriving Inhabited /-- Turns an `Expr` into a pretty printed `CodeWithInfos`. -/ def prettyPrintTerm (expr : Expr) : MetaM CodeWithInfos := do let ⟨fmt, infos⟩ ← PrettyPrinter.ppExprWithInfos expr let tt := TaggedText.prettyTagged fmt let ctx := { env := ← getEnv mctx := ← getMCtx options := ← getOptions currNamespace := ← getCurrNamespace openDecls := ← getOpenDecls fileMap := default, ngen := ← getNGen } return tagCodeInfos ctx infos tt def isInstance (declName : Name) : MetaM Bool := do return (instanceExtension.getState (← getEnv)).instanceNames.contains declName end DocGen4.Process