@@ -21,7 +21,7 @@ import Haddock.GhcUtils
21
21
import Control.Arrow hiding ((<+>) )
22
22
import Data.List
23
23
import Data.Ord (comparing )
24
- import Data.Maybe ( maybeToList , mapMaybe )
24
+ import Data.Maybe ( maybeToList , mapMaybe , fromMaybe )
25
25
import qualified Data.Map as Map
26
26
import qualified Data.Set as Set
27
27
@@ -32,14 +32,13 @@ import ErrUtils
32
32
import FamInstEnv
33
33
import FastString
34
34
import GHC
35
- import GhcMonad (withSession )
36
35
import InstEnv
37
36
import MonadUtils (liftIO )
38
37
import Name
38
+ import NameEnv
39
39
import Outputable (text , sep , (<+>) )
40
40
import PrelNames
41
41
import SrcLoc
42
- import TcRnDriver (tcRnGetInfo )
43
42
import TyCon
44
43
import TyCoRep
45
44
import TysPrim ( funTyCon )
@@ -52,13 +51,15 @@ type ExportInfo = (ExportedNames, Modules)
52
51
53
52
-- Also attaches fixities
54
53
attachInstances :: ExportInfo -> [Interface ] -> InstIfaceMap -> Ghc [Interface ]
55
- attachInstances expInfo ifaces instIfaceMap = mapM attach ifaces
54
+ attachInstances expInfo ifaces instIfaceMap = do
55
+ (_msgs, mb_index) <- getNameToInstancesIndex
56
+ mapM (attach $ fromMaybe emptyNameEnv mb_index) ifaces
56
57
where
57
58
-- TODO: take an IfaceMap as input
58
59
ifaceMap = Map. fromList [ (ifaceMod i, i) | i <- ifaces ]
59
60
60
- attach iface = do
61
- newItems <- mapM (attachToExportItem expInfo iface ifaceMap instIfaceMap)
61
+ attach index iface = do
62
+ newItems <- mapM (attachToExportItem index expInfo iface ifaceMap instIfaceMap)
62
63
(ifaceExportItems iface)
63
64
let orphanInstances = attachOrphanInstances expInfo iface ifaceMap instIfaceMap (ifaceInstances iface)
64
65
return $ iface { ifaceExportItems = newItems
@@ -74,37 +75,42 @@ attachOrphanInstances expInfo iface ifaceMap instIfaceMap cls_instances =
74
75
]
75
76
76
77
77
- attachToExportItem :: ExportInfo -> Interface -> IfaceMap -> InstIfaceMap
78
- -> ExportItem Name
79
- -> Ghc (ExportItem Name )
80
- attachToExportItem expInfo iface ifaceMap instIfaceMap export =
78
+ attachToExportItem
79
+ :: NameEnv ([ClsInst ], [FamInst ])
80
+ -> ExportInfo
81
+ -> Interface
82
+ -> IfaceMap
83
+ -> InstIfaceMap
84
+ -> ExportItem Name
85
+ -> Ghc (ExportItem Name )
86
+ attachToExportItem index expInfo iface ifaceMap instIfaceMap export =
81
87
case attachFixities export of
82
88
e@ ExportDecl { expItemDecl = L eSpan (TyClD d) } -> do
83
- mb_info <- getAllInfo (tcdName d)
84
- insts <- case mb_info of
85
- Just (_, _, cls_instances, fam_instances) ->
86
- let fam_insts = [ (synifyFamInst i opaque, doc,spanNameE n (synifyFamInst i opaque) (L eSpan (tcdName d)) )
87
- | i <- sortBy (comparing instFam) fam_instances
88
- , let n = getName i
89
- , let doc = instLookup instDocMap n iface ifaceMap instIfaceMap
90
- , not $ isNameHidden expInfo (fi_fam i)
91
- , not $ any (isTypeHidden expInfo) (fi_tys i)
92
- , let opaque = isTypeHidden expInfo (fi_rhs i)
93
- ]
94
- cls_insts = [ (synifyInstHead i, instLookup instDocMap n iface ifaceMap instIfaceMap, spanName n (synifyInstHead i) (L eSpan (tcdName d)))
95
- | let is = [ (instanceSig i, getName i) | i <- cls_instances ]
96
- , (i@ (_,_,cls,tys), n) <- sortBy (comparing $ first instHead) is
97
- , not $ isInstanceHidden expInfo cls tys
98
- ]
89
+ insts <-
90
+ let mb_instances = lookupNameEnv index (tcdName d)
91
+ cls_instances = maybeToList mb_instances >>= fst
92
+ fam_instances = maybeToList mb_instances >>= snd
93
+ fam_insts = [ (synifyFamInst i opaque, doc,spanNameE n (synifyFamInst i opaque) (L eSpan (tcdName d)) )
94
+ | i <- sortBy (comparing instFam) fam_instances
95
+ , let n = getName i
96
+ , let doc = instLookup instDocMap n iface ifaceMap instIfaceMap
97
+ , not $ isNameHidden expInfo (fi_fam i)
98
+ , not $ any (isTypeHidden expInfo) (fi_tys i)
99
+ , let opaque = isTypeHidden expInfo (fi_rhs i)
100
+ ]
101
+ cls_insts = [ (synifyInstHead i, instLookup instDocMap n iface ifaceMap instIfaceMap, spanName n (synifyInstHead i) (L eSpan (tcdName d)))
102
+ | let is = [ (instanceSig i, getName i) | i <- cls_instances ]
103
+ , (i@ (_,_,cls,tys), n) <- sortBy (comparing $ first instHead) is
104
+ , not $ isInstanceHidden expInfo cls tys
105
+ ]
99
106
-- fam_insts but with failing type fams filtered out
100
- cleanFamInsts = [ (fi, n, L l r) | (Right fi, n, L l (Right r)) <- fam_insts ]
101
- famInstErrs = [ errm | (Left errm, _, _) <- fam_insts ]
102
- in do
103
- dfs <- getDynFlags
104
- let mkBug = (text " haddock-bug:" <+> ) . text
105
- liftIO $ putMsg dfs (sep $ map mkBug famInstErrs)
106
- return $ cls_insts ++ cleanFamInsts
107
- Nothing -> return []
107
+ cleanFamInsts = [ (fi, n, L l r) | (Right fi, n, L l (Right r)) <- fam_insts ]
108
+ famInstErrs = [ errm | (Left errm, _, _) <- fam_insts ]
109
+ in do
110
+ dfs <- getDynFlags
111
+ let mkBug = (text " haddock-bug:" <+> ) . text
112
+ liftIO $ putMsg dfs (sep $ map mkBug famInstErrs)
113
+ return $ cls_insts ++ cleanFamInsts
108
114
return $ e { expItemInstances = insts }
109
115
e -> return e
110
116
where
@@ -145,14 +151,6 @@ instLookup f name iface ifaceMap instIfaceMap =
145
151
iface' <- Map. lookup (nameModule name) ifaceMaps
146
152
Map. lookup name (f iface')
147
153
148
- -- | Like GHC's getInfo but doesn't cut things out depending on the
149
- -- interative context, which we don't set sufficiently anyway.
150
- getAllInfo :: GhcMonad m => Name -> m (Maybe (TyThing ,Fixity ,[ClsInst ],[FamInst ]))
151
- getAllInfo name = withSession $ \ hsc_env -> do
152
- (_msgs, r) <- liftIO $ tcRnGetInfo hsc_env name
153
- return r
154
-
155
-
156
154
--------------------------------------------------------------------------------
157
155
-- Collecting and sorting instances
158
156
--------------------------------------------------------------------------------
0 commit comments