module Haskell.Docs
(module Haskell.Docs
,Identifier(..)
,PackageName(..))
where
import Haskell.Docs.Cabal
import Haskell.Docs.Formatting
import Haskell.Docs.Ghc
import Haskell.Docs.Haddock
import Haskell.Docs.Index
import Haskell.Docs.Types
import Control.Exception
import Control.Monad
import qualified Data.HashMap.Strict as M
import Data.List
import Data.Ord
import qualified Data.Text as T
import qualified Data.Text.IO as T
import GHC hiding (verbosity)
import MonadUtils
searchAndPrintDoc
:: [String]
-> Bool
-> Bool
-> Maybe PackageName
-> Maybe ModuleName
-> Identifier
-> Ghc ()
searchAndPrintDoc flags _ms ss _pname _mname ident =
do result <- liftIO (lookupIdent flags
(T.pack (unIdentifier ident)))
case result of
Nothing -> throw NoFindModule
Just pkgModuleMap ->
do pkgs <- getAllPackages flags
docs <- fmap concat
(forM (M.toList pkgModuleMap)
(searchResult pkgs))
if ss
then printSexp docs
else mapM_ (\(_,doc') ->
printIdentDoc False True True doc')
(zip [0 :: Int ..]
(nub docs))
where searchResult pkgs (pkgName,modName) =
case find (matchingPkg pkgName) pkgs of
Nothing -> return []
Just pkg -> searchPkg pkg modName
where matchingPkg pkgNm = (== pkgNm) . T.pack . showPackageName .
getIdentifier
searchPkg pkg modName =
do result <- searchWithPackage
pkg
(Just (head (fmap (makeModuleName . T.unpack) modName)))
ident
case result of
Left err -> throw err
Right (sortBy (comparing identDocPackageName) -> docs) -> return docs
searchAndPrintModules :: [String] -> Identifier -> IO ()
searchAndPrintModules flags ident =
do result <- lookupIdent flags (T.pack (unIdentifier ident))
case result of
Nothing ->
throw NoFindModule
Just packages ->
forM_ (nub (concat (map snd (M.toList packages))))
T.putStrLn