haskell-docs-4.2.3: src/Haskell/Docs/Cabal.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE RecordWildCards #-}
-- | Cabal.
module Haskell.Docs.Cabal where
import Haskell.Docs.Ghc
import Data.Char (isSpace)
import Data.List
import Data.Maybe
import Distribution.InstalledPackageInfo
import Distribution.ModuleName
import Distribution.Simple.Compiler
import Distribution.Simple.PackageIndex
import DynFlags
import GHC
import Module
import PackageConfig
-- * Cabal
getGhcOpsPackageDB :: [String] -> [PackageDB]
getGhcOpsPackageDB gs = map (SpecificPackageDB . trim) pkgDBOps
where
pkgDBOps = filter ("--package-db" `isPrefixOf`) gs
trim = (drop 1) . snd . (break isSpace)
-- | Get all installed packages, filtering out the given package.
getAllPackages :: [String] -> Ghc [PackageConfig.PackageConfig]
getAllPackages gs =
do flags <- getSessionDynFlags
return (fromMaybe [] (pkgDatabase flags))
-- do config <- configureAllKnownPrograms
-- normal
-- (addKnownPrograms [ghcProgram,ghcPkgProgram]
-- emptyProgramConfiguration)
-- index <- getInstalledPackages
-- normal
-- (concat [[GlobalPackageDB,UserPackageDB],getGhcOpsPackageDB gs])
-- config
-- return (map (imap convModule)
-- (concat (packagesByName index)))
-- | Version-portable version of allPackagesByName.
packagesByName :: PackageIndex -> [[InstalledPackageInfo]]
#if MIN_VERSION_Cabal(1,16,0)
packagesByName = map snd . allPackagesByName
#else
packagesByName = allPackagesByName
#endif
-- * Internal modules
-- | Convert a Cabal module name to a GHC module name.
convModule :: Distribution.ModuleName.ModuleName -> Module.ModuleName
convModule = makeModuleName . intercalate "." . components
-- | Because no Functor instance is available.
imap :: (a -> m) -> InstalledPackageInfo_ a -> InstalledPackageInfo_ m
imap f i@(InstalledPackageInfo{..}) =
i { exposedModules = map f exposedModules
, hiddenModules = map f hiddenModules }