GHC/Types/SafeHaskell.hs

    -- | This stuff here is related to supporting the Safe Haskell extension,
    -- primarily about storing under what trust type a module has been compiled.
    module GHC.Types.SafeHaskell
       ( IsSafeImport
       , SafeHaskellMode(..)
       , IfaceTrustInfo
       , getSafeMode
       , setSafeMode
       , noIfaceTrustInfo
       )
    where

    import GHC.Prelude

    import GHC.Utils.Binary
    import GHC.Utils.Outputable

    import Data.Word

    -- | Is an import a safe import?
    type IsSafeImport = Bool

    -- | The various Safe Haskell modes
    data SafeHaskellMode
       = Sf_None          -- ^ inferred unsafe
       | Sf_Unsafe        -- ^ declared and checked
       | Sf_Trustworthy   -- ^ declared and checked
       | Sf_Safe          -- ^ declared and checked
       | Sf_SafeInferred  -- ^ inferred as safe
       | Sf_Ignore        -- ^ @-fno-safe-haskell@ state
       deriving (Eq)

    instance Show SafeHaskellMode where
        show Sf_None         = "None"
        show Sf_Unsafe       = "Unsafe"
        show Sf_Trustworthy  = "Trustworthy"
        show Sf_Safe         = "Safe"
        show Sf_SafeInferred = "Safe-Inferred"
        show Sf_Ignore       = "Ignore"

    instance Outputable SafeHaskellMode where
        ppr = text . show

    -- | Safe Haskell information for 'ModIface'
    -- Simply a wrapper around SafeHaskellMode to sepperate iface and flags
    newtype IfaceTrustInfo = TrustInfo SafeHaskellMode

    getSafeMode :: IfaceTrustInfo -> SafeHaskellMode
    getSafeMode (TrustInfo x) = x

    setSafeMode :: SafeHaskellMode -> IfaceTrustInfo
    setSafeMode = TrustInfo

    noIfaceTrustInfo :: IfaceTrustInfo
    noIfaceTrustInfo = setSafeMode Sf_None

    trustInfoToNum :: IfaceTrustInfo -> Word8
    trustInfoToNum it
      = case getSafeMode it of
                Sf_None         -> 0
                Sf_Unsafe       -> 1
                Sf_Trustworthy  -> 2
                Sf_Safe         -> 3
                Sf_SafeInferred -> 4
                Sf_Ignore       -> 0

    numToTrustInfo :: Word8 -> IfaceTrustInfo
    numToTrustInfo 0 = setSafeMode Sf_None
    numToTrustInfo 1 = setSafeMode Sf_Unsafe
    numToTrustInfo 2 = setSafeMode Sf_Trustworthy
    numToTrustInfo 3 = setSafeMode Sf_Safe
    numToTrustInfo 4 = setSafeMode Sf_SafeInferred
    numToTrustInfo n = error $ "numToTrustInfo: bad input number! (" ++ show n ++ ")"

    instance Outputable IfaceTrustInfo where
        ppr (TrustInfo Sf_None)          = text "none"
        ppr (TrustInfo Sf_Ignore)        = text "none"
        ppr (TrustInfo Sf_Unsafe)        = text "unsafe"
        ppr (TrustInfo Sf_Trustworthy)   = text "trustworthy"
        ppr (TrustInfo Sf_Safe)          = text "safe"
        ppr (TrustInfo Sf_SafeInferred)  = text "safe-inferred"

    instance Binary IfaceTrustInfo where
        put_ bh iftrust = putByte bh $ trustInfoToNum iftrust
        get bh = getByte bh >>= (return . numToTrustInfo)