@@ -32,7 +32,8 @@ data Docs' d = FunDoc (FunDoc' d)
3232 | ClassDoc Name d -- class docs
3333 [FunDoc' d] -- method docs
3434 [(Name, Maybe d)] -- parameters and their docstrings
35− [(PTerm, Docstring DocTerm)] -- instances and docs
35+ [(PTerm, (d, [(Name, d)]))] -- instances
36+ [PTerm] -- subclasses
3637 [PTerm] -- superclasses
3738 | ModDoc [String] -- Module name
3839 d
@@ -88,7 +89,7 @@ pprintDocs ist (DataDoc t args)
8889 if null args then text "No constructors."
8990 else nest 4 (text "Constructors:" <> line <>
9091 vsep (map (pprintFD ist) args))
91−pprintDocs ist (ClassDoc n doc meths params instances superclasses)
92+pprintDocs ist (ClassDoc n doc meths params instances subclasses superclasses)
9293 = nest 4 (text "Type class" <+> prettyName True (ppopt_impl ppo) [] n <>
9394 if nullDocstring doc
9495 then empty
@@ -100,12 +101,12 @@ pprintDocs ist (ClassDoc n doc meths params instances superclasses)
100101 vsep (map (pprintFD ist) meths))
101102 <$>
102103 nest 4 (text "Instances:" <$>
103− vsep (if null instances' then [text "<no instances>"]
104− else map pprintInstance instances'))
104+ vsep (if null instances then [text "<no instances>"]
105+ else map pprintInstance instances))
105106 <>
106107 (if null subclasses then empty
107108 else line <$> nest 4 (text "Subclasses:" <$>
108− vsep (map (dumpInstance . prettifySubclasses . fst) subclasses)))
109+ vsep (map (dumpInstance . prettifySubclasses) subclasses)))
109110 <>
110111 (if null superclasses then empty
111112 else line <$> nest 4 (text "Default superclass instances:" <$>
@@ -118,16 +119,29 @@ pprintDocs ist (ClassDoc n doc meths params instances superclasses)
118119 ppo = ppOptionIst ist
119120 infixes = idris_infixes ist
120121
121− pprintInstance (term, doc) =
122+ pprintInstance (term, (doc, argDocs)) =
122123 nest 4 (dumpInstance term <>
123− if nullDocstring doc
124+ (if nullDocstring doc
124125 then empty
125126 else line <>
126127 renderDocstring
127128 (renderDocTerm
128129 (pprintDelab ist)
129130 (normaliseAll (tt_ctxt ist) []))
130− doc)
131+ doc) <>
132+ if null argDocs
133+ then empty
134+ else line <> vsep (map (prettyInstanceParam (map fst argDocs)) argDocs))
135+
136+ prettyInstanceParam params (name, doc) =
137+ if nullDocstring doc
138+ then empty
139+ else prettyName True False (zip params (repeat False)) name <+>
140+ showDoc ist doc
141+
142+-- if any (isJust . snd) params
143+-- then vsep (map (\(nm,md) -> prettyName True False params' nm <+> maybe empty (showDoc ist) md) params)
144+-- else hsep (punctuate comma (map (prettyName True False params' . fst) params))
131145
132146 dumpInstance :: PTerm -> Doc OutputAnnotation
133147 dumpInstance = pprintPTerm ppo params' [] infixes
@@ -151,11 +165,10 @@ pprintDocs ist (ClassDoc n doc meths params instances superclasses)
151165 isSubclass (PPi _ _ _ pt) = isSubclass pt
152166 isSubclass _ = False
153167
154− (subclasses, instances') = partition (isSubclass . fst) instances
155−
156− prettyParameters = if any (isJust . snd) params
157− then vsep (map (\(nm,md) -> prettyName True False params' nm <+> maybe empty (showDoc ist) md) params)
158− else hsep (punctuate comma (map (prettyName True False params' . fst) params))
168+ prettyParameters =
169+ if any (isJust . snd) params
170+ then vsep (map (\(nm,md) -> prettyName True False params' nm <+> maybe empty (showDoc ist) md) params)
171+ else hsep (punctuate comma (map (prettyName True False params' . fst) params))
159172
160173pprintDocs ist (ModDoc mod docs)
161174 = nest 4 $ text "Module" <+> text (concat (intersperse "." mod)) <> colon <$>
@@ -197,18 +210,28 @@ docClass n ci
197210 let docStrings = listToMaybe $ lookupCtxt n $ idris_docstrings i
198211 docstr = maybe emptyDocstring fst docStrings
199212 params = map (\pn -> (pn, docStrings >>= (lookup pn . snd))) (class_params ci)
200− instanceDocs = map (maybe emptyDocstring fst .
213+ instanceDocs = map (fromMaybe (emptyDocstring, []) .
201214 listToMaybe .
202215 flip lookupCtxt (idris_docstrings i))
203216 (class_instances ci)
204− instances = map (delabTy i) (class_instances ci)
217+ instances = zip (map (delabTy i) (class_instances ci)) instanceDocs
218+ (subclasses, instances') = partition (isSubclass . fst) instances
205219 superclasses = catMaybes $ map getDInst (class_default_superclasses ci)
206220 mdocs <- mapM (docFun . fst) (class_methods ci)
207− return $ ClassDoc n docstr mdocs params (zip instances instanceDocs) superclasses
221+ return $ ClassDoc
222+ n docstr mdocs params
223+ instances' (map fst subclasses) superclasses
208224 where
209− getDInst (PInstance _ _ _ _ _ _ t _ _) = Just t
225+ getDInst (PInstance _ _ _ _ _ _ _ t _ _) = Just t
210226 getDInst _ = Nothing
211227
228+ isSubclass (PPi (Constraint _ _) _ (PApp _ _ args) (PApp _ (PRef _ nm) args'))
229+ = nm == n && map getTm args == map getTm args'
230+ isSubclass (PPi _ _ _ pt)
231+ = isSubclass pt
232+ isSubclass _
233+ = False
234+
212235docFun :: Name -> Idris FunDoc
213236docFun n
214237 = do i <- getIState