@@ -41,6 +41,10 @@ data Docs' d = FunDoc (FunDoc' d)
4141 [PTerm] -- subclasses
4242 [PTerm] -- superclasses
4343 (Maybe (FunDoc' d)) -- explicit constructor
44+ | RecordDoc Name d -- record docs
45+ (FunDoc' d) -- data constructor docs
46+ [FunDoc' d] -- projection docs
47+ [(Name, PTerm, Maybe d)] -- parameters with type and doc
4448 | NamedInstanceDoc Name (FunDoc' d) -- name is class
4549 | ModDoc [String] -- Module name
4650 d
@@ -209,6 +213,33 @@ pprintDocs ist (ClassDoc n doc meths params instances subclasses superclasses ct
209213 then vsep (map (\(nm,md) -> prettyName True False params' nm <+> maybe empty (showDoc ist) md) params)
210214 else hsep (punctuate comma (map (prettyName True False params' . fst) params))
211215
216+pprintDocs ist (RecordDoc n doc ctor projs params)
217+ = nest 4 (text "Record" <+> prettyName True (ppopt_impl ppo) [] n <>
218+ if nullDocstring doc
219+ then empty
220+ else line <>
221+ renderDocstring (renderDocTerm (pprintDelab ist) (normaliseAll (tt_ctxt ist) [])) doc)
222+ -- Parameters
223+ <$> (if null params
224+ then empty
225+ else line <> nest 4 (text "Parameters:" <$> prettyParameters) <> line)
226+ -- Constructor
227+ <$> nest 4 (text "Constructor:" <$> pprintFDWithoutTotality ist False ctor)
228+ -- Projections
229+ <$> nest 4 (text "Projections:" <$> vsep (map (pprintFDWithoutTotality ist False) projs))
230+ where
231+ ppo = ppOptionIst ist
232+ infixes = idris_infixes ist
233+
234+ pNames = [n | (n,_,_) <- params]
235+ params' = zip pNames (repeat False)
236+
237+ prettyParameters =
238+ if any isJust [d | (_,_,d) <- params]
239+ then vsep (map (\(n,pt,d) -> prettyParam (n,pt) <+> maybe empty (showDoc ist) d) params)
240+ else hsep (punctuate comma (map prettyParam [(n,pt) | (n,pt,_) <- params]))
241+ prettyParam (n,pt) = prettyName True False params' n <+> text ":" <+> pprintPTerm ppo params' [] infixes pt
242+
212243pprintDocs ist (NamedInstanceDoc _cls doc)
213244 = nest 4 (text "Named instance:" <$> pprintFDWithoutTotality ist True doc)
214245
@@ -234,6 +265,8 @@ getDocs n w
234265 = do i <- getIState
235266 docs <- if | Just ci <- lookupCtxtExact n (idris_classes i)
236267 -> docClass n ci
268+ | Just ri <- lookupCtxtExact n (idris_records i)
269+ -> docRecord n ri
237270 | Just ti <- lookupCtxtExact n (idris_datatypes i)
238271 -> docData n ti
239272 | Just class_ <- classNameForInst i n
@@ -296,6 +329,17 @@ docClass n ci
296329 isSubclass _
297330 = False
298331
332+docRecord :: Name -> RecordInfo -> Idris Docs
333+docRecord n ri
334+ = do i <- getIState
335+ let docStrings = listToMaybe $ lookupCtxt n $ idris_docstrings i
336+ docstr = maybe emptyDocstring fst docStrings
337+ params = map (\(pn,pt) -> (pn, pt, docStrings >>= (lookup pn . snd)))
338+ (record_parameters ri)
339+ pdocs <- mapM docFun (record_projections ri)
340+ ctorDocs <- docFun $ record_constructor ri
341+ return $ RecordDoc n docstr ctorDocs pdocs params
342+
299343docFun :: Name -> Idris FunDoc
300344docFun n
301345 = do i <- getIState