-- | Datatype definitions for the flag representation stored in interface files
module GHC.Iface.Flags (
     IfaceDynFlags(..)
   , IfaceGeneralFlag(..)
   , IfaceProfAuto(..)
   , IfaceExtension(..)
   , IfaceLanguage(..)
   , IfaceCppOptions(..)
   , pprIfaceDynFlags
   , missingExtraFlagInfo
   ) where

import GHC.Prelude

import GHC.Utils.Outputable
import Control.DeepSeq
import GHC.Utils.Fingerprint
import GHC.Utils.Binary

import GHC.Driver.DynFlags
import GHC.Types.SafeHaskell
import GHC.Core.Opt.CallerCC.Types

import qualified GHC.LanguageExtensions as LangExt

-- The part of DynFlags which recompilation information needs
data IfaceDynFlags = IfaceDynFlags
        { IfaceDynFlags -> Maybe (Maybe String)
ifaceMainIs :: Maybe (Maybe String)
        , IfaceDynFlags -> IfaceTrustInfo
ifaceSafeMode :: IfaceTrustInfo
        , IfaceDynFlags -> Maybe IfaceLanguage
ifaceLang :: Maybe IfaceLanguage
        , IfaceDynFlags -> [IfaceExtension]
ifaceExts :: [IfaceExtension]
        , IfaceDynFlags -> IfaceCppOptions
ifaceCppOptions :: IfaceCppOptions
        , IfaceDynFlags -> IfaceCppOptions
ifaceJsOptions  :: IfaceCppOptions
        , IfaceDynFlags -> IfaceCppOptions
ifaceCmmOptions :: IfaceCppOptions
        , IfaceDynFlags -> [String]
ifacePaths :: [String]
        , IfaceDynFlags -> Maybe IfaceProfAuto
ifaceProf  :: Maybe IfaceProfAuto
        , IfaceDynFlags -> [IfaceGeneralFlag]
ifaceTicky :: [IfaceGeneralFlag]
        , IfaceDynFlags -> [IfaceGeneralFlag]
ifaceCodeGen :: [IfaceGeneralFlag]
        , IfaceDynFlags -> Bool
ifaceFatIface :: Bool
        , IfaceDynFlags -> Int
ifaceDebugLevel :: Int
        , IfaceDynFlags -> [CallerCcFilter]
ifaceCallerCCFilters :: [CallerCcFilter]
        }

pprIfaceDynFlags :: IfaceDynFlags -> SDoc
pprIfaceDynFlags :: IfaceDynFlags -> SDoc
pprIfaceDynFlags (IfaceDynFlags Maybe (Maybe String)
a1 IfaceTrustInfo
a2 Maybe IfaceLanguage
a3 [IfaceExtension]
a4 IfaceCppOptions
a5 IfaceCppOptions
a6 IfaceCppOptions
a7 [String]
a8 Maybe IfaceProfAuto
a9 [IfaceGeneralFlag]
a10 [IfaceGeneralFlag]
a11 Bool
a12 Int
a13 [CallerCcFilter]
a14) =
  [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [ String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"main-is:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> (Maybe (Maybe SDoc) -> SDoc
forall a. Outputable a => a -> SDoc
ppr (Maybe (Maybe SDoc) -> SDoc) -> Maybe (Maybe SDoc) -> SDoc
forall a b. (a -> b) -> a -> b
$ (Maybe String -> Maybe SDoc)
-> Maybe (Maybe String) -> Maybe (Maybe SDoc)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((String -> SDoc) -> Maybe String -> Maybe SDoc
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall doc. IsLine doc => String -> doc
text @SDoc)) Maybe (Maybe String)
a1)
       , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"safe-mode:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> IfaceTrustInfo -> SDoc
forall a. Outputable a => a -> SDoc
ppr IfaceTrustInfo
a2
       , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"lang:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Maybe IfaceLanguage -> SDoc
forall a. Outputable a => a -> SDoc
ppr Maybe IfaceLanguage
a3
       , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"exts:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> [IfaceExtension] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [IfaceExtension]
a4
       , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"cpp-options:"
       , Int -> SDoc -> SDoc
