module CoreDump (plugin) where
import GhcPlugins
import Data.IORef (writeIORef)
import Data.List (intersperse)
import Text.Show.Pretty (ppDoc)
import Text.PrettyPrint
import CoreDump.Show
plugin :: Plugin
plugin = defaultPlugin{installCoreToDos = installPlugin}
where
installPlugin :: [CommandLineOption] -> [CoreToDo] -> CoreM [CoreToDo]
installPlugin opts todos = do
getDynFlags >>= liftIO . writeIORef dynFlags_ref
return $ concat
[ if before then [CoreDoPluginPass "CoreDump - before" pluginPass] else []
, todos
, if after then [CoreDoPluginPass "CoreDump - after" pluginPass] else []
]
where
both = "both" `elem` opts
before = "before" `elem` opts || both
after = "after" `elem` opts || both
pluginPass :: ModGuts -> CoreM ModGuts
pluginPass guts@ModGuts{ mg_binds = binds } = do
liftIO $ mapM_ putStrLn $ intersperse "" $
map (renderStyle (Style PageMode 100 1.0) . ppDoc) binds
return guts