{-# LANGUAGE CPP #-}

module GHC.NotExport.Plugin (plugin) where

#if MIN_VERSION_ghc(9,0,0)
import GHC.Driver.Plugins
import GHC.Types.Avail
import GHC.Types.Name
import GHC.Tc.Types
import GHC.Utils.Outputable
#else
import GhcPlugins
import Plugins
import TcRnTypes
import Avail
#endif

import Data.List (isPrefixOf)

plugin :: Plugin
plugin :: Plugin
plugin =
  Plugin
defaultPlugin
    { typeCheckResultAction = notExportPlugins,
      pluginRecompile = purePlugin
    }

notExportPlugins :: p -> p -> TcGblEnv -> m TcGblEnv
notExportPlugins p
cmdOptions p
modSummary TcGblEnv
env = do
  let updated_tcg_exports :: [AvailInfo]
updated_tcg_exports = (AvailInfo -> Bool) -> [AvailInfo] -> [AvailInfo]
forall a. (a -> Bool) -> [a] -> [a]
filter (\AvailInfo
v -> Bool -> Bool
not (CommandLineOption -> CommandLineOption -> Bool
forall a. Eq a => [a] -> [a] -> Bool
isPrefixOf CommandLineOption
"inline_c_ffi" ((SDoc -> CommandLineOption
showSDocUnsafe (SDoc -> CommandLineOption)
-> (AvailInfo -> SDoc) -> AvailInfo -> CommandLineOption
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OccName -> SDoc
forall a. Outputable a => a -> SDoc
ppr (OccName -> SDoc) -> (AvailInfo -> OccName) -> AvailInfo -> SDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> OccName
nameOccName (Name -> OccName) -> (AvailInfo -> Name) -> AvailInfo -> OccName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AvailInfo -> Name
availName) AvailInfo
v))) ([AvailInfo] -> [AvailInfo]) -> [AvailInfo] -> [AvailInfo]
forall a b. (a -> b) -> a -> b
$ TcGblEnv -> [AvailInfo]
tcg_exports TcGblEnv
env
  TcGblEnv -> m TcGblEnv
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return TcGblEnv
env {tcg_exports = updated_tcg_exports}