nest Int
2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ IfaceCppOptions -> SDoc
forall a. Outputable a => a -> SDoc
ppr IfaceCppOptions
a5
       , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"js-options:"
       , Int -> SDoc -> SDoc
nest Int
2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ IfaceCppOptions -> SDoc
forall a. Outputable a => a -> SDoc
ppr IfaceCppOptions
a6
       , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"cmm-options:"
       , Int -> SDoc -> SDoc
nest Int
2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ IfaceCppOptions -> SDoc
forall a. Outputable a => a -> SDoc
ppr IfaceCppOptions
a7
       , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"paths:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> [SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
hcat ((String -> SDoc) -> [String] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map String -> SDoc
forall doc. IsLine doc => String -> doc
text [String]
a8)
       , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"prof:"  SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Maybe IfaceProfAuto -> SDoc
forall a. Outputable a => a -> SDoc
ppr Maybe IfaceProfAuto
a9
       , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"ticky:"
       , Int -> SDoc -> SDoc
nest Int
2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat ((IfaceGeneralFlag -> SDoc) -> [IfaceGeneralFlag] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map IfaceGeneralFlag -> SDoc
forall a. Outputable a => a -> SDoc
ppr [IfaceGeneralFlag]
a10)
       , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"codegen:"
       , Int -> SDoc -> SDoc
nest Int
2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat ((IfaceGeneralFlag -> SDoc) -> [IfaceGeneralFlag] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map IfaceGeneralFlag -> SDoc
forall a. Outputable a => a -> SDoc
ppr [IfaceGeneralFlag]
a11)
       , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"fat-iface:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Bool -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bool
a12
       , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"debug-level:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> Int -> SDoc
forall a. Outputable a => a -> SDoc
ppr Int
a13
       , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"caller-cc-filters:" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> [CallerCcFilter] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [CallerCcFilter]
a14
       ]

missingExtraFlagInfo :: SDoc
missingExtraFlagInfo :: SDoc
missingExtraFlagInfo = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"flags: no detailed info, recompile with -fwrite-if-self-recomp-flags"
  where
    -- If you modify the name of this flag, you have to modify this string.
    _placeholder :: GeneralFlag
_placeholder = GeneralFlag
Opt_WriteSelfRecompFlags

instance Binary IfaceDynFlags where
  put_ :: WriteBinHandle -> IfaceDynFlags -> IO ()
put_ WriteBinHandle
bh (IfaceDynFlags Maybe (Maybe String)
a1 IfaceTrustInfo
a2 Maybe IfaceLanguage
a3 [IfaceExtension]
a4 IfaceCppOptions
a5 IfaceCppOptions
a6 IfaceCppOptions
a7 [String]
a8 Maybe IfaceProfAuto
a9 [IfaceGeneralFlag]
a10 [IfaceGeneralFlag]
a11 Bool
a12 Int
a13 [CallerCcFilter]
a14) = do
    WriteBinHandle -> Maybe (Maybe String) -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh Maybe (Maybe String)
a1
    WriteBinHandle -> IfaceTrustInfo -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh IfaceTrustInfo
a2
    WriteBinHandle -> Maybe IfaceLanguage -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh Maybe IfaceLanguage
a3
    WriteBinHandle -> [IfaceExtension] -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh [IfaceExtension]
a4
    WriteBinHandle -> IfaceCppOptions -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh IfaceCppOptions
a5
    WriteBinHandle -> IfaceCppOptions -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh IfaceCppOptions
a6
    WriteBinHandle -> IfaceCppOptions -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh IfaceCppOptions
a7
    WriteBinHandle -> [String] -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh [String]
a8
    WriteBinHandle -> Maybe IfaceProfAuto -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh Maybe IfaceProfAuto
a9
    WriteBinHandle -> [IfaceGeneralFlag] -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh [IfaceGeneralFlag]
a10
    WriteBinHandle -> [IfaceGeneralFlag] -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh [IfaceGeneralFlag]
a11
    WriteBinHandle -> Bool -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh Bool
a12
    WriteBinHandle -> Int -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh Int
a13
    WriteBinHandle -> [CallerCcFilter] -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh [CallerCcFilter]
