module Idris.Docs where
import Idris.AbsSyntax
import Idris.AbsSyntaxTree
import Idris.Delaborate
import Core.TT
import Core.Evaluate
import Data.Maybe
import Data.List
data FunDoc = Doc Name String
[(Name, PArg)]
PTerm
(Maybe Fixity)
data Doc = FunDoc FunDoc
| DataDoc FunDoc
[FunDoc]
| ClassDoc Name String
[FunDoc]
showDoc "" = ""
showDoc x = " -- " ++ x
instance Show FunDoc where
show (Doc n doc args ty f)
= show n ++ " : " ++ show ty ++ "\n" ++ showDoc doc ++ "\n" ++
maybe "" (\f -> show f ++ "\n\n") f ++
let argshow = mapMaybe showArg args in
if not (null argshow)
then "Arguments:\n\t" ++ showSep "\t" argshow
else ""
where showArg (n, arg@(PExp _ _ _ _))
= Just $ showName n ++ show (getTm arg) ++
showDoc (pargdoc arg) ++ "\n"
showArg (n, arg@(PConstraint _ _ _ _))
= Just $ "Class constraint " ++
show (getTm arg) ++ showDoc (pargdoc arg)
++ "\n"
showArg (n, arg@(PImp _ _ _ _ _ doc))
| not (null doc)
= Just $ "(implicit) " ++
show n ++ " : " ++ show (getTm arg)
++ showDoc (pargdoc arg) ++ "\n"
showArg (n, _) = Nothing
showName (MN _ _) = ""
showName x = show x ++ " : "
instance Show Doc where
show (FunDoc d) = show d
show (DataDoc t args) = "Data type " ++ show t ++
"\nConstructors:\n\n" ++
showSep "\n" (map show args)
show (ClassDoc n doc meths)
= "Type class " ++ show n ++
"\nMethods:\n\n" ++
showSep "\n" (map show meths)
getDocs :: Name -> Idris Doc
getDocs n
= do i <- getIState
case lookupCtxt n (idris_classes i) of
[ci] -> docClass n ci
_ -> case lookupCtxt n (idris_datatypes i) of
[ti] -> docData n ti
_ -> do fd <- docFun n
return (FunDoc fd)
docData :: Name -> TypeInfo -> Idris Doc
docData n ti
= do tdoc <- docFun n
cdocs <- mapM docFun (con_names ti)
return (DataDoc tdoc cdocs)
docClass :: Name -> ClassInfo -> Idris Doc
docClass n ci
= do i <- getIState
let docstr = case lookupCtxt n (idris_docstrings i) of
[str] -> str
_ -> ""
mdocs <- mapM docFun (map fst (class_methods ci))
return (ClassDoc n docstr mdocs)
docFun :: Name -> Idris FunDoc
docFun n
= do i <- getIState
let docstr = case lookupCtxt n (idris_docstrings i) of
[str] -> str
_ -> ""
let ty = case lookupTy n (tt_ctxt i) of
(t : _) -> t
let argnames = map fst (getArgTys ty)
let args = case lookupCtxt n (idris_implicits i) of
[args] -> zip argnames args
_ -> []
let infixes = idris_infixes i
let fixdecls = filter (\(Fix _ x) -> x == funName n) infixes
let f = case fixdecls of
[] -> Nothing
(Fix x _:_) -> Just x
return (Doc n docstr args (delab i ty) f)
where funName :: Name -> String
funName (UN n) = n
funName (NS n _) = funName n