Commit 8305bb16 authored by Thomas Schilling's avatar Thomas Schilling
Browse files

Add 'needsTemplateHaskell' utility function and document why one might

want to use it.
parent 3eb04da9
...@@ -439,23 +439,30 @@ data DynFlags = DynFlags { ...@@ -439,23 +439,30 @@ data DynFlags = DynFlags {
-- | The target code type of the compilation (if any). -- | The target code type of the compilation (if any).
-- --
-- Whenever you change the target, also make sure to set 'ghcLink' to
-- something sensible.
--
-- 'HscNothing' can be used to avoid generating any output, however, note -- 'HscNothing' can be used to avoid generating any output, however, note
-- that: -- that:
-- --
-- * This will not run the desugaring step, thus no warnings generated in -- * This will not run the desugaring step, thus no warnings generated in
-- this step will be output. In particular, this includes warnings -- this step will be output. In particular, this includes warnings related
-- related to pattern matching. -- to pattern matching. You can run the desugarer manually using
-- 'GHC.desugarModule'.
-- --
-- * At the moment switching from 'HscNothing' to 'HscInterpreted' without -- * If a program uses Template Haskell the typechecker may try to run code
-- unloading first is not safe. To unload use -- from an imported module. This will fail if no code has been generated
-- @GHC.setTargets [] >> GHC.load LoadAllTargets@. -- for this module. You can use 'GHC.needsTemplateHaskell' to detect
-- whether this might be the case and choose to either switch to a
-- different target or avoid typechecking such modules. (The latter may
-- preferable for security reasons.)
-- --
data HscTarget data HscTarget
= HscC = HscC -- ^ Generate C code.
| HscAsm | HscAsm -- ^ Generate assembly using the native code generator.
| HscJava | HscJava -- ^ Generate Java bytecode.
| HscInterpreted | HscInterpreted -- ^ Generate bytecode. (Requires 'LinkInMemory')
| HscNothing | HscNothing -- ^ Don't generate any code. See notes above.
deriving (Eq, Show) deriving (Eq, Show)
-- | Will this target result in an object file on the disk? -- | Will this target result in an object file on the disk?
...@@ -489,7 +496,8 @@ isOneShot _other = False ...@@ -489,7 +496,8 @@ isOneShot _other = False
data GhcLink data GhcLink
= NoLink -- ^ Don't link at all = NoLink -- ^ Don't link at all
| LinkBinary -- ^ Link object code into a binary | LinkBinary -- ^ Link object code into a binary
| LinkInMemory -- ^ Use the in-memory dynamic linker | LinkInMemory -- ^ Use the in-memory dynamic linker (works for both
-- bytecode and object code).
| LinkDynLib -- ^ Link objects into a dynamic lib (DLL on Windows, DSO on ELF platforms) | LinkDynLib -- ^ Link objects into a dynamic lib (DLL on Windows, DSO on ELF platforms)
deriving (Eq, Show) deriving (Eq, Show)
......
...@@ -18,6 +18,7 @@ module GHC ( ...@@ -18,6 +18,7 @@ module GHC (
clearWarnings, getWarnings, hasWarnings, clearWarnings, getWarnings, hasWarnings,
printExceptionAndWarnings, printWarnings, printExceptionAndWarnings, printWarnings,
handleSourceError, defaultCallbacks, GhcApiCallbacks(..), handleSourceError, defaultCallbacks, GhcApiCallbacks(..),
needsTemplateHaskell,
-- * Flags and settings -- * Flags and settings
DynFlags(..), DynFlag(..), Severity(..), HscTarget(..), dopt, DynFlags(..), DynFlag(..), Severity(..), HscTarget(..), dopt,
...@@ -2349,6 +2350,15 @@ workingDirectoryChanged = withSession $ (liftIO . flushFinderCaches) ...@@ -2349,6 +2350,15 @@ workingDirectoryChanged = withSession $ (liftIO . flushFinderCaches)
getModuleGraph :: GhcMonad m => m ModuleGraph -- ToDo: DiGraph ModSummary getModuleGraph :: GhcMonad m => m ModuleGraph -- ToDo: DiGraph ModSummary
getModuleGraph = liftM hsc_mod_graph getSession getModuleGraph = liftM hsc_mod_graph getSession
-- | Determines whether a set of modules requires Template Haskell.
--
-- Note that if the session's 'DynFlags' enabled Template Haskell when
-- 'depanal' was called, then each module in the returned module graph will
-- have Template Haskell enabled whether it is actually needed or not.
needsTemplateHaskell :: ModuleGraph -> Bool
needsTemplateHaskell ms =
any (dopt Opt_TemplateHaskell . ms_hspp_opts) ms
-- | Return @True@ <==> module is loaded. -- | Return @True@ <==> module is loaded.
isLoaded :: GhcMonad m => ModuleName -> m Bool isLoaded :: GhcMonad m => ModuleName -> m Bool
isLoaded m = withSession $ \hsc_env -> isLoaded m = withSession $ \hsc_env ->
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment