module Language.HERMIT.Plugin
(
HermitPass
, hermitPlugin
) where
import GhcPlugins
import Data.List
import System.IO
type HermitPass = [CommandLineOption] -> ModGuts -> CoreM ModGuts
hermitPlugin :: HermitPass -> Plugin
hermitPlugin hp = defaultPlugin { installCoreToDos = install }
where
install :: [CommandLineOption] -> [CoreToDo] -> CoreM [CoreToDo]
install opts todos = do
reinitializeGlobals
liftIO $ hSetBuffering stdout NoBuffering
dynFlags <- getDynFlags
let
myPass = CoreDoPluginPass "HERMIT" $ modFilter dynFlags hp opts
allPasses = myPass : todos
return allPasses
modFilter :: DynFlags -> HermitPass -> HermitPass
modFilter dynFlags hp opts guts | null modOpts && not (null opts) = return guts
| otherwise = hp modOpts guts
where modOpts = filterOpts dynFlags opts guts
filterOpts :: DynFlags -> [CommandLineOption] -> ModGuts -> [CommandLineOption]
filterOpts dynFlags opts guts = [ drop len nm | nm <- opts, modName `isPrefixOf` nm ]
where modName = showPpr dynFlags $ mg_module guts
len = length modName + 1