a14
  get :: ReadBinHandle -> IO IfaceDynFlags
get ReadBinHandle
bh = Maybe (Maybe String)
-> IfaceTrustInfo
-> Maybe IfaceLanguage
-> [IfaceExtension]
-> IfaceCppOptions
-> IfaceCppOptions
-> IfaceCppOptions
-> [String]
-> Maybe IfaceProfAuto
-> [IfaceGeneralFlag]
-> [IfaceGeneralFlag]
-> Bool
-> Int
-> [CallerCcFilter]
-> IfaceDynFlags
IfaceDynFlags (Maybe (Maybe String)
 -> IfaceTrustInfo
 -> Maybe IfaceLanguage
 -> [IfaceExtension]
 -> IfaceCppOptions
 -> IfaceCppOptions
 -> IfaceCppOptions
 -> [String]
 -> Maybe IfaceProfAuto
 -> [IfaceGeneralFlag]
 -> [IfaceGeneralFlag]
 -> Bool
 -> Int
 -> [CallerCcFilter]
 -> IfaceDynFlags)
-> IO (Maybe (Maybe String))
-> IO
     (IfaceTrustInfo
      -> Maybe IfaceLanguage
      -> [IfaceExtension]
      -> IfaceCppOptions
      -> IfaceCppOptions
      -> IfaceCppOptions
      -> [String]
      -> Maybe IfaceProfAuto
      -> [IfaceGeneralFlag]
      -> [IfaceGeneralFlag]
      -> Bool
      -> Int
      -> [CallerCcFilter]
      -> IfaceDynFlags)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadBinHandle -> IO (Maybe (Maybe String))
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh
                         IO
  (IfaceTrustInfo
   -> Maybe IfaceLanguage
   -> [IfaceExtension]
   -> IfaceCppOptions
   -> IfaceCppOptions
   -> IfaceCppOptions
   -> [String]
   -> Maybe IfaceProfAuto
   -> [IfaceGeneralFlag]
   -> [IfaceGeneralFlag]
   -> Bool
   -> Int
   -> [CallerCcFilter]
   -> IfaceDynFlags)
-> IO IfaceTrustInfo
-> IO
     (Maybe IfaceLanguage
      -> [IfaceExtension]
      -> IfaceCppOptions
      -> IfaceCppOptions
      -> IfaceCppOptions
      -> [String]
      -> Maybe IfaceProfAuto
      -> [IfaceGeneralFlag]
      -> [IfaceGeneralFlag]
      -> Bool
      -> Int
      -> [CallerCcFilter]
      -> IfaceDynFlags)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO IfaceTrustInfo
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh
                         IO
  (Maybe IfaceLanguage
   -> [IfaceExtension]
   -> IfaceCppOptions
   -> IfaceCppOptions
   -> IfaceCppOptions
   -> [String]
   -> Maybe IfaceProfAuto
   -> [IfaceGeneralFlag]
   -> [IfaceGeneralFlag]
   -> Bool
   -> Int
   -> [CallerCcFilter]
   -> IfaceDynFlags)
-> IO (Maybe IfaceLanguage)
-> IO
     ([IfaceExtension]
      -> IfaceCppOptions
      -> IfaceCppOptions
      -> IfaceCppOptions
      -> [String]
      -> Maybe IfaceProfAuto
      -> [IfaceGeneralFlag]
      -> [IfaceGeneralFlag]
      -> Bool
      -> Int
      -> [CallerCcFilter]
      -> IfaceDynFlags)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO (Maybe IfaceLanguage)
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh
                         IO
  ([IfaceExtension]
   -> IfaceCppOptions
   -> IfaceCppOptions
   -> IfaceCppOptions
   -> [String]
   -> Maybe IfaceProfAuto
   -> [IfaceGeneralFlag]
   -> [IfaceGeneralFlag]
   -> Bool
   -> Int
   -> [CallerCcFilter]
   -> IfaceDynFlags)
