40 lines
1.5 KiB
Haskell
40 lines
1.5 KiB
Haskell
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
|
|
import Language.Haskell.GhcMod.Monad (IOish, GhcModT)
|
|
|
|
-- | 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
|
|
xs <- G.depanal [] False
|
|
-- FIXME, checking state
|
|
loadTargets $ needsFallback xs
|
|
where
|
|
loadTargets False = do
|
|
-- 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.
|
|
loadTargets True = do
|
|
df <- G.getSessionDynFlags
|
|
void $ G.setSessionDynFlags (setModeIntelligent df)
|
|
void $ G.load LoadAllTargets
|
|
|
|
needsFallback :: G.ModuleGraph -> Bool
|
|
needsFallback = any (hasTHorQQ . G.ms_hspp_opts)
|
|
where
|
|
hasTHorQQ :: DynFlags -> Bool
|
|
hasTHorQQ dflags = any (`xopt` dflags) [Opt_TemplateHaskell, Opt_QuasiQuotes]
|