Skip to content
This repository was archived by the owner on Aug 3, 2024. It is now read-only.

Commit d5d8cd1

Browse files
duogalexbiehl
authored andcommitted
Use new function getNameToInstancesIndex instead of tcRnGetInfo (#639)
* Use new function getNameToInstancesIndex instead of tcRnGetInfo There is some significant performance improvement in the ghc testsuite. haddock.base: -23.3% haddock.Cabal: -16.7% haddock.compiler: -19.8% * Remove unused imports
1 parent 87c551f commit d5d8cd1

File tree

1 file changed

+40
-42
lines changed

1 file changed

+40
-42
lines changed

haddock-api/src/Haddock/Interface/AttachInstances.hs

Lines changed: 40 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import Haddock.GhcUtils
2121
import Control.Arrow hiding ((<+>))
2222
import Data.List
2323
import Data.Ord (comparing)
24-
import Data.Maybe ( maybeToList, mapMaybe )
24+
import Data.Maybe ( maybeToList, mapMaybe, fromMaybe )
2525
import qualified Data.Map as Map
2626
import qualified Data.Set as Set
2727

@@ -32,14 +32,13 @@ import ErrUtils
3232
import FamInstEnv
3333
import FastString
3434
import GHC
35-
import GhcMonad (withSession)
3635
import InstEnv
3736
import MonadUtils (liftIO)
3837
import Name
38+
import NameEnv
3939
import Outputable (text, sep, (<+>))
4040
import PrelNames
4141
import SrcLoc
42-
import TcRnDriver (tcRnGetInfo)
4342
import TyCon
4443
import TyCoRep
4544
import TysPrim( funTyCon )
@@ -52,13 +51,15 @@ type ExportInfo = (ExportedNames, Modules)
5251

5352
-- Also attaches fixities
5453
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
5657
where
5758
-- TODO: take an IfaceMap as input
5859
ifaceMap = Map.fromList [ (ifaceMod i, i) | i <- ifaces ]
5960

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)
6263
(ifaceExportItems iface)
6364
let orphanInstances = attachOrphanInstances expInfo iface ifaceMap instIfaceMap (ifaceInstances iface)
6465
return $ iface { ifaceExportItems = newItems
@@ -74,37 +75,42 @@ attachOrphanInstances expInfo iface ifaceMap instIfaceMap cls_instances =
7475
]
7576

7677

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 =
8187
case attachFixities export of
8288
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+
]
99106
-- 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
108114
return $ e { expItemInstances = insts }
109115
e -> return e
110116
where
@@ -145,14 +151,6 @@ instLookup f name iface ifaceMap instIfaceMap =
145151
iface' <- Map.lookup (nameModule name) ifaceMaps
146152
Map.lookup name (f iface')
147153

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-
156154
--------------------------------------------------------------------------------
157155
-- Collecting and sorting instances
158156
--------------------------------------------------------------------------------

0 commit comments

Comments
 (0)