32d61d791228fec0096e79a27b59d9bb9dd9e845
[ghc-hetmet.git] / ghc / compiler / rename / RnIfaces.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[RnIfaces]{Cacheing and Renaming of Interfaces}
5
6 \begin{code}
7 module RnIfaces
8      (
9         getInterfaceExports,
10         recordLocalSlurps, 
11         mkImportInfo, 
12
13         slurpImpDecls, closeDecls,
14
15         RecompileRequired, outOfDate, upToDate, recompileRequired
16        )
17 where
18
19 #include "HsVersions.h"
20
21 import CmdLineOpts      ( opt_IgnoreIfacePragmas, opt_NoPruneDecls )
22 import HscTypes
23 import HsSyn            ( HsDecl(..), Sig(..), TyClDecl(..), ConDecl(..), ConDetails(..),
24                           InstDecl(..), HsType(..), hsTyVarNames, getBangType
25                         )
26 import HsImpExp         ( ImportDecl(..) )
27 import RdrHsSyn         ( RdrNameTyClDecl, RdrNameInstDecl, RdrNameRuleDecl )
28 import RnHsSyn          ( RenamedHsDecl, RenamedTyClDecl,
29                           extractHsTyNames, extractHsCtxtTyNames, 
30                           tyClDeclFVs, ruleDeclFVs, instDeclFVs
31                         )
32 import RnHiFiles        ( tryLoadInterface, loadHomeInterface, loadInterface, 
33                           loadOrphanModules
34                         )
35 import RnSource         ( rnTyClDecl, rnInstDecl, rnIfaceRuleDecl )
36 import RnEnv
37 import RnMonad
38 import Id               ( idType )
39 import Type             ( namesOfType )
40 import TyCon            ( isSynTyCon, getSynTyConDefn )
41 import Name             ( Name {-instance NamedThing-}, nameOccName,
42                           nameModule, isLocalName, nameUnique,
43                           NamedThing(..)
44                          )
45 import Name             ( elemNameEnv, delFromNameEnv )
46 import Module           ( Module, ModuleEnv, 
47                           moduleName, isHomeModule,
48                           ModuleName, WhereFrom(..),
49                           emptyModuleEnv, 
50                           extendModuleEnv_C, foldModuleEnv, lookupModuleEnv,
51                           elemModuleSet, extendModuleSet
52                         )
53 import NameSet
54 import PrelInfo         ( wiredInThingEnv, fractionalClassKeys )
55 import TysWiredIn       ( doubleTyCon )
56 import Maybes           ( orElse )
57 import FiniteMap
58 import Outputable
59 import Bag
60 import Util             ( sortLt )
61 \end{code}
62
63
64 %*********************************************************
65 %*                                                      *
66 \subsection{Getting what a module exports}
67 %*                                                      *
68 %*********************************************************
69
70 @getInterfaceExports@ is called only for directly-imported modules.
71
72 \begin{code}
73 getInterfaceExports :: ModuleName -> WhereFrom -> RnMG (Module, [(ModuleName,Avails)])
74 getInterfaceExports mod_name from
75   = loadInterface doc_str mod_name from `thenRn` \ iface ->
76     returnRn (mi_module iface, mi_exports iface)
77   where
78       doc_str = sep [ppr mod_name, ptext SLIT("is directly imported")]
79 \end{code}
80
81
82 %*********************************************************
83 %*                                                      *
84 \subsection{Keeping track of what we've slurped, and version numbers}
85 %*                                                      *
86 %*********************************************************
87
88 mkImportInof figures out what the ``usage information'' for this
89 moudule is; that is, what it must record in its interface file as the
90 things it uses.  
91
92 We produce a line for every module B below the module, A, currently being
93 compiled:
94         import B <n> ;
95 to record the fact that A does import B indireclty.  This is used to decide
96 to look to look for B.hi rather than B.hi-boot when compiling a module that
97 imports A.  This line says that A imports B, but uses nothing in it.
98 So we'll get an early bale-out when compiling A if B's version changes.
99
100 \begin{code}
101 mkImportInfo :: ModuleName                      -- Name of this module
102              -> [ImportDecl n]                  -- The import decls
103              -> RnMG [ImportVersion Name]
104
105 mkImportInfo this_mod imports
106   = getIfacesRn                                 `thenRn` \ ifaces ->
107     getHomeIfaceTableRn                         `thenRn` \ hit -> 
108     let
109         (imp_pkg_mods, imp_home_names) = iVSlurp ifaces
110         pit                            = iPIT    ifaces
111
112         import_all_mods :: [ModuleName]
113                 -- Modules where we imported all the names
114                 -- (apart from hiding some, perhaps)
115         import_all_mods = [ m | ImportDecl m _ _ _ imp_list _ <- imports,
116                                 import_all imp_list ]
117                         where
118                           import_all (Just (False, _)) = False  -- Imports are specified explicitly
119                           import_all other             = True   -- Everything is imported
120
121         -- mv_map groups together all the things imported and used
122         -- from a particular module in this package
123         -- We use a finite map because we want the domain
124         mv_map :: ModuleEnv [Name]
125         mv_map  = foldNameSet add_mv emptyModuleEnv imp_home_names
126         add_mv name mv_map = extendModuleEnv_C add_item mv_map mod [name]
127                            where
128                              mod = nameModule name
129                              add_item names _ = name:names
130
131         -- In our usage list we record
132         --      a) Specifically: Detailed version info for imports from modules in this package
133         --                       Gotten from iVSlurp plus import_all_mods
134         --
135         --      b) Everything:   Just the module version for imports from modules in other packages
136         --                       Gotten from iVSlurp plus import_all_mods
137         --
138         --      c) NothingAtAll: The name only of modules, Baz, in this package that are 'below' us, 
139         --                       but which we didn't need at all (this is needed only to decide whether
140         --                       to open Baz.hi or Baz.hi-boot higher up the tree).
141         --                       This happens when a module, Foo, that we explicitly imported has 
142         --                       'import Baz' in its interface file, recording that Baz is below
143         --                       Foo in the module dependency hierarchy.  We want to propagate this info.
144         --                       These modules are in a combination of HIT/PIT and iImpModInfo
145         --
146         --      d) NothingAtAll: The name only of all orphan modules we know of (this is needed
147         --                       so that anyone who imports us can find the orphan modules)
148         --                       These modules are in a combination of HIT/PIT and iImpModInfo
149
150         import_info0 = foldModuleEnv mk_imp_info  []           pit
151         import_info1 = foldModuleEnv mk_imp_info  import_info0 hit
152         import_info  = [ (mod_name, orphans, is_boot, NothingAtAll) 
153                        | (mod_name, (orphans, is_boot)) <- fmToList (iImpModInfo ifaces) ] ++ 
154                        import_info1
155         
156         mk_imp_info :: ModIface -> [ImportVersion Name] -> [ImportVersion Name]
157         mk_imp_info iface so_far
158
159           | Just ns <- lookupModuleEnv mv_map mod       -- Case (a)
160           = go_for_it (Specifically mod_vers maybe_export_vers 
161                                     (mk_import_items ns) rules_vers)
162
163           | mod `elemModuleSet` imp_pkg_mods            -- Case (b)
164           = go_for_it (Everything mod_vers)
165
166           | import_all_mod                              -- Case (a) and (b); the import-all part
167           = if is_home_pkg_mod then
168                 go_for_it (Specifically mod_vers (Just export_vers) [] rules_vers)
169             else
170                 go_for_it (Everything mod_vers)
171                 
172           | is_home_pkg_mod || has_orphans              -- Case (c) or (d)
173           = go_for_it NothingAtAll
174
175           | otherwise = so_far
176           where
177             go_for_it exports = (mod_name, has_orphans, mi_boot iface, exports) : so_far
178
179             mod             = mi_module iface
180             mod_name        = moduleName mod
181             is_home_pkg_mod = isHomeModule mod
182             version_info    = mi_version iface
183             version_env     = vers_decls   version_info
184             mod_vers        = vers_module  version_info
185             rules_vers      = vers_rules   version_info
186             export_vers     = vers_exports version_info
187             import_all_mod  = mod_name `elem` import_all_mods
188             has_orphans     = mi_orphan iface
189             
190                 -- The sort is to put them into canonical order
191             mk_import_items ns = [(n,v) | n <- sortLt lt_occ ns, 
192                                           let v = lookupNameEnv version_env n `orElse` 
193                                                   pprPanic "mk_whats_imported" (ppr n)
194                                  ]
195                          where
196                            lt_occ n1 n2 = nameOccName n1 < nameOccName n2
197
198             maybe_export_vers | import_all_mod = Just (vers_exports version_info)
199                               | otherwise      = Nothing
200     in
201     returnRn import_info
202 \end{code}
203
204 %*********************************************************
205 %*                                                       *
206 \subsection{Slurping declarations}
207 %*                                                       *
208 %*********************************************************
209
210 \begin{code}
211 -------------------------------------------------------
212 slurpImpDecls source_fvs
213   = traceRn (text "slurpImp" <+> fsep (map ppr (nameSetToList source_fvs))) `thenRn_`
214
215         -- The current slurped-set records all local things
216     slurpSourceRefs source_fvs  `thenRn` \ (decls, needed) ->
217
218         -- Then get everything else
219     closeDecls decls needed
220
221
222 -------------------------------------------------------
223 slurpSourceRefs :: FreeVars                     -- Variables referenced in source
224                 -> RnMG ([RenamedHsDecl],
225                          FreeVars)              -- Un-satisfied needs
226 -- The declaration (and hence home module) of each gate has
227 -- already been loaded
228
229 slurpSourceRefs source_fvs
230   = go_outer []                         -- Accumulating decls
231              emptyFVs                   -- Unsatisfied needs
232              emptyFVs                   -- Accumulating gates
233              (nameSetToList source_fvs) -- Things whose defn hasn't been loaded yet
234   where
235         -- The outer loop repeatedly slurps the decls for the current gates
236         -- and the instance decls 
237
238         -- The outer loop is needed because consider
239
240     go_outer decls fvs all_gates []     
241         = returnRn (decls, fvs)
242
243     go_outer decls fvs all_gates refs   -- refs are not necessarily slurped yet
244         = traceRn (text "go_outer" <+> ppr refs)                `thenRn_`
245           foldlRn go_inner (decls, fvs, emptyFVs) refs          `thenRn` \ (decls1, fvs1, gates1) ->
246           getImportedInstDecls (all_gates `plusFV` gates1)      `thenRn` \ inst_decls ->
247           rnIfaceInstDecls decls1 fvs1 gates1 inst_decls        `thenRn` \ (decls2, fvs2, gates2) ->
248           go_outer decls2 fvs2 (all_gates `plusFV` gates2)
249                                (nameSetToList (gates2 `minusNameSet` all_gates))
250                 -- Knock out the all_gates because even if we don't slurp any new
251                 -- decls we can get some apparently-new gates from wired-in names
252
253     go_inner (decls, fvs, gates) wanted_name
254         = importDecl wanted_name                `thenRn` \ import_result ->
255           case import_result of
256             AlreadySlurped     -> returnRn (decls, fvs, gates)
257             InTypeEnv ty_thing -> returnRn (decls, fvs, gates `plusFV` getWiredInGates ty_thing)
258                         
259             HereItIs decl -> rnIfaceTyClDecl decl               `thenRn` \ (new_decl, fvs1) ->
260                              returnRn (TyClD new_decl : decls, 
261                                        fvs1 `plusFV` fvs,
262                                        gates `plusFV` getGates source_fvs new_decl)
263 \end{code}
264
265
266 \begin{code}
267 -------------------------------------------------------
268 -- closeDecls keeps going until the free-var set is empty
269 closeDecls decls needed
270   | not (isEmptyFVs needed)
271   = slurpDecls decls needed     `thenRn` \ (decls1, needed1) ->
272     closeDecls decls1 needed1
273
274   | otherwise
275   = getImportedRules                    `thenRn` \ rule_decls ->
276     case rule_decls of
277         []    -> returnRn decls -- No new rules, so we are done
278         other -> rnIfaceDecls rnIfaceRuleDecl rule_decls        `thenRn` \ rule_decls' ->
279                  let
280                         rule_fvs = plusFVs (map ruleDeclFVs rule_decls')
281                  in
282                  traceRn (text "closeRules" <+> ppr rule_decls' $$ fsep (map ppr (nameSetToList rule_fvs)))     `thenRn_`
283                  closeDecls (map RuleD rule_decls' ++ decls) rule_fvs
284
285                  
286
287 -------------------------------------------------------
288 -- Augment decls with any decls needed by needed.
289 -- Return also free vars of the new decls (only)
290 slurpDecls decls needed
291   = go decls emptyFVs (nameSetToList needed) 
292   where
293     go decls fvs []         = returnRn (decls, fvs)
294     go decls fvs (ref:refs) = slurpDecl decls fvs ref   `thenRn` \ (decls1, fvs1) ->
295                               go decls1 fvs1 refs
296
297 -------------------------------------------------------
298 slurpDecl decls fvs wanted_name
299   = importDecl wanted_name              `thenRn` \ import_result ->
300     case import_result of
301         -- Found a declaration... rename it
302         HereItIs decl -> rnIfaceTyClDecl decl           `thenRn` \ (new_decl, fvs1) ->
303                          returnRn (TyClD new_decl:decls, fvs1 `plusFV` fvs)
304
305         -- No declaration... (wired in thing, or deferred, or already slurped)
306         other -> returnRn (decls, fvs)
307
308
309 -------------------------------------------------------
310 rnIfaceDecls rn decls      = mapRn (rnIfaceDecl rn) decls
311 rnIfaceDecl rn (mod, decl) = initIfaceRnMS mod (rn decl)        
312
313 rnIfaceInstDecls decls fvs gates inst_decls
314   = rnIfaceDecls rnInstDecl inst_decls  `thenRn` \ inst_decls' ->
315     returnRn (map InstD inst_decls' ++ decls,
316               fvs `plusFV` plusFVs (map instDeclFVs inst_decls'),
317               gates `plusFV` plusFVs (map getInstDeclGates inst_decls'))
318
319 rnIfaceTyClDecl (mod, decl) = initIfaceRnMS mod (rnTyClDecl decl)       `thenRn` \ decl' ->
320                               returnRn (decl', tyClDeclFVs decl')
321 \end{code}
322
323
324 \begin{code}
325 recordSlurp ifaces@(Ifaces { iDecls = (decls_map, n_slurped),
326                              iSlurp = slurped_names, 
327                              iVSlurp = (imp_mods, imp_names) })
328             avail
329   = ASSERT2( not (isLocalName (availName avail)), ppr avail )
330     ifaces { iDecls = (decls_map', n_slurped+1),
331              iSlurp  = new_slurped_names, 
332              iVSlurp = new_vslurp }
333   where
334     decls_map' = foldl delFromNameEnv decls_map (availNames avail)
335     main_name  = availName avail
336     mod        = nameModule main_name
337     new_slurped_names = addAvailToNameSet slurped_names avail
338     new_vslurp | isHomeModule mod = (imp_mods, addOneToNameSet imp_names main_name)
339                | otherwise        = (extendModuleSet imp_mods mod, imp_names)
340
341 recordLocalSlurps new_names
342   = getIfacesRn         `thenRn` \ ifaces ->
343     setIfacesRn (ifaces { iSlurp  = iSlurp ifaces `unionNameSets` new_names })
344 \end{code}
345
346
347
348 %*********************************************************
349 %*                                                       *
350 \subsection{Extracting the `gates'}
351 %*                                                       *
352 %*********************************************************
353
354 The gating story
355 ~~~~~~~~~~~~~~~~~
356 We want to avoid sucking in too many instance declarations.
357 An instance decl is only useful if the types and classes mentioned in
358 its 'head' are all available in the program being compiled.  E.g.
359
360         instance (..) => C (T1 a) (T2 b) where ...
361
362 is only useful if C, T1 and T2 are all "available".  So we keep
363 instance decls that have been parsed from .hi files, but not yet
364 slurped in, in a pool called the 'gated instance pool'.
365 Each has its set of 'gates': {C, T1, T2} in the above example.
366
367 More precisely, the gates of a module are the types and classes 
368 that are mentioned in:
369
370         a) the source code
371         b) the type of an Id that's mentioned in the source code
372            [includes constructors and selectors]
373         c) the RHS of a type synonym that is a gate
374         d) the superclasses of a class that is a gate
375         e) the context of an instance decl that is slurped in
376
377 We slurp in an instance decl from the gated instance pool iff
378         
379         all its gates are either in the gates of the module, 
380         or are a previously-loaded class.  
381
382 The latter constraint is because there might have been an instance
383 decl slurped in during an earlier compilation, like this:
384
385         instance Foo a => Baz (Maybe a) where ...
386
387 In the module being compiled we might need (Baz (Maybe T)), where T
388 is defined in this module, and hence we need (Foo T).  So @Foo@ becomes
389 a gate.  But there's no way to 'see' that, so we simply treat all 
390 previously-loaded classes as gates.
391
392 Consructors and class operations
393 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
394 When we import a declaration like
395
396         data T = T1 Wibble | T2 Wobble
397
398 we don't want to treat @Wibble@ and @Wobble@ as gates {\em unless}
399 @T1@, @T2@ respectively are mentioned by the user program. If only
400 @T@ is mentioned we want only @T@ to be a gate; that way we don't suck
401 in useless instance decls for (say) @Eq Wibble@, when they can't
402 possibly be useful.
403
404 And that's just what (b) says: we only treat T1's type as a gate if
405 T1 is mentioned.  getGates, which deals with decls we are slurping in,
406 has to be a bit careful, because a mention of T1 will slurp in T's whole
407 declaration.
408
409 -----------------------------
410 @getGates@ takes a newly imported (and renamed) decl, and the free
411 vars of the source program, and extracts from the decl the gate names.
412
413 \begin{code}
414 getGates :: FreeVars            -- Things mentioned in the source program
415          -> RenamedTyClDecl
416          -> FreeVars
417
418 getGates source_fvs decl 
419   = get_gates (\n -> n `elemNameSet` source_fvs) decl
420
421 get_gates is_used (IfaceSig {tcdType = ty}) = extractHsTyNames ty
422
423 get_gates is_used (ClassDecl { tcdCtxt = ctxt, tcdName = cls, tcdTyVars = tvs, tcdSigs = sigs})
424   = (delListFromNameSet (foldr (plusFV . get) (extractHsCtxtTyNames ctxt) sigs)
425                         (hsTyVarNames tvs)
426      `addOneToNameSet` cls)
427     `plusFV` maybe_double
428   where
429     get (ClassOpSig n _ ty _) 
430         | is_used n = extractHsTyNames ty
431         | otherwise = emptyFVs
432
433         -- If we load any numeric class that doesn't have
434         -- Int as an instance, add Double to the gates. 
435         -- This takes account of the fact that Double might be needed for
436         -- defaulting, but we don't want to load Double (and all its baggage)
437         -- if the more exotic classes aren't used at all.
438     maybe_double | nameUnique cls `elem` fractionalClassKeys 
439                  = unitFV (getName doubleTyCon)
440                  | otherwise
441                  = emptyFVs
442
443 get_gates is_used (TySynonym {tcdTyVars = tvs, tcdSynRhs = ty})
444   = delListFromNameSet (extractHsTyNames ty) (hsTyVarNames tvs)
445         -- A type synonym type constructor isn't a "gate" for instance decls
446
447 get_gates is_used (TyData {tcdCtxt = ctxt, tcdName = tycon, tcdTyVars = tvs, tcdCons = cons})
448   = delListFromNameSet (foldr (plusFV . get) (extractHsCtxtTyNames ctxt) cons)
449                        (hsTyVarNames tvs)
450     `addOneToNameSet` tycon
451   where
452     get (ConDecl n _ tvs ctxt details _)
453         | is_used n
454                 -- If the constructor is method, get fvs from all its fields
455         = delListFromNameSet (get_details details `plusFV` 
456                               extractHsCtxtTyNames ctxt)
457                              (hsTyVarNames tvs)
458     get (ConDecl n _ tvs ctxt (RecCon fields) _)
459                 -- Even if the constructor isn't mentioned, the fields
460                 -- might be, as selectors.  They can't mention existentially
461                 -- bound tyvars (typechecker checks for that) so no need for 
462                 -- the deleteListFromNameSet part
463         = foldr (plusFV . get_field) emptyFVs fields
464         
465     get other_con = emptyFVs
466
467     get_details (VanillaCon tys) = plusFVs (map get_bang tys)
468     get_details (InfixCon t1 t2) = get_bang t1 `plusFV` get_bang t2
469     get_details (RecCon fields)  = plusFVs [get_bang t | (_, t) <- fields]
470
471     get_field (fs,t) | any is_used fs = get_bang t
472                      | otherwise      = emptyFVs
473
474     get_bang bty = extractHsTyNames (getBangType bty)
475 \end{code}
476
477 @getWiredInGates@ is just like @getGates@, but it sees a previously-loaded
478 thing rather than a declaration.
479
480 \begin{code}
481 getWiredInGates :: TyThing -> FreeVars
482 -- The TyThing is one that we already have in our type environment, either
483 --      a) because the TyCon or Id is wired in, or
484 --      b) from a previous compile
485 -- Either way, we might have instance decls in the (persistent) collection
486 -- of parsed-but-not-slurped instance decls that should be slurped in.
487 -- This might be the first module that mentions both the type and the class
488 -- for that instance decl, even though both the type and the class were
489 -- mentioned in other modules, and hence are in the type environment
490
491 getWiredInGates (AnId the_id) = namesOfType (idType the_id)
492 getWiredInGates (AClass cl)   = emptyFVs        -- The superclasses must also be previously
493                                                 -- loaded, and hence are automatically gates
494 getWiredInGates (ATyCon tc)
495   | isSynTyCon tc = delListFromNameSet (namesOfType ty) (map getName tyvars)
496   | otherwise     = unitFV (getName tc)
497   where
498     (tyvars,ty)  = getSynTyConDefn tc
499
500 getInstDeclGates (InstDecl inst_ty _ _ _ _) = extractHsTyNames inst_ty
501 \end{code}
502
503 \begin{code}
504 getImportedInstDecls :: NameSet -> RnMG [(Module,RdrNameInstDecl)]
505 getImportedInstDecls gates
506   =     -- First, load any orphan-instance modules that aren't aready loaded
507         -- Orphan-instance modules are recorded in the module dependecnies
508     getIfacesRn                                         `thenRn` \ ifaces ->
509     let
510         orphan_mods =
511           [mod | (mod, (True, _)) <- fmToList (iImpModInfo ifaces)]
512     in
513     loadOrphanModules orphan_mods                       `thenRn_` 
514
515         -- Now we're ready to grab the instance declarations
516         -- Find the un-gated ones and return them, 
517         -- removing them from the bag kept in Ifaces
518     getIfacesRn                                         `thenRn` \ ifaces ->
519     getTypeEnvRn                                        `thenRn` \ lookup ->
520     let
521         (decls, new_insts) = selectGated gates lookup (iInsts ifaces)
522     in
523     setIfacesRn (ifaces { iInsts = new_insts })         `thenRn_`
524
525     traceRn (sep [text "getImportedInstDecls:", 
526                   nest 4 (fsep (map ppr gate_list)),
527                   text "Slurped" <+> int (length decls) <+> text "instance declarations",
528                   nest 4 (vcat (map ppr_brief_inst_decl decls))])       `thenRn_`
529     returnRn decls
530   where
531     gate_list      = nameSetToList gates
532
533 ppr_brief_inst_decl (mod, InstDecl inst_ty _ _ _ _)
534   = case inst_ty of
535         HsForAllTy _ _ tau -> ppr tau
536         other              -> ppr inst_ty
537
538 getImportedRules :: RnMG [(Module,RdrNameRuleDecl)]
539 getImportedRules 
540   | opt_IgnoreIfacePragmas = returnRn []
541   | otherwise
542   = getIfacesRn         `thenRn` \ ifaces ->
543     getTypeEnvRn        `thenRn` \ lookup ->
544     let
545         gates              = iSlurp ifaces      -- Anything at all that's been slurped
546         rules              = iRules ifaces
547         (decls, new_rules) = selectGated gates lookup rules
548     in
549     if null decls then
550         returnRn []
551     else
552     setIfacesRn (ifaces { iRules = new_rules })              `thenRn_`
553     traceRn (sep [text "getImportedRules:", 
554                   text "Slurped" <+> int (length decls) <+> text "rules"])   `thenRn_`
555     returnRn decls
556
557 selectGated gates lookup (decl_bag, n_slurped)
558         -- Select only those decls whose gates are *all* in 'gates'
559         -- or are a class in 'lookup'
560 #ifdef DEBUG
561   | opt_NoPruneDecls    -- Just to try the effect of not gating at all
562   = let
563         decls = foldrBag (\ (_,d) ds -> d:ds) [] decl_bag       -- Grab them all
564     in
565     (decls, (emptyBag, n_slurped + length decls))
566
567   | otherwise
568 #endif
569   = case foldrBag select ([], emptyBag) decl_bag of
570         (decls, new_bag) -> (decls, (new_bag, n_slurped + length decls))
571   where
572     available n = n `elemNameSet` gates 
573                 || case lookup n of { Just (AClass c) -> True; other -> False }
574
575     select (reqd, decl) (yes, no)
576         | all available reqd = (decl:yes, no)
577         | otherwise          = (yes,      (reqd,decl) `consBag` no)
578 \end{code}
579
580
581 %*********************************************************
582 %*                                                      *
583 \subsection{Getting in a declaration}
584 %*                                                      *
585 %*********************************************************
586
587 \begin{code}
588 importDecl :: Name -> RnMG ImportDeclResult
589
590 data ImportDeclResult
591   = AlreadySlurped
592   | InTypeEnv TyThing
593   | HereItIs (Module, RdrNameTyClDecl)
594
595 importDecl name
596   =     -- STEP 1: Check if we've slurped it in while compiling this module
597     getIfacesRn                         `thenRn` \ ifaces ->
598     if name `elemNameSet` iSlurp ifaces then    
599         returnRn AlreadySlurped 
600     else
601
602         -- STEP 2: Check if it's already in the type environment
603     getTypeEnvRn                        `thenRn` \ lookup ->
604     case lookup name of {
605         Just ty_thing | name `elemNameEnv` wiredInThingEnv
606                       ->        -- When we find a wired-in name we must load its home
607                                 -- module so that we find any instance decls lurking therein
608                          loadHomeInterface wi_doc name  `thenRn_`
609                          returnRn (InTypeEnv ty_thing)
610
611                       | otherwise
612                       -> returnRn (InTypeEnv ty_thing) ;
613
614         Nothing -> 
615
616         -- STEP 3: OK, we have to slurp it in from an interface file
617         --         First load the interface file
618     traceRn nd_doc                      `thenRn_`
619     loadHomeInterface nd_doc name       `thenRn_`
620     getIfacesRn                         `thenRn` \ ifaces ->
621
622         -- STEP 4: Get the declaration out
623     let
624         (decls_map, _) = iDecls ifaces
625     in
626     case lookupNameEnv decls_map name of
627       Just (avail,_,decl)
628         -> setIfacesRn (recordSlurp ifaces avail)       `thenRn_`
629            returnRn (HereItIs decl)
630
631       Nothing 
632         -> addErrRn (getDeclErr name)   `thenRn_` 
633            returnRn AlreadySlurped
634     }
635   where
636     wi_doc = ptext SLIT("need home module for wired in thing") <+> ppr name
637     nd_doc = ptext SLIT("need decl for") <+> ppr name
638
639 \end{code}
640
641
642 %********************************************************
643 %*                                                      *
644 \subsection{Checking usage information}
645 %*                                                      *
646 %********************************************************
647
648 @recompileRequired@ is called from the HscMain.   It checks whether
649 a recompilation is required.  It needs access to the persistent state,
650 finder, etc, because it may have to load lots of interface files to
651 check their versions.
652
653 \begin{code}
654 type RecompileRequired = Bool
655 upToDate  = False       -- Recompile not required
656 outOfDate = True        -- Recompile required
657
658 recompileRequired :: FilePath           -- Only needed for debug msgs
659                   -> ModIface           -- Old interface
660                   -> RnMG RecompileRequired
661 recompileRequired iface_path iface
662   = traceHiDiffsRn (text "Considering whether compilation is required for" <+> text iface_path <> colon)        `thenRn_`
663
664         -- Source code unchanged and no errors yet... carry on 
665     checkList [checkModUsage u | u <- mi_usages iface]
666
667 checkList :: [RnMG RecompileRequired] -> RnMG RecompileRequired
668 checkList []             = returnRn upToDate
669 checkList (check:checks) = check        `thenRn` \ recompile ->
670                            if recompile then 
671                                 returnRn outOfDate
672                            else
673                                 checkList checks
674 \end{code}
675         
676 \begin{code}
677 checkModUsage :: ImportVersion Name -> RnMG RecompileRequired
678 -- Given the usage information extracted from the old
679 -- M.hi file for the module being compiled, figure out
680 -- whether M needs to be recompiled.
681
682 checkModUsage (mod_name, _, _, NothingAtAll)
683         -- If CurrentModule.hi contains 
684         --      import Foo :: ;
685         -- then that simply records that Foo lies below CurrentModule in the
686         -- hierarchy, but CurrentModule doesn't depend in any way on Foo.
687         -- In this case we don't even want to open Foo's interface.
688   = up_to_date (ptext SLIT("Nothing used from:") <+> ppr mod_name)
689
690 checkModUsage (mod_name, _, is_boot, whats_imported)
691   =     -- Load the imported interface is possible
692         -- We use tryLoadInterface, because failure is not an error
693         -- (might just be that the old .hi file for this module is out of date)
694         -- We use ImportByUser/ImportByUserSource as the 'from' flag, 
695         --      a) because we need to know whether to load the .hi-boot file
696         --      b) because loadInterface things matters are amiss if we 
697         --         ImportBySystem an interface it knows nothing about
698     let
699         doc_str = sep [ptext SLIT("need version info for"), ppr mod_name]
700         from    | is_boot   = ImportByUserSource
701                 | otherwise = ImportByUser
702     in
703     tryLoadInterface doc_str mod_name from      `thenRn` \ (iface, maybe_err) ->
704
705     case maybe_err of {
706         Just err -> out_of_date (sep [ptext SLIT("Can't find version number for module"), 
707                                       ppr mod_name]) ;
708                 -- Couldn't find or parse a module mentioned in the
709                 -- old interface file.  Don't complain -- it might just be that
710                 -- the current module doesn't need that import and it's been deleted
711
712         Nothing -> 
713     let
714         new_vers      = mi_version iface
715         new_decl_vers = vers_decls new_vers
716     in
717     case whats_imported of {    -- NothingAtAll dealt with earlier
718
719       Everything old_mod_vers -> checkModuleVersion old_mod_vers new_vers       `thenRn` \ recompile ->
720                                  if recompile then
721                                         out_of_date (ptext SLIT("...and I needed the whole module"))
722                                  else
723                                         returnRn upToDate ;
724
725       Specifically old_mod_vers maybe_old_export_vers old_decl_vers old_rule_vers ->
726
727         -- CHECK MODULE
728     checkModuleVersion old_mod_vers new_vers    `thenRn` \ recompile ->
729     if not recompile then
730         returnRn upToDate
731     else
732                                  
733         -- CHECK EXPORT LIST
734     if checkExportList maybe_old_export_vers new_vers then
735         out_of_date (ptext SLIT("Export list changed"))
736     else
737
738         -- CHECK RULES
739     if old_rule_vers /= vers_rules new_vers then
740         out_of_date (ptext SLIT("Rules changed"))
741     else
742
743         -- CHECK ITEMS ONE BY ONE
744     checkList [checkEntityUsage new_decl_vers u | u <- old_decl_vers]   `thenRn` \ recompile ->
745     if recompile then
746         returnRn outOfDate      -- This one failed, so just bail out now
747     else
748         up_to_date (ptext SLIT("...but the bits I use haven't."))
749
750     }}
751
752 ------------------------
753 checkModuleVersion old_mod_vers new_vers
754   | vers_module new_vers == old_mod_vers
755   = up_to_date (ptext SLIT("Module version unchanged"))
756
757   | otherwise
758   = out_of_date (ptext SLIT("Module version has changed"))
759
760 ------------------------
761 checkExportList Nothing  new_vers = upToDate
762 checkExportList (Just v) new_vers = v /= vers_exports new_vers
763
764 ------------------------
765 checkEntityUsage new_vers (name,old_vers)
766   = case lookupNameEnv new_vers name of
767
768         Nothing       ->        -- We used it before, but it ain't there now
769                           out_of_date (sep [ptext SLIT("No longer exported:"), ppr name])
770
771         Just new_vers   -- It's there, but is it up to date?
772           | new_vers == old_vers -> returnRn upToDate
773           | otherwise            -> out_of_date (sep [ptext SLIT("Out of date:"), ppr name])
774
775 up_to_date  msg = traceHiDiffsRn msg `thenRn_` returnRn upToDate
776 out_of_date msg = traceHiDiffsRn msg `thenRn_` returnRn outOfDate
777 \end{code}
778
779
780 %*********************************************************
781 %*                                                       *
782 \subsection{Errors}
783 %*                                                       *
784 %*********************************************************
785
786 \begin{code}
787 getDeclErr name
788   = vcat [ptext SLIT("Failed to find interface decl for") <+> quotes (ppr name),
789           ptext SLIT("from module") <+> quotes (ppr (nameModule name))
790          ]
791 \end{code}