-> IO [IfaceExtension]
-> IO
     (IfaceCppOptions
      -> IfaceCppOptions
      -> IfaceCppOptions
      -> [String]
      -> Maybe IfaceProfAuto
      -> [IfaceGeneralFlag]
      -> [IfaceGeneralFlag]
      -> Bool
      -> Int
      -> [CallerCcFilter]
      -> IfaceDynFlags)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO [IfaceExtension]
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh
                         IO
  (IfaceCppOptions
   -> IfaceCppOptions
   -> IfaceCppOptions
   -> [String]
   -> Maybe IfaceProfAuto
   -> [IfaceGeneralFlag]
   -> [IfaceGeneralFlag]
   -> Bool
   -> Int
   -> [CallerCcFilter]
   -> IfaceDynFlags)
-> IO IfaceCppOptions
-> IO
     (IfaceCppOptions
      -> IfaceCppOptions
      -> [String]
      -> Maybe IfaceProfAuto
      -> [IfaceGeneralFlag]
      -> [IfaceGeneralFlag]
      -> Bool
      -> Int
      -> [CallerCcFilter]
      -> IfaceDynFlags)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO IfaceCppOptions
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh
                         IO
  (IfaceCppOptions
   -> IfaceCppOptions
   -> [String]
   -> Maybe IfaceProfAuto
   -> [IfaceGeneralFlag]
   -> [IfaceGeneralFlag]
   -> Bool
   -> Int
   -> [CallerCcFilter]
   -> IfaceDynFlags)
-> IO IfaceCppOptions
-> IO
     (IfaceCppOptions
      -> [String]
      -> Maybe IfaceProfAuto
      -> [IfaceGeneralFlag]
      -> [IfaceGeneralFlag]
      -> Bool
      -> Int
      -> [CallerCcFilter]
      -> IfaceDynFlags)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO IfaceCppOptions
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh
                         IO
  (IfaceCppOptions
   -> [String]
   -> Maybe IfaceProfAuto
   -> [IfaceGeneralFlag]
   -> [IfaceGeneralFlag]
   -> Bool
   -> Int
   -> [CallerCcFilter]
   -> IfaceDynFlags)
-> IO IfaceCppOptions
-> IO
     ([String]
      -> Maybe IfaceProfAuto
      -> [IfaceGeneralFlag]
      -> [IfaceGeneralFlag]
      -> Bool
      -> Int
      -> [CallerCcFilter]
      -> IfaceDynFlags)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO IfaceCppOptions
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh
                         IO
  ([String]
   -> Maybe IfaceProfAuto
   -> [IfaceGeneralFlag]
   -> [IfaceGeneralFlag]
   -> Bool
   -> Int
   -> [CallerCcFilter]
   -> IfaceDynFlags)
-> IO [String]
-> IO
     (Maybe IfaceProfAuto
      -> [IfaceGeneralFlag]
      -> [IfaceGeneralFlag]
      -> Bool
      -> Int
      -> [CallerCcFilter]
      -> IfaceDynFlags)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO [String]
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh
                         IO
  (Maybe IfaceProfAuto
   -> [IfaceGeneralFlag]
   -> [IfaceGeneralFlag]
   -> Bool
   -> Int
   -> [CallerCcFilter]
   -> IfaceDynFlags)
-> IO (Maybe IfaceProfAuto)
-> IO
     ([IfaceGeneralFlag]
      -> [IfaceGeneralFlag]
      -> Bool
      -> Int
      -> [CallerCcFilter]
      -> IfaceDynFlags)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO (Maybe IfaceProfAuto)
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh
                         IO
  ([IfaceGeneralFlag]
   -> [IfaceGeneralFlag]
   -> Bool
   -> Int
   -> [CallerCcFilter]
   -> IfaceDynFlags)
-> IO [IfaceGeneralFlag]
-> IO
     ([IfaceGeneralFlag]
      -> Bool -> Int -> [CallerCcFilter] -> IfaceDynFlags)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO [IfaceGeneralFlag]
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh
                         IO
  ([IfaceGeneralFlag]
   -> Bool -> Int -> [CallerCcFilter] -> IfaceDynFlags)
-> IO [IfaceGeneralFlag]
-> IO (Bool -> Int -> [CallerCcFilter] -> IfaceDynFlags)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO [IfaceGeneralFlag]
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh
                         IO (Bool -> Int -> [CallerCcFilter] -> IfaceDynFlags)
