Add the new GhcTools module.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Mon, 6 Apr 2009 11:48:31 +0000 (13:48 +0200)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Mon, 6 Apr 2009 11:48:31 +0000 (13:48 +0200)
This module provides a number of functions to work with GHC and the Ghc
monad.

GhcTools.hs [new file with mode: 0644]

diff --git a/GhcTools.hs b/GhcTools.hs
new file mode 100644 (file)
index 0000000..dcfab0f
--- /dev/null
@@ -0,0 +1,31 @@
+module GhcTools where
+-- Standard modules
+import qualified System.IO.Unsafe
+
+-- GHC API
+import qualified GHC
+import qualified GHC.Paths
+import qualified DynFlags
+
+-- Change a DynFlag from within the Ghc monad. Strangely enough there seems to
+-- be no standard function to do exactly this.
+setDynFlag :: DynFlags.DynFlag -> GHC.Ghc ()
+setDynFlag dflag = do
+  dflags <- GHC.getSessionDynFlags
+  let dflags' = DynFlags.dopt_set dflags dflag
+  GHC.setSessionDynFlags dflags'
+  return ()
+
+-- We don't want the IO monad sprinkled around everywhere, so we hide it.
+-- This should be safe as long as we only do simple things in the GhcMonad
+-- such as interface lookups and evaluating simple expressions that
+-- don't have side effects themselves (Or rather, that don't use
+-- unsafePerformIO themselves, since normal side effectful function would
+-- just return an IO monad when they are evaluated).
+unsafeRunGhc :: GHC.Ghc a -> a
+unsafeRunGhc m =
+  System.IO.Unsafe.unsafePerformIO $ 
+      GHC.runGhc (Just GHC.Paths.libdir) $ do
+        dflags <- GHC.getSessionDynFlags
+        GHC.setSessionDynFlags dflags
+        m