summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlec Theriault <alec.theriault@gmail.com>2018-01-26 13:05:31 -0500
committerBen Gamari <ben@smart-cactus.org>2018-01-26 14:37:21 -0500
commit66961dc85e39bbc43a1c065ee00c381a7ee579e1 (patch)
treef9edaf2e6d5473a9cfcb4ce16d0de3e65456f817
parent983e491927a461457cc587197ce1644746db894b (diff)
downloadhaskell-66961dc85e39bbc43a1c065ee00c381a7ee579e1.tar.gz
Haddock needs to pass visible modules for instance filtering
The GHC-side `getNameToInstancesIndex` filters out incorrectly some instances because it is not aware of what modules are visible. Using `runTcInteractive` means that `ie_visible` gets initialized to a one module set containing some dummy GHCi module. This is clearly not the module set we want to check against to see if a given orphan instance is visible or not. In fact, GHC has no way of knowing what we want that module set to be since it doesn't know ahead of time which modules Haddock is making its docs for. The fix is just to pass that set in as an argument. Bumps haddock submodule. Reviewers: bgamari Reviewed By: bgamari Subscribers: duog, alexbiehl, rwbarton, thomie, carter Differential Revision: https://phabricator.haskell.org/D4290
-rw-r--r--compiler/main/GHC.hs11
m---------utils/haddock0
2 files changed, 7 insertions, 4 deletions
diff --git a/compiler/main/GHC.hs b/compiler/main/GHC.hs
index 343ef37210..1e54f0efac 100644
--- a/compiler/main/GHC.hs
+++ b/compiler/main/GHC.hs
@@ -1244,12 +1244,15 @@ 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
- => m (Messages, Maybe (NameEnv ([ClsInst], [FamInst])))
-getNameToInstancesIndex = do
+ => [Module] -- ^ visible modules. An orphan instance will be returned if and
+ -- only it is visible from at least one module in the list.
+ -> m (Messages, Maybe (NameEnv ([ClsInst], [FamInst])))
+getNameToInstancesIndex visible_mods = do
hsc_env <- getSession
liftIO $ runTcInteractive hsc_env $
do { loadUnqualIfaces hsc_env (hsc_IC hsc_env)
- ; InstEnvs {ie_global, ie_local, ie_visible} <- tcGetInstEnvs
+ ; InstEnvs {ie_global, ie_local} <- tcGetInstEnvs
+ ; let visible_mods' = mkModuleSet visible_mods
; (pkg_fie, home_fie) <- tcGetFamInstEnvs
-- We use Data.Sequence.Seq because we are creating left associated
-- mappends.
@@ -1257,7 +1260,7 @@ getNameToInstancesIndex = do
; let cls_index = Map.fromListWith mappend
[ (n, Seq.singleton ispec)
| ispec <- instEnvElts ie_local ++ instEnvElts ie_global
- , instIsVisible ie_visible ispec
+ , instIsVisible visible_mods' ispec
, n <- nameSetElemsStable $ orphNamesOfClsInst ispec
]
; let fam_index = Map.fromListWith mappend
diff --git a/utils/haddock b/utils/haddock
-Subproject 24841386cff6fdccc11accf9daa815c2c7444d6
+Subproject dd80ae1773ea6aae48c3c5a899d510699783d6e