-> IO Bool -> IO (Int -> [CallerCcFilter] -> IfaceDynFlags)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO Bool
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh
                         IO (Int -> [CallerCcFilter] -> IfaceDynFlags)
-> IO Int -> IO ([CallerCcFilter] -> IfaceDynFlags)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO Int
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh
                         IO ([CallerCcFilter] -> IfaceDynFlags)
-> IO [CallerCcFilter] -> IO IfaceDynFlags
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO [CallerCcFilter]
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh

instance NFData IfaceDynFlags where
  rnf :: IfaceDynFlags -> ()
rnf (IfaceDynFlags Maybe (Maybe String)
a1 IfaceTrustInfo
a2 Maybe IfaceLanguage
a3 [IfaceExtension]
a4 IfaceCppOptions
a5 IfaceCppOptions
a6 IfaceCppOptions
a7 [String]
a8 Maybe IfaceProfAuto
a9 [IfaceGeneralFlag]
a10 [IfaceGeneralFlag]
a11 Bool
a12 Int
a13 [CallerCcFilter]
a14) =
          Maybe (Maybe String) -> ()
forall a. NFData a => a -> ()
rnf Maybe (Maybe String)
a1
    () -> () -> ()
forall a b. a -> b -> b
`seq` IfaceTrustInfo -> ()
forall a. NFData a => a -> ()
rnf IfaceTrustInfo
a2
    () -> () -> ()
forall a b. a -> b -> b
`seq` Maybe IfaceLanguage -> ()
forall a. NFData a => a -> ()
rnf Maybe IfaceLanguage
a3
    () -> () -> ()
forall a b. a -> b -> b
`seq` [IfaceExtension] -> ()
forall a. NFData a => a -> ()
rnf [IfaceExtension]
a4
    () -> () -> ()
forall a b. a -> b -> b
`seq` IfaceCppOptions -> ()
forall a. NFData a => a -> ()
rnf IfaceCppOptions
a5
    () -> () -> ()
forall a b. a -> b -> b
`seq` IfaceCppOptions -> ()
forall a. NFData a => a -> ()
rnf IfaceCppOptions
a6
    () -> () -> ()
forall a b. a -> b -> b
`seq` IfaceCppOptions -> ()
forall a. NFData a => a -> ()
rnf IfaceCppOptions
a7
    () -> () -> ()
forall a b. a -> b -> b
`seq` [String] -> ()
forall a. NFData a => a -> ()
rnf [String]
a8
    () -> () -> ()
forall a b. a -> b -> b
`seq` Maybe IfaceProfAuto -> ()
forall a. NFData a => a -> ()
rnf Maybe IfaceProfAuto
a9
    () -> () -> ()
forall a b. a -> b -> b
`seq` [IfaceGeneralFlag] -> ()
forall a. NFData a => a -> ()
rnf [IfaceGeneralFlag]
a10
    () -> () -> ()
forall a b. a -> b -> b
`seq` [IfaceGeneralFlag] -> ()
forall a. NFData a => a -> ()
rnf [IfaceGeneralFlag]
a11
    () -> () -> ()
forall a b. a -> b -> b
`seq` Bool -> ()
forall a. NFData a => a -> ()
rnf Bool
a12
    () -> () -> ()
forall a b. a -> b -> b
`seq` Int -> ()
forall a. NFData a => a -> ()
rnf Int
a13
    () -> () -> ()
forall a b. a -> b -> b
`seq` [CallerCcFilter] -> ()
forall a. NFData a => a -> ()
rnf [CallerCcFilter]
a14

newtype IfaceGeneralFlag = IfaceGeneralFlag GeneralFlag

instance NFData IfaceGeneralFlag where
  rnf :: IfaceGeneralFlag -> ()
rnf (IfaceGeneralFlag !GeneralFlag
_) = ()

instance Binary IfaceGeneralFlag where
  put_ :: WriteBinHandle -> IfaceGeneralFlag -> IO ()
put_ WriteBinHandle
bh (IfaceGeneralFlag GeneralFlag
f) = WriteBinHandle -> Int -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh (GeneralFlag -> Int
forall a. Enum a => a -> Int
fromEnum GeneralFlag
f)
  get :: ReadBinHandle -> IO IfaceGeneralFlag
