module Haskell.Docs.Ghc where
import Control.Exception (SomeException)
import Haskell.Docs.Types
import GHC hiding (verbosity)
import GHC.Paths (libdir)
import GhcMonad (liftIO)
import Outputable
import Packages
import qualified SrcLoc
import Name
import Module
#if __GLASGOW_HASKELL__ < 706
import DynFlags (defaultLogAction)
#else
import DynFlags (defaultFlushOut, defaultFatalMessager)
#endif
withInitializedPackages :: [String] -> Ghc a -> IO a
withInitializedPackages ghcopts m =
run (do dflags <- getSessionDynFlags
(dflags', _, _) <- parseDynamicFlags dflags (map SrcLoc.noLoc ghcopts)
_ <- setSessionDynFlags (dflags' { hscTarget = HscInterpreted
, ghcLink = LinkInMemory })
(_dflags'',_packageids) <- liftIO (initPackages dflags')
m)
findIdentifier :: ModuleName -> Identifier -> Ghc (Maybe Id)
findIdentifier mname name =
gcatch (do _ <- depanal [] False
_ <- load LoadAllTargets
setImportContext mname
names <- getNamesInScope
mty <- lookupName (head (filter ((==unIdentifier name).getOccString) names))
case mty of
Just (AnId i) -> return (Just i)
_ -> return Nothing)
(\(_ :: SomeException) -> return Nothing)
makeModuleName :: String -> ModuleName
makeModuleName = mkModuleName
#if __GLASGOW_HASKELL__ < 706
run :: Ghc a -> IO a
run = defaultErrorHandler defaultLogAction . runGhc (Just libdir)
#else
run :: Ghc a -> IO a
run = defaultErrorHandler defaultFatalMessager defaultFlushOut . runGhc (Just libdir)
#endif
showppr dflags = Haskell.Docs.Ghc.showSDocForUser dflags neverQualify . ppr
#if __GLASGOW_HASKELL__ == 702
showSDocForUser _ = Outputable.showSDocForUser
#endif
#if __GLASGOW_HASKELL__ == 704
showSDocForUser _ = Outputable.showSDocForUser
#endif
#if __GLASGOW_HASKELL__ == 706
showSDocForUser = Outputable.showSDocForUser
#endif
#if __GLASGOW_HASKELL__ == 708
showSDocForUser = Outputable.showSDocForUser
#endif
setImportContext :: ModuleName -> Ghc ()
#if __GLASGOW_HASKELL__ == 702
setImportContext mname = setContext [] [simpleImportDecl mname]
#else
setImportContext mname = setContext [IIDecl (simpleImportDecl mname)]
#endif
showPackageName :: PackageIdentifier -> String
showPackageName = packageIdString . mkPackageId