hint-0.2: src/Language/Haskell/Interpreter/GHC/Conversions.hs
module Language.Haskell.Interpreter.GHC.Conversions(FromGhcRep(..))
where
import Control.Monad.Trans ( liftIO )
import qualified GHC as GHC
import qualified Outputable as GHC.O
import Language.Haskell.Interpreter.GHC.Base
import qualified Language.Haskell.Interpreter.GHC.Compat as Compat
import Language.Haskell.Syntax ( HsModule(..), HsDecl(..), HsQualType )
import Language.Haskell.Parser ( parseModule, ParseResult(ParseOk) )
-- | Conversions from GHC representation to standard representations
class FromGhcRep ghc target where
fromGhcRep :: ghc -> Interpreter target
-- --------- Types / Kinds -----------------------
instance FromGhcRep GHC.Type HsQualType where
fromGhcRep t =
do t_str <- fromGhcRep t
--
let mod_str = unlines ["f ::" ++ t_str,
"f = undefined"]
let HsModule _ _ _ _ [decl,_] = parseModule' mod_str
HsTypeSig _ _ qualType = decl
--
return qualType
instance FromGhcRep GHC.Type String where
fromGhcRep t = do ghc_session <- fromSessionState ghcSession
-- Unqualify necessary types
-- (i.e., do not expose internals)
unqual <- liftIO $ GHC.getPrintUnqual ghc_session
return $ GHC.O.showSDocForUser unqual (Compat.pprType t)
parseModule' :: String -> HsModule
parseModule' s = case parseModule s of
ParseOk m -> m
failed -> error $ unlines ["parseModulde' failed?!",
s,
show failed]
instance FromGhcRep Compat.Kind String where
fromGhcRep (Compat.Kind k) = return $ GHC.O.showSDoc (Compat.pprKind k)