on master help sign in
Merge pull request #1830 from david-christiansen/feature/moduledocs
01ccf1fDavid Christiansen
src/Idris/Apropos.hs+18−4
@@ -1,12 +1,12 @@
1−module Idris.Apropos where
1+module Idris.Apropos (apropos, aproposModules) where
2
2
3import Idris.AbsSyntax
3import Idris.AbsSyntax
4import Idris.Core.Evaluate (ctxtAlist, Def(..))
4import Idris.Core.Evaluate (ctxtAlist, Def(..))
5import Idris.Core.TT (Name(..), Type, TT(..), NameType(..), Binder(..), Const(..),
5import Idris.Core.TT (Name(..), Type, TT(..), NameType(..), Binder(..), Const(..),
6 lookupCtxtExact, toAlist)
6 lookupCtxtExact, toAlist)
7−import Idris.Docstrings (Docstring, containsText)
7+import Idris.Docstrings (Docstring, DocTerm, containsText)
8
8
9−import Data.List (nub)
9+import Data.List (nub, nubBy, intersperse)
10import qualified Data.Text as T
10import qualified Data.Text as T
11
11
12-- | Find definitions that are relevant to all space-delimited components of
12-- | Find definitions that are relevant to all space-delimited components of
@@ -22,11 +22,25 @@ apropos ist what = let defs = ctxtAlist (tt_ctxt ist)
22 docs = toAlist (idris_docstrings ist)
22 docs = toAlist (idris_docstrings ist)
23 in nub (map fst (isAproposAll parts defs) ++
23 in nub (map fst (isAproposAll parts defs) ++
24 map fst (isAproposAll parts docs))
24 map fst (isAproposAll parts docs))
25− where isAproposAll [] xs = xs
25+ where isAproposAll [] xs = xs
26 isAproposAll (what:more) xs = filter (isApropos what)
26 isAproposAll (what:more) xs = filter (isApropos what)
27 (isAproposAll more xs)
27 (isAproposAll more xs)
28 parts = filter ((> 0) . T.length) . T.splitOn (T.pack " ") $ what
28 parts = filter ((> 0) . T.length) . T.splitOn (T.pack " ") $ what
29
29
30+-- | Find modules whose names or docstrings contain all the
31+-- space-delimited components of some string.
32+aproposModules :: IState -> T.Text -> [(String, Docstring DocTerm)]
33+aproposModules ist what = let mods = toAlist (idris_moduledocs ist)
34+ found = nubBy (\x y -> fst x == fst y)
35+ (isAproposAll parts mods)
36+ in map unModName found
37+ where isAproposAll [] xs = xs
38+ isAproposAll (what:more) xs = filter (\(n,d) -> isApropos what n || isApropos what d)
39+ (isAproposAll more xs)
40+ parts = filter ((> 0) . T.length) . T.splitOn (T.pack " ") $ what
41+ unModName (NS _ ns, d) = ((concat . intersperse "." . map T.unpack . reverse) ns, d)
42+ unModName (n, d) = ("<<MODULE>>", d)
43+
30textIn :: T.Text -> T.Text -> Bool
44textIn :: T.Text -> T.Text -> Bool
31textIn a b = T.isInfixOf (T.toLower a) (T.toLower b)
45textIn a b = T.isInfixOf (T.toLower a) (T.toLower b)
32
46
src/Idris/REPL.hs+8−3
@@ -5,7 +5,7 @@ module Idris.REPL where
5
5
6import Idris.AbsSyntax
6import Idris.AbsSyntax
7import Idris.ASTUtils
7import Idris.ASTUtils
8−import Idris.Apropos (apropos)
8+import Idris.Apropos (apropos, aproposModules)
9import Idris.REPLParser
9import Idris.REPLParser
10import Idris.ElabDecls
10import Idris.ElabDecls
11import Idris.ElabTerm
11import Idris.ElabTerm
@@ -13,7 +13,7 @@ import Idris.Erasure
13import Idris.Error
13import Idris.Error
14import Idris.ErrReverse
14import Idris.ErrReverse
15import Idris.Delaborate
15import Idris.Delaborate
16−import Idris.Docstrings (Docstring, overview, renderDocstring)
16+import Idris.Docstrings (Docstring, overview, renderDocstring, renderDocTerm)
17import Idris.Help
17import Idris.Help
18import Idris.IdrisDoc
18import Idris.IdrisDoc
19import Idris.Prover
19import Idris.Prover
@@ -1179,16 +1179,21 @@ process fn (Apropos pkgs a) =
1179 iputStrLn $ "Searching packages: " ++ showSep ", " pkgs
1179 iputStrLn $ "Searching packages: " ++ showSep ", " pkgs
1180 mapM_ loadPkgIndex pkgs
1180 mapM_ loadPkgIndex pkgs
1181 ist <- getIState
1181 ist <- getIState
1182+ let mods = aproposModules ist (T.pack a)
1182 let names = apropos ist (T.pack a)
1183 let names = apropos ist (T.pack a)
1183 let aproposInfo = [ (n,
1184 let aproposInfo = [ (n,
1184 delabTy ist n,
1185 delabTy ist n,
1185 fmap (overview . fst) (lookupCtxtExact n (idris_docstrings ist)))
1186 fmap (overview . fst) (lookupCtxtExact n (idris_docstrings ist)))
1186 | n <- sort names, isUN n ]
1187 | n <- sort names, isUN n ]
1188+ iRenderResult $ vsep (map (\(m, d) -> text "Module" <+> text m <$>
1189+ ppD ist d <> line) mods) <$>
1187− iRenderResult $ vsep (map (prettyDocumentedIst ist) aproposInfo)
1190+ vsep (map (prettyDocumentedIst ist) aproposInfo)
1188 putIState orig
1191 putIState orig
1189 where isUN (UN _) = True
1192 where isUN (UN _) = True
1190 isUN (NS n _) = isUN n
1193 isUN (NS n _) = isUN n
1191 isUN _ = False
1194 isUN _ = False
1195+ ppD ist = renderDocstring (renderDocTerm (pprintDelab ist) (normaliseAll (tt_ctxt ist) []))
1196+
1192
1197
1193process fn (WhoCalls n) =
1198process fn (WhoCalls n) =
1194 do calls <- whoCalls n
1199 do calls <- whoCalls n