packages feed

hhp-1.0.3: lib/Hhp/List.hs

module Hhp.List (listModules, modules) where

import GHC (Ghc)
import qualified GHC as G

import GHC.Unit.State (listVisibleModuleNames, lookupModuleInAllUnits)
import GHC.Unit.Types (moduleName)

import Control.Monad.Catch (SomeException (..), catch)
import Data.List (nub, sort)

import Hhp.GHCApi
import Hhp.Gap
import Hhp.Types

----------------------------------------------------------------

-- | Listing installed modules.
listModules :: Options -> Cradle -> IO String
listModules opt cradle = withGHC' $ do
    initializeFlagsWithCradle opt cradle
    modules opt

-- | Listing installed modules.
modules :: Options -> Ghc String
modules opt = convert opt . arrange <$> (getModules `catch` handler)
  where
    arrange = nub . sort . map (G.moduleNameString . moduleName)
    handler (SomeException _) = return []

----------------------------------------------------------------

getModules :: Ghc [G.Module]
getModules = do
    us <- getUnitState
    let modNames = listVisibleModuleNames us
    return [m | mn <- modNames, (m, _) <- lookupModuleInAllUnits us mn]