content: {-# LANGUAGE ScopedTypeVariables #-}
  
  module AnnRun01 where
  
  import GHC
  import MonadUtils  ( liftIO )
  import DynFlags    ( defaultFatalMessager, defaultFlushOut )
  import Annotations ( AnnTarget(..), CoreAnnTarget )
  import GHC.Serialized  ( deserializeWithData )
  import Panic
  
  import Config
  import Annrun01_Help
  
  import qualified Language.Haskell.TH as TH
  import Data.List
  import Data.Function
  
  main :: IO ()
  main = defaultErrorHandler defaultFatalMessager defaultFlushOut
       $ runGhc (Just cTop) $ do
      liftIO $ putStrLn "Initializing Package Database"
      dflags <- getSessionDynFlags
      let dflags' = dflags
      setSessionDynFlags dflags'
  
      let mod_nm = mkModuleName "Annrun01_Help"
  
      liftIO $ putStrLn "Setting Target"
      setTargets [Target (TargetModule mod_nm) True Nothing]
      liftIO $ putStrLn "Loading Targets"
      load LoadAllTargets
  
      liftIO $ putStrLn "Finding Module"
      mod <- findModule mod_nm Nothing
      liftIO $ putStrLn "Getting Module Info"
      Just mod_info <- getModuleInfo mod
  
      liftIO $ putStrLn "Showing Details For Module"
      showTargetAnns (ModuleTarget mod)
      liftIO $ putStrLn "Showing Details For Exports"
      let exports = sortBy (compare `on` getOccName) $ modInfoExports mod_info
      mapM_ (showTargetAnns . NamedTarget) exports
  
  showTargetAnns :: CoreAnnTarget -> Ghc ()
  showTargetAnns target = do
      (int_anns     :: [Int])        <- findGlobalAnns deserializeWithData target
      (mb_bool_anns :: [Maybe Bool]) <- findGlobalAnns deserializeWithData target
      (string_anns  :: [String])     <- findGlobalAnns deserializeWithData target
      (name_anns    :: [TH.Name])    <- findGlobalAnns deserializeWithData target
      liftIO $ print (int_anns, mb_bool_anns, string_anns, name_anns)
  