on master help sign in
Update display of instances in :doc for a type class

This patch does the following: 1. It nubs the internal instance names prior to display, which fixes #2019 2. It sets up a second section of the displayed documentation for a class if it has named instances, listing them separately. I also think that the code is easier to follow now.

commitc974e3bf4e5acfa84f841f991b597f0db465bc02 authorDavid Raymond Christiansen <david@davidchristiansen.dk> dateFri 20 Mar 2015, 12:31 (12 years ago) parentb5052eb
2 files changed+33−13
src/Idris/Delaborate.hs+1−1 src/Idris/Docs.hs+32−12
src/Idris/Delaborate.hs+1−1
@@ -1,6 +1,6 @@
11{-# LANGUAGE PatternGuards #-}
22{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
3−module Idris.Delaborate (bugaddr, delab, delab', delabMV, delabTy, delabTy', fancifyAnnots, pprintDelab, pprintDelabTy, pprintErr) where
3+module Idris.Delaborate (annName, bugaddr, delab, delab', delabMV, delabTy, delabTy', fancifyAnnots, pprintDelab, pprintDelabTy, pprintErr) where
44
55-- Convert core TT back into high level syntax, primarily for display
66-- purposes.
src/Idris/Docs.hs+32−12
@@ -10,6 +10,8 @@ import Idris.Docstrings (Docstring, emptyDocstring, noDocs, nullDocstring, rende
1010
1111import Util.Pretty
1212
13+import Control.Arrow (first)
14+
1315import Data.Maybe
1416import Data.List
1517import qualified Data.Text as T
@@ -32,7 +34,7 @@ data Docs' d = FunDoc (FunDoc' d)
3234 | ClassDoc Name d -- class docs
3335 [FunDoc' d] -- method docs
3436 [(Name, Maybe d)] -- parameters and their docstrings
35− [(PTerm, (d, [(Name, d)]))] -- instances
37+ [(Maybe Name, PTerm, (d, [(Name, d)]))] -- instances: name for named instances, the constraint term, the docs
3638 [PTerm] -- subclasses
3739 [PTerm] -- superclasses
3840 | ModDoc [String] -- Module name
@@ -102,7 +104,11 @@ pprintDocs ist (ClassDoc n doc meths params instances subclasses superclasses)
102104 <$>
103105 nest 4 (text "Instances:" <$>
104106 vsep (if null instances then [text "<no instances>"]
105− else map pprintInstance instances))
107+ else map pprintInstance normalInstances))
108+ <>
109+ (if null namedInstances then empty
110+ else line <$> nest 4 (text "Named instances:" <$>
111+ vsep (map pprintInstance namedInstances)))
106112 <>
107113 (if null subclasses then empty
108114 else line <$> nest 4 (text "Subclasses:" <$>
@@ -113,14 +119,17 @@ pprintDocs ist (ClassDoc n doc meths params instances subclasses superclasses)
113119 vsep (map dumpInstance superclasses)))
114120 where
115121 params' = zip pNames (repeat False)
122+
123+ (normalInstances, namedInstances) = partition (\(n, _, _) -> not $ isJust n)
124+ instances
116125
117126 pNames = map fst params
118127
119128 ppo = ppOptionIst ist
120129 infixes = idris_infixes ist
121130
122− pprintInstance (term, (doc, argDocs)) =
123− nest 4 (dumpInstance term <>
131+ pprintInstance (mname, term, (doc, argDocs)) =
132+ nest 4 (iname mname <> dumpInstance term <>
124133 (if nullDocstring doc
125134 then empty
126135 else line <>
@@ -133,6 +142,10 @@ pprintDocs ist (ClassDoc n doc meths params instances subclasses superclasses)
133142 then empty
134143 else line <> vsep (map (prettyInstanceParam (map fst argDocs)) argDocs))
135144
145+
146+ iname Nothing = empty
147+ iname (Just n) = annName n <+> colon <> space
148+
136149 prettyInstanceParam params (name, doc) =
137150 if nullDocstring doc
138151 then empty
@@ -209,19 +222,26 @@ docClass n ci
209222 = do i <- getIState
210223 let docStrings = listToMaybe $ lookupCtxt n $ idris_docstrings i
211224 docstr = maybe emptyDocstring fst docStrings
212− params = map (\pn -> (pn, docStrings >>= (lookup pn . snd))) (class_params ci)
213− instanceDocs = map (fromMaybe (emptyDocstring, []) .
214− listToMaybe .
215− flip lookupCtxt (idris_docstrings i))
216− (class_instances ci)
217− instances = zip (map (delabTy i) (class_instances ci)) instanceDocs
218− (subclasses, instances') = partition (isSubclass . fst) instances
225+ params = map (\pn -> (pn, docStrings >>= (lookup pn . snd)))
226+ (class_params ci)
227+ docsForInstance inst = fromMaybe (emptyDocstring, []) .
228+ flip lookupCtxtExact (idris_docstrings i) $
229+ inst
230+ instances = map (\inst -> (namedInst inst,
231+ delabTy i inst,
232+ docsForInstance inst))
233+ (nub (class_instances ci))
234+ (subclasses, instances') = partition (isSubclass . (\(_,tm,_) -> tm)) instances
219235 superclasses = catMaybes $ map getDInst (class_default_superclasses ci)
220236 mdocs <- mapM (docFun . fst) (class_methods ci)
221237 return $ ClassDoc
222238 n docstr mdocs params
223− instances' (map fst subclasses) superclasses
239+ instances' (map (\(_,tm,_) -> tm) subclasses) superclasses
224240 where
241+ namedInst (NS n ns) = fmap (flip NS ns) (namedInst n)
242+ namedInst n@(UN _) = Just n
243+ namedInst _ = Nothing
244+
225245 getDInst (PInstance _ _ _ _ _ _ _ t _ _) = Just t
226246 getDInst _ = Nothing
227247