get ReadBinHandle
bh = GeneralFlag -> IfaceGeneralFlag
IfaceGeneralFlag (GeneralFlag -> IfaceGeneralFlag)
-> (Int -> GeneralFlag) -> Int -> IfaceGeneralFlag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> GeneralFlag
forall a. Enum a => Int -> a
toEnum (Int -> IfaceGeneralFlag) -> IO Int -> IO IfaceGeneralFlag
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadBinHandle -> IO Int
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh

instance Outputable IfaceGeneralFlag where
  ppr :: IfaceGeneralFlag -> SDoc
ppr (IfaceGeneralFlag GeneralFlag
f) = String -> SDoc
forall doc. IsLine doc => String -> doc
text (GeneralFlag -> String
forall a. Show a => a -> String
show GeneralFlag
f)

newtype IfaceProfAuto = IfaceProfAuto ProfAuto

instance NFData IfaceProfAuto where
  rnf :: IfaceProfAuto -> ()
rnf (IfaceProfAuto !ProfAuto
_) = ()

instance Binary IfaceProfAuto where
  put_ :: WriteBinHandle -> IfaceProfAuto -> IO ()
put_ WriteBinHandle
bh (IfaceProfAuto ProfAuto
f) = WriteBinHandle -> Int -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh (ProfAuto -> Int
forall a. Enum a => a -> Int
fromEnum ProfAuto
f)
  get :: ReadBinHandle -> IO IfaceProfAuto
get ReadBinHandle
bh = ProfAuto -> IfaceProfAuto
IfaceProfAuto (ProfAuto -> IfaceProfAuto)
-> (Int -> ProfAuto) -> Int -> IfaceProfAuto
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ProfAuto
forall a. Enum a => Int -> a
toEnum (Int -> IfaceProfAuto) -> IO Int -> IO IfaceProfAuto
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadBinHandle -> IO Int
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh

instance Outputable IfaceProfAuto where
  ppr :: IfaceProfAuto -> SDoc
ppr (IfaceProfAuto ProfAuto
f) = String -> SDoc
forall doc. IsLine doc => String -> doc
text (ProfAuto -> String
forall a. Show a => a -> String
show ProfAuto
f)


newtype IfaceExtension = IfaceExtension LangExt.Extension

instance NFData IfaceExtension where
  rnf :: IfaceExtension -> ()
rnf (IfaceExtension !Extension
_) = ()

instance Binary IfaceExtension where
  put_ :: WriteBinHandle -> IfaceExtension -> IO ()
put_ WriteBinHandle
bh (IfaceExtension Extension
f) = WriteBinHandle -> Int -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh (Extension -> Int
forall a. Enum a => a -> Int
fromEnum Extension
f)
  get :: ReadBinHandle -> IO IfaceExtension
get ReadBinHandle
bh = Extension -> IfaceExtension
IfaceExtension (Extension -> IfaceExtension)
-> (Int -> Extension) -> Int -> IfaceExtension
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Extension
forall a. Enum a => Int -> a
toEnum (Int -> IfaceExtension) -> IO Int -> IO IfaceExtension
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadBinHandle -> IO Int
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh

instance Outputable IfaceExtension where
  ppr :: IfaceExtension -> SDoc
ppr (IfaceExtension Extension
f) = String -> SDoc
forall doc. IsLine doc => String -> doc
text (Extension -> String
forall a. Show a => a -> String
show Extension
f)

newtype IfaceLanguage = IfaceLanguage Language

instance NFData IfaceLanguage where
  rnf :: IfaceLanguage -> ()
rnf (IfaceLanguage !Language
_) = ()

instance Binary IfaceLanguage where
  put_ :: WriteBinHandle -> IfaceLanguage -> IO ()
put_ WriteBinHandle
bh (IfaceLanguage Language
f) = WriteBinHandle -> Int -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh (Language -> Int
forall a. Enum a => a -> Int
fromEnum Language
f)
  get :: ReadBinHandle -> IO IfaceLanguage
