@@ -27,6 +27,8 @@ data Docs = FunDoc FunDoc
2727 [FunDoc] -- data constructor docs
2828 | ClassDoc Name Docstring -- class docs
2929 [FunDoc] -- method docs
30+ [(Name, Maybe Docstring)] -- parameters and their docstrings
31+ [PTerm] -- instances
3032 deriving Show
3133
3234showDoc d | nullDocstring d = empty
@@ -66,16 +68,47 @@ pprintFD imp (FD n doc args ty f)
6668 showArgs [] _ = []
6769
6870
69−
71+pprintDocs :: Bool -> Docs -> Doc OutputAnnotation
7072pprintDocs imp (FunDoc d) = pprintFD imp d
7173pprintDocs imp (DataDoc t args)
7274 = text "Data type" <+> pprintFD imp t <$>
7375 nest 4 (text "Constructors:" <> line <>
7476 vsep (map (pprintFD imp) args))
75−pprintDocs imp (ClassDoc n doc meths)
76− = text "Type class" <+> prettyName imp [] n <$> -- parameters?
77+pprintDocs imp (ClassDoc n doc meths params instances)
78+ = nest 4 (text "Type class" <+> prettyName imp [] n <>
79+ if nullDocstring doc then empty else line <> renderDocstring doc)
80+ <> line <$>
81+ nest 4 (text "Parameters:" <$> prettyParameters)
82+ <> line <$>
7783 nest 4 (text "Methods:" <$>
78− vsep (map (pprintFD imp) meths))
84+ vsep (map (pprintFD imp) meths))
85+ <$>
86+ nest 4 (text "Instances:" <$>
87+ vsep (if null instances' then [text "<no instances>"]
88+ else map dumpInstance instances'))
89+ <>
90+ if null subclasses then empty
91+ else line <$> nest 4 (text "Subclasses:" <$>
92+ vsep (map (dumpInstance . remConstraint) subclasses))
93+ where
94+ params' = map (\x -> (fst x, False)) params
95+
96+ dumpInstance :: PTerm -> Doc OutputAnnotation
97+ dumpInstance = pprintPTerm imp params' []
98+
99+ remConstraint (PPi (Constraint _ _) _ tm _) = tm
100+ remConstraint (PPi x y z pt) = PPi x y z (remConstraint pt)
101+ remConstraint p = p
102+
103+ hasConstraint (PPi (Constraint _ _) _ _ _) = True
104+ hasConstraint (PPi _ _ _ pt) = hasConstraint pt
105+ hasConstraint _ = False
106+
107+ (subclasses, instances') = partition hasConstraint instances
108+
109+ prettyParameters = if any (isJust . snd) params
110+ then vsep (map (\(n,md) -> prettyName False params' n <+> maybe empty showDoc md) params)
111+ else hsep (punctuate comma (map (prettyName False params' . fst) params))
79112
80113getDocs :: Name -> Idris Docs
81114getDocs n
@@ -96,11 +129,13 @@ docData n ti
96129docClass :: Name -> ClassInfo -> Idris Docs
97130docClass n ci
98131 = do i <- getIState
99− let docstr = case lookupCtxt n (idris_docstrings i) of
100− [str] -> fst str
101− _ -> emptyDocstring
102− mdocs <- mapM docFun (map fst (class_methods ci))
103− return (ClassDoc n docstr mdocs)
132+ ctxt <- getContext
133+ let docStrings = listToMaybe $ lookupCtxt n $ idris_docstrings i
134+ docstr = maybe emptyDocstring fst docStrings
135+ params = map (\pn -> (pn, docStrings >>= (lookup pn . snd))) (class_params ci)
136+ instances = map (delabTy i) (class_instances ci)
137+ mdocs <- mapM (docFun .fst) (class_methods ci)
138+ return $ ClassDoc n docstr mdocs params instances
104139
105140docFun :: Name -> Idris FunDoc
106141docFun n