aboutsummaryrefslogtreecommitdiff
path: root/haddock-api/src/Haddock/Interface.hs
diff options
context:
space:
mode:
authorAlec Theriault <alec.theriault@gmail.com>2018-01-15 17:12:18 -0800
committerAlec Theriault <alec.theriault@gmail.com>2018-01-15 17:12:18 -0800
commitb6a719bb3dcc51da8c162e213a4fdc43a35cb992 (patch)
tree21317763da0f672ee3a9190cb6d01ff2448542b0 /haddock-api/src/Haddock/Interface.hs
parentb9bf41f6a25239bb2c0780d146ba1f18c061d6d3 (diff)
Update the GblRdrEnv when processing modules
Without a complete environment, we will miss some instances that were encountered during typechecking.
Diffstat (limited to 'haddock-api/src/Haddock/Interface.hs')
-rw-r--r--haddock-api/src/Haddock/Interface.hs14
1 files changed, 14 insertions, 0 deletions
diff --git a/haddock-api/src/Haddock/Interface.hs b/haddock-api/src/Haddock/Interface.hs
index 20689a8f..cbdf81cb 100644
--- a/haddock-api/src/Haddock/Interface.hs
+++ b/haddock-api/src/Haddock/Interface.hs
@@ -58,6 +58,8 @@ import GHC hiding (verbosity)
import HscTypes
import FastString (unpackFS)
import MonadUtils (liftIO)
+import TcRnTypes (tcg_rdr_env)
+import RdrName (plusGlobalRdrEnv)
#if defined(mingw32_HOST_OS)
import System.IO
@@ -163,6 +165,18 @@ processModule :: Verbosity -> ModSummary -> [Flag] -> IfaceMap -> InstIfaceMap -
processModule verbosity modsum flags modMap instIfaceMap = do
out verbosity verbose $ "Checking module " ++ moduleString (ms_mod modsum) ++ "..."
tm <- loadModule =<< typecheckModule =<< parseModule modsum
+
+ -- We need to modify the interactive context's environment so that when
+ -- Haddock later looks for instances, it also looks in the modules it
+ -- encountered while typechecking.
+ --
+ -- See https://github.com/haskell/haddock/issues/469.
+ hsc_env@HscEnv{ hsc_IC = old_IC } <- getSession
+ let new_rdr_env = tcg_rdr_env . fst . GHC.tm_internals_ $ tm
+ setSession hsc_env{ hsc_IC = old_IC {
+ ic_rn_gbl_env = ic_rn_gbl_env old_IC `plusGlobalRdrEnv` new_rdr_env
+ } }
+
if not $ isBootSummary modsum then do
out verbosity verbose "Creating interface..."
(interface, msg) <- runWriterGhc $ createInterface tm flags modMap instIfaceMap