diff options
author | Alec Theriault <alec.theriault@gmail.com> | 2018-08-21 16:03:40 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2018-08-21 18:56:05 -0400 |
commit | c971e1193fa44bb507d1806d5bb61768670dc912 (patch) | |
tree | cbaa58a014139c3b238b44dc91ceb8e508b01070 /compiler/main/GHC.hs | |
parent | 92db10bc061e0054d0a7504de420b5ad7f72a0a0 (diff) | |
download | haskell-c971e1193fa44bb507d1806d5bb61768670dc912.tar.gz |
Explicitly tell 'getNameToInstances' mods to load
Calculating which modules to load based on the InteractiveContext means
maintaining a potentially very large GblRdrEnv.
In Haddock's case, it is much cheaper (from a memory perspective) to
just keep track of which modules interfaces we want loaded then hand
these off explicitly to 'getNameToInstancesIndex'.
Bumps haddock submodule.
Reviewers: alexbiehl, bgamari
Reviewed By: alexbiehl
Subscribers: rwbarton, thomie, carter
Differential Revision: https://phabricator.haskell.org/D5003
Diffstat (limited to 'compiler/main/GHC.hs')
-rw-r--r-- | compiler/main/GHC.hs | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/compiler/main/GHC.hs b/compiler/main/GHC.hs index 0e20e21fdb..29921de8cd 100644 --- a/compiler/main/GHC.hs +++ b/compiler/main/GHC.hs @@ -300,7 +300,8 @@ import HscMain import GhcMake import DriverPipeline ( compileOne' ) import GhcMonad -import TcRnMonad ( finalSafeMode, fixSafeInstances ) +import TcRnMonad ( finalSafeMode, fixSafeInstances, initIfaceTcRn ) +import LoadIface ( loadSysInterface ) import TcRnTypes import Packages import NameSet @@ -1247,13 +1248,20 @@ getGRE = withSession $ \hsc_env-> return $ ic_rn_gbl_env (hsc_IC hsc_env) -- by 'Name'. Each name's lists will contain every instance in which that name -- is mentioned in the instance head. getNameToInstancesIndex :: GhcMonad m - => [Module] -- ^ visible modules. An orphan instance will be returned if and - -- only it is visible from at least one module in the list. + => [Module] -- ^ visible modules. An orphan instance will be returned + -- if it is visible from at least one module in the list. + -> Maybe [Module] -- ^ modules to load. If this is not specified, we load + -- modules for everything that is in scope unqualified. -> m (Messages, Maybe (NameEnv ([ClsInst], [FamInst]))) -getNameToInstancesIndex visible_mods = do +getNameToInstancesIndex visible_mods mods_to_load = do hsc_env <- getSession liftIO $ runTcInteractive hsc_env $ - do { loadUnqualIfaces hsc_env (hsc_IC hsc_env) + do { case mods_to_load of + Nothing -> loadUnqualIfaces hsc_env (hsc_IC hsc_env) + Just mods -> + let doc = text "Need interface for reporting instances in scope" + in initIfaceTcRn $ mapM_ (loadSysInterface doc) mods + ; InstEnvs {ie_global, ie_local} <- tcGetInstEnvs ; let visible_mods' = mkModuleSet visible_mods ; (pkg_fie, home_fie) <- tcGetFamInstEnvs |