2014-07-18 05:05:20 +00:00
|
|
|
module Language.Haskell.GhcMod.Target (
|
|
|
|
setTargetFiles
|
|
|
|
) where
|
|
|
|
|
|
|
|
import Control.Applicative ((<$>))
|
|
|
|
import Control.Monad (forM, void, (>=>))
|
|
|
|
import DynFlags (ExtensionFlag(..), xopt)
|
|
|
|
import GHC (DynFlags(..), LoadHowMuch(..))
|
|
|
|
import qualified GHC as G
|
|
|
|
import Language.Haskell.GhcMod.DynFlags
|
2014-07-19 02:53:05 +00:00
|
|
|
import Language.Haskell.GhcMod.Monad
|
2014-07-18 05:05:20 +00:00
|
|
|
|
|
|
|
-- | Set the files as targets and load them.
|
|
|
|
setTargetFiles :: IOish m => [FilePath] -> GhcModT m ()
|
|
|
|
setTargetFiles files = do
|
|
|
|
targets <- forM files $ \file -> G.guessTarget file Nothing
|
|
|
|
G.setTargets targets
|
2014-07-19 02:53:05 +00:00
|
|
|
mode <- getMode
|
|
|
|
if mode == Intelligent then
|
|
|
|
loadTargets Intelligent
|
|
|
|
else do
|
|
|
|
mdls <- G.depanal [] False
|
|
|
|
let fallback = needsFallback mdls
|
|
|
|
if fallback then do
|
|
|
|
resetTargets targets
|
|
|
|
setIntelligent
|
|
|
|
loadTargets Intelligent
|
|
|
|
else
|
|
|
|
loadTargets Simple
|
2014-07-18 05:05:20 +00:00
|
|
|
where
|
2014-07-19 02:53:05 +00:00
|
|
|
loadTargets Simple = do
|
2014-07-18 05:05:20 +00:00
|
|
|
-- Reporting error A and error B
|
|
|
|
void $ G.load LoadAllTargets
|
|
|
|
mss <- filter (\x -> G.ms_hspp_file x `elem` files) <$> G.getModuleGraph
|
|
|
|
-- Reporting error B and error C
|
|
|
|
mapM_ (G.parseModule >=> G.typecheckModule >=> G.desugarModule) mss
|
|
|
|
-- Error B duplicates. But we cannot ignore both error reportings,
|
|
|
|
-- sigh. So, the logger makes log messages unique by itself.
|
2014-07-19 02:53:05 +00:00
|
|
|
loadTargets Intelligent = do
|
2014-07-18 05:05:20 +00:00
|
|
|
df <- G.getSessionDynFlags
|
|
|
|
void $ G.setSessionDynFlags (setModeIntelligent df)
|
|
|
|
void $ G.load LoadAllTargets
|
2014-07-19 02:53:05 +00:00
|
|
|
resetTargets targets = do
|
|
|
|
G.setTargets []
|
|
|
|
void $ G.load LoadAllTargets
|
|
|
|
G.setTargets targets
|
|
|
|
setIntelligent = do
|
|
|
|
newdf <- setModeIntelligent <$> G.getSessionDynFlags
|
|
|
|
void $ G.setSessionDynFlags newdf
|
|
|
|
setMode Intelligent
|
2014-07-18 05:05:20 +00:00
|
|
|
|
|
|
|
needsFallback :: G.ModuleGraph -> Bool
|
|
|
|
needsFallback = any (hasTHorQQ . G.ms_hspp_opts)
|
|
|
|
where
|
|
|
|
hasTHorQQ :: DynFlags -> Bool
|
|
|
|
hasTHorQQ dflags = any (`xopt` dflags) [Opt_TemplateHaskell, Opt_QuasiQuotes]
|