get ReadBinHandle
bh = Language -> IfaceLanguage
IfaceLanguage (Language -> IfaceLanguage)
-> (Int -> Language) -> Int -> IfaceLanguage
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Language
forall a. Enum a => Int -> a
toEnum (Int -> IfaceLanguage) -> IO Int -> IO IfaceLanguage
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadBinHandle -> IO Int
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh

instance Outputable IfaceLanguage where
  ppr :: IfaceLanguage -> SDoc
ppr (IfaceLanguage Language
f) = String -> SDoc
forall doc. IsLine doc => String -> doc
text (Language -> String
forall a. Show a => a -> String
show Language
f)

data IfaceCppOptions = IfaceCppOptions { IfaceCppOptions -> [String]
ifaceCppIncludes :: [FilePath]
                                       , IfaceCppOptions -> [String]
ifaceCppOpts :: [String]
                                       , IfaceCppOptions -> ([String], Fingerprint)
ifaceCppSig :: ([String], Fingerprint)
                                       }

instance NFData IfaceCppOptions where
  rnf :: IfaceCppOptions -> ()
rnf (IfaceCppOptions [String]
is [String]
os ([String], Fingerprint)
s) = [String] -> ()
forall a. NFData a => a -> ()
rnf [String]
is () -> () -> ()
forall a b. a -> b -> b
`seq` [String] -> ()
forall a. NFData a => a -> ()
rnf [String]
os () -> () -> ()
forall a b. a -> b -> b
`seq` ([String], Fingerprint) -> ()
forall a. NFData a => a -> ()
rnf ([String], Fingerprint)
s

instance Binary IfaceCppOptions where
  put_ :: WriteBinHandle -> IfaceCppOptions -> IO ()
put_ WriteBinHandle
bh (IfaceCppOptions [String]
is [String]
os ([String], Fingerprint)
s) = do
     WriteBinHandle -> [String] -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh [String]
is
     WriteBinHandle -> [String] -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh [String]
os
     WriteBinHandle -> ([String], Fingerprint) -> IO ()
forall a. Binary a => WriteBinHandle -> a -> IO ()
put_ WriteBinHandle
bh ([String], Fingerprint)
s
  get :: ReadBinHandle -> IO IfaceCppOptions
get ReadBinHandle
bh = [String] -> [String] -> ([String], Fingerprint) -> IfaceCppOptions
IfaceCppOptions ([String]
 -> [String] -> ([String], Fingerprint) -> IfaceCppOptions)
-> IO [String]
-> IO ([String] -> ([String], Fingerprint) -> IfaceCppOptions)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadBinHandle -> IO [String]
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh IO ([String] -> ([String], Fingerprint) -> IfaceCppOptions)
-> IO [String] -> IO (([String], Fingerprint) -> IfaceCppOptions)
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO [String]
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh IO (([String], Fingerprint) -> IfaceCppOptions)
-> IO ([String], Fingerprint) -> IO IfaceCppOptions
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ReadBinHandle -> IO ([String], Fingerprint)
forall a. Binary a => ReadBinHandle -> IO a
get ReadBinHandle
bh

instance Outputable IfaceCppOptions where
  ppr :: IfaceCppOptions -> SDoc
ppr (IfaceCppOptions [String]
is [String]
os ([String]
wos, Fingerprint
fp)) =
        [SDoc] -> SDoc
forall doc. IsDoc doc => [doc] -> doc
vcat [String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"includes:"
             , Int -> SDoc -> SDoc
nest Int
2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
hcat ((String -> SDoc) -> [String] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map String -> SDoc
forall doc. IsLine doc => String -> doc
text [String]
is)
             , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"opts:"
             , Int -> SDoc -> SDoc
nest Int
2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
forall doc. IsLine doc => [doc] -> doc
hcat ((String -> SDoc) -> [String] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map String -> SDoc
forall doc. IsLine doc => String -> doc
text [String]
os)
             , String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"signature:"
             , Int -> SDoc -> SDoc
nest Int
2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
parens (Fingerprint -> SDoc
forall a. Outputable a => a -> SDoc
ppr Fingerprint
fp) SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> [SDoc] -> SDoc
forall a. Outputable a => a -> SDoc
ppr ((String -> SDoc) -> [String] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map (forall doc. IsLine doc => String -> doc
text @SDoc) [String]
wos)

             ]