@@ -17,7 +17,6 @@ module Development.IDE.Core.Rules(
1717 runAction, useE, useNoFileE, usesE,
1818 toIdeResult, defineNoFile,
1919 mainRule,
20− getGhcCore,
2120 getAtPoint,
2221 getDefinition,
2322 getDependencies,
@@ -55,10 +54,12 @@ import Development.Shake hiding (Diagnostic)
5554import Development.IDE.Core.RuleTypes
5655
5756import GHC hiding (parseModule, typecheckModule)
57+import qualified GHC.LanguageExtensions as LangExt
5858import Development.IDE.GHC.Compat
5959import UniqSupply
6060import NameCache
6161import HscTypes
62+import DynFlags (xopt)
6263import GHC.Generics(Generic)
6364
6465import qualified Development.IDE.Spans.AtPoint as AtPoint
@@ -92,16 +93,6 @@ defineNoFile f = define $ \k file -> do
9293------------------------------------------------------------
9394-- Exposed API
9495
95−
96−-- | Generate the GHC Core for the supplied file and its dependencies.
97−getGhcCore :: NormalizedFilePath -> Action (Maybe [CoreModule])
98−getGhcCore file = runMaybeT $ do
99− files <- transitiveModuleDeps <$> useE GetDependencies file
100− pms <- usesE GetParsedModule $ files ++ [file]
101− usesE GenerateCore $ map fileFromParsedModule pms
102−
103−
104−
10596-- | Get all transitive file dependencies of a given module.
10697-- Does not include the file itself.
10798getDependencies :: NormalizedFilePath -> Action (Maybe [NormalizedFilePath])
@@ -281,13 +272,27 @@ typeCheckRule =
281272 define $ \TypeCheck file -> do
282273 pm <- use_ GetParsedModule file
283274 deps <- use_ GetDependencies file
284− tms <- uses_ TypeCheck (transitiveModuleDeps deps)
285− setPriority priorityTypeCheck
286275 packageState <- hscEnv <$> use_ GhcSession file
276+ -- Figure out whether we need TemplateHaskell or QuasiQuotes support
277+ let graph_needs_th_qq = needsTemplateHaskellOrQQ $ hsc_mod_graph packageState
278+ file_uses_th_qq = uses_th_qq $ ms_hspp_opts (pm_mod_summary pm)
279+ any_uses_th_qq = graph_needs_th_qq || file_uses_th_qq
280+ tms <- if any_uses_th_qq
281+ -- If we use TH or QQ, we must obtain the bytecode
282+ then do
283+ bytecodes <- uses_ GenerateByteCode (transitiveModuleDeps deps)
284+ tmrs <- uses_ TypeCheck (transitiveModuleDeps deps)
285+ pure (zipWith addByteCode bytecodes tmrs)
286+ else uses_ TypeCheck (transitiveModuleDeps deps)
287+ setPriority priorityTypeCheck
287288 IdeOptions{ optDefer = defer} <- getIdeOptions
288289 liftIO $ typecheckModule defer packageState tms pm
290+ where
291+ uses_th_qq dflags = xopt LangExt.TemplateHaskell dflags || xopt LangExt.QuasiQuotes dflags
292+ addByteCode :: Linkable -> TcModuleResult -> TcModuleResult
293+ addByteCode lm tmr = tmr { tmrModInfo = (tmrModInfo tmr) { hm_linkable = Just lm } }
289294
290−generateCore :: NormalizedFilePath -> Action (IdeResult CoreModule)
295+generateCore :: NormalizedFilePath -> Action (IdeResult (SafeHaskellMode, CgGuts, ModDetails))
291296generateCore file = do
292297 deps <- use_ GetDependencies file
293298 (tm:tms) <- uses_ TypeCheck (file:transitiveModuleDeps deps)
@@ -299,6 +304,14 @@ generateCoreRule :: Rules ()
299304generateCoreRule =
300305 define $ \GenerateCore -> generateCore
301306
307+generateByteCodeRule :: Rules ()
308+generateByteCodeRule =
309+ define $ \GenerateByteCode file -> do
310+ deps <- use_ GetDependencies file
311+ (tm : tms) <- uses_ TypeCheck (file: transitiveModuleDeps deps)
312+ session <- hscEnv <$> use_ GhcSession file
313+ (_, guts, _) <- use_ GenerateCore file
314+ liftIO $ generateByteCode session tms tm guts
302315
303316-- A local rule type to get caching. We want to use newCache, but it has
304317-- thread killed exception issues, so we lift it to a full rule.
@@ -345,6 +358,7 @@ mainRule = do
345358 typeCheckRule
346359 getSpanInfoRule
347360 generateCoreRule
361+ generateByteCodeRule
348362 loadGhcSession
349363 getHieFileRule
350364