[project @ 2000-11-06 08:15:20 by simonpj]
[ghc-hetmet.git] / ghc / compiler / rename / RnHiFiles.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section{Dealing with interface files}
5
6 \begin{code}
7 module RnHiFiles (
8         readIface, findAndReadIface, loadInterface, loadHomeInterface, 
9         tryLoadInterface, loadOrphanModules,
10         loadExports, loadFixDecls, loadDeprecs,
11
12         lookupFixityRn, 
13
14         getTyClDeclBinders, 
15         removeContext           -- removeContext probably belongs somewhere else
16    ) where
17
18 #include "HsVersions.h"
19
20 import CmdLineOpts      ( DynFlag(..), opt_IgnoreIfacePragmas )
21 import HscTypes         ( ModuleLocation(..),
22                           ModIface(..), emptyModIface,
23                           VersionInfo(..),
24                           lookupIfaceByModName, 
25                           ImportVersion, WhetherHasOrphans, IsBootInterface,
26                           DeclsMap, GatedDecl, IfaceInsts, IfaceRules,
27                           AvailInfo, GenAvailInfo(..), Avails, Deprecations(..)
28                          )
29 import HsSyn            ( TyClDecl(..), InstDecl(..),
30                           HsType(..), ConDecl(..), 
31                           FixitySig(..), RuleDecl(..),
32                           tyClDeclNames
33                         )
34 import RdrHsSyn         ( RdrNameTyClDecl, RdrNameInstDecl, RdrNameRuleDecl,
35                           extractHsTyRdrNames 
36                         )
37 import BasicTypes       ( Version, defaultFixity )
38 import RnEnv
39 import RnMonad
40 import ParseIface       ( parseIface, IfaceStuff(..) )
41
42 import Name             ( Name {-instance NamedThing-}, nameOccName,
43                           nameModule, isLocalName, nameIsLocalOrFrom,
44                           NamedThing(..),
45                          )
46 import Name             ( mkNameEnv, extendNameEnv )
47 import Module           ( Module, 
48                           moduleName, isModuleInThisPackage,
49                           ModuleName, WhereFrom(..),
50                           extendModuleEnv, mkVanillaModule
51                         )
52 import RdrName          ( RdrName, rdrNameOcc )
53 import SrcLoc           ( mkSrcLoc )
54 import Maybes           ( maybeToBool, orElse )
55 import StringBuffer     ( hGetStringBuffer )
56 import FastString       ( mkFastString )
57 import ErrUtils         ( Message )
58 import Finder           ( findModule )
59 import Util             ( unJust )
60 import Lex
61 import FiniteMap
62 import Outputable
63 import Bag
64
65 import Monad            ( when )
66 \end{code}
67
68
69 %*********************************************************
70 %*                                                      *
71 \subsection{Loading a new interface file}
72 %*                                                      *
73 %*********************************************************
74
75 \begin{code}
76 loadHomeInterface :: SDoc -> Name -> RnM d ModIface
77 loadHomeInterface doc_str name
78   = ASSERT2( not (isLocalName name), ppr name <+> parens doc_str )
79     loadInterface doc_str (moduleName (nameModule name)) ImportBySystem
80
81 loadOrphanModules :: [ModuleName] -> RnM d ()
82 loadOrphanModules mods
83   | null mods = returnRn ()
84   | otherwise = traceRn (text "Loading orphan modules:" <+> 
85                          fsep (map ppr mods))                   `thenRn_` 
86                 mapRn_ load mods                                `thenRn_`
87                 returnRn ()
88   where
89     load mod   = loadInterface (mk_doc mod) mod ImportBySystem
90     mk_doc mod = ppr mod <+> ptext SLIT("is a orphan-instance module")
91
92 loadInterface :: SDoc -> ModuleName -> WhereFrom -> RnM d ModIface
93 loadInterface doc mod from 
94   = tryLoadInterface doc mod from       `thenRn` \ (ifaces, maybe_err) ->
95     case maybe_err of
96         Nothing  -> returnRn ifaces
97         Just err -> failWithRn ifaces err
98
99 tryLoadInterface :: SDoc -> ModuleName -> WhereFrom -> RnM d (ModIface, Maybe Message)
100   -- Returns (Just err) if an error happened
101   -- It *doesn't* add an error to the monad, because sometimes it's ok to fail...
102   -- Specifically, when we read the usage information from an interface file,
103   -- we try to read the interfaces it mentions.  But it's OK to fail; perhaps
104   -- the module has changed, and that interface is no longer used.
105   
106   -- tryLoadInterface guarantees to return with iImpModInfo m --> (..., True)
107   -- (If the load fails, we plug in a vanilla placeholder)
108 tryLoadInterface doc_str mod_name from
109  = getHomeIfaceTableRn          `thenRn` \ hit ->
110    getIfacesRn                  `thenRn` \ ifaces@(Ifaces { iPIT = pit }) ->
111         
112         -- CHECK WHETHER WE HAVE IT ALREADY
113    case lookupIfaceByModName hit pit mod_name of {
114         Just iface  -> returnRn (iface, Nothing) ;      -- Already loaded
115         Nothing     -> 
116
117    let
118         mod_map  = iImpModInfo ifaces
119         mod_info = lookupFM mod_map mod_name
120
121         hi_boot_file 
122           = case (from, mod_info) of
123                 (ImportByUser,       _)             -> False    -- Not hi-boot
124                 (ImportByUserSource, _)             -> True     -- hi-boot
125                 (ImportBySystem, Just (_, is_boot)) -> is_boot
126                 (ImportBySystem, Nothing)           -> False
127                         -- We're importing a module we know absolutely
128                         -- nothing about, so we assume it's from
129                         -- another package, where we aren't doing 
130                         -- dependency tracking. So it won't be a hi-boot file.
131
132         redundant_source_import 
133           = case (from, mod_info) of 
134                 (ImportByUserSource, Just (_,False)) -> True
135                 other                                -> False
136    in
137
138         -- Issue a warning for a redundant {- SOURCE -} import
139         -- NB that we arrange to read all the ordinary imports before 
140         -- any of the {- SOURCE -} imports
141    warnCheckRn  (not redundant_source_import)
142                 (warnRedundantSourceImport mod_name)    `thenRn_`
143
144         -- READ THE MODULE IN
145    findAndReadIface doc_str mod_name hi_boot_file   `thenRn` \ read_result ->
146    case read_result of {
147         Left err ->     -- Not found, so add an empty export env to the Ifaces map
148                         -- so that we don't look again
149            let
150                 fake_mod    = mkVanillaModule mod_name
151                 fake_iface  = emptyModIface fake_mod
152                 new_ifaces  = ifaces { iPIT = extendModuleEnv pit fake_mod fake_iface }
153            in
154            setIfacesRn new_ifaces               `thenRn_`
155            returnRn (fake_iface, Just err) ;
156
157         -- Found and parsed!
158         Right (mod, iface) ->
159
160         -- LOAD IT INTO Ifaces
161
162         -- NB: *first* we do loadDecl, so that the provenance of all the locally-defined
163         ---    names is done correctly (notably, whether this is an .hi file or .hi-boot file).
164         --     If we do loadExport first the wrong info gets into the cache (unless we
165         --      explicitly tag each export which seems a bit of a bore)
166
167
168         -- Sanity check.  If we're system-importing a module we know nothing at all
169         -- about, it should be from a different package to this one
170     WARN( not (maybeToBool mod_info) && 
171           case from of { ImportBySystem -> True; other -> False } &&
172           isModuleInThisPackage mod,
173           ppr mod )
174
175     loadDecls mod               (iDecls ifaces)   (pi_decls iface)      `thenRn` \ (decls_vers, new_decls) ->
176     loadRules mod               (iRules ifaces)   (pi_rules iface)      `thenRn` \ (rule_vers, new_rules) ->
177     loadInstDecls mod           (iInsts ifaces)   (pi_insts iface)      `thenRn` \ new_insts ->
178     loadExports                                   (pi_exports iface)    `thenRn` \ (export_vers, avails) ->
179     loadFixDecls mod                              (pi_fixity iface)     `thenRn` \ fix_env ->
180     loadDeprecs mod                               (pi_deprecs iface)    `thenRn` \ deprec_env ->
181     let
182         version = VersionInfo { vers_module  = pi_vers iface, 
183                                 vers_exports = export_vers,
184                                 vers_rules = rule_vers,
185                                 vers_decls = decls_vers }
186
187         -- For an explicit user import, add to mod_map info about
188         -- the things the imported module depends on, extracted
189         -- from its usage info; and delete the module itself, which is now in the PIT
190         mod_map1 = case from of
191                         ImportByUser -> addModDeps mod is_loaded (pi_usages iface) mod_map
192                         other        -> mod_map
193         mod_map2 = delFromFM mod_map1 mod_name
194         is_loaded m = maybeToBool (lookupIfaceByModName hit pit m)
195
196         -- Now add info about this module to the PIT
197         has_orphans = pi_orphan iface
198         new_pit   = extendModuleEnv pit mod mod_iface
199         mod_iface = ModIface { mi_module = mod, mi_version = version,
200                                mi_orphan = has_orphans, mi_boot = hi_boot_file,
201                                mi_exports = avails, 
202                                mi_fixities = fix_env, mi_deprecs = deprec_env,
203                                mi_usages  = [], -- Will be filled in later
204                                mi_decls   = panic "No mi_decls in PIT",
205                                mi_globals = panic "No mi_globals in PIT"
206                     }
207
208         new_ifaces = ifaces { iPIT        = new_pit,
209                               iDecls      = new_decls,
210                               iInsts      = new_insts,
211                               iRules      = new_rules,
212                               iImpModInfo = mod_map2  }
213     in
214     setIfacesRn new_ifaces              `thenRn_`
215     returnRn (mod_iface, Nothing)
216     }}
217
218 -----------------------------------------------------
219 --      Adding module dependencies from the 
220 --      import decls in the interface file
221 -----------------------------------------------------
222
223 addModDeps :: Module 
224            -> (ModuleName -> Bool)      -- True for module interfaces
225            -> [ImportVersion a] 
226            -> ImportedModuleInfo -> ImportedModuleInfo
227 -- (addModDeps M ivs deps)
228 -- We are importing module M, and M.hi contains 'import' decls given by ivs
229 addModDeps mod is_loaded new_deps mod_deps
230   = foldr add mod_deps filtered_new_deps
231   where
232         -- Don't record dependencies when importing a module from another package
233         -- Except for its descendents which contain orphans,
234         -- and in that case, forget about the boot indicator
235     filtered_new_deps :: [(ModuleName, (WhetherHasOrphans, IsBootInterface))]
236     filtered_new_deps
237         | isModuleInThisPackage mod 
238                             = [ (imp_mod, (has_orphans, is_boot))
239                               | (imp_mod, has_orphans, is_boot, _) <- new_deps,
240                                 not (is_loaded imp_mod)
241                               ]                       
242         | otherwise         = [ (imp_mod, (True, False))
243                               | (imp_mod, has_orphans, _, _) <- new_deps,
244                                 not (is_loaded imp_mod) && has_orphans
245                               ]
246     add (imp_mod, dep) deps = addToFM_C combine deps imp_mod dep
247
248     combine old@(old_has_orphans, old_is_boot) new@(new_has_orphans, new_is_boot)
249         | old_is_boot = new     -- Record the best is_boot info
250         | otherwise   = old
251
252 -----------------------------------------------------
253 --      Loading the export list
254 -----------------------------------------------------
255
256 loadExports :: (Version, [ExportItem]) -> RnM d (Version, [(ModuleName,Avails)])
257 loadExports (vers, items)
258   = getModuleRn                                 `thenRn` \ this_mod ->
259     mapRn (loadExport this_mod) items           `thenRn` \ avails_s ->
260     returnRn (vers, avails_s)
261
262
263 loadExport :: Module -> ExportItem -> RnM d (ModuleName, Avails)
264 loadExport this_mod (mod, entities)
265   = mapRn (load_entity mod) entities    `thenRn` \ avails ->
266     returnRn (mod, avails)
267   where
268     load_entity mod (Avail occ)
269       = newGlobalName mod occ   `thenRn` \ name ->
270         returnRn (Avail name)
271     load_entity mod (AvailTC occ occs)
272       = newGlobalName mod occ           `thenRn` \ name ->
273         mapRn (newGlobalName mod) occs  `thenRn` \ names ->
274         returnRn (AvailTC name names)
275
276
277 -----------------------------------------------------
278 --      Loading type/class/value decls
279 -----------------------------------------------------
280
281 loadDecls :: Module 
282           -> DeclsMap
283           -> [(Version, RdrNameTyClDecl)]
284           -> RnM d (NameEnv Version, DeclsMap)
285 loadDecls mod (decls_map, n_slurped) decls
286   = foldlRn (loadDecl mod) (emptyNameEnv, decls_map) decls      `thenRn` \ (vers, decls_map') -> 
287     returnRn (vers, (decls_map', n_slurped))
288
289 loadDecl mod (version_map, decls_map) (version, decl)
290   = getIfaceDeclBinders mod decl        `thenRn` \ full_avail ->
291     let
292         main_name     = availName full_avail
293         new_decls_map = extendNameEnvList decls_map stuff
294         stuff         = [ (name, (full_avail, name==main_name, (mod, decl))) 
295                         | name <- availNames full_avail]
296
297         new_version_map = extendNameEnv version_map main_name version
298     in
299     returnRn (new_version_map, new_decls_map)
300
301 -----------------------------------------------------
302 --      Loading fixity decls
303 -----------------------------------------------------
304
305 loadFixDecls mod decls
306   = mapRn (loadFixDecl mod_name) decls  `thenRn` \ to_add ->
307     returnRn (mkNameEnv to_add)
308   where
309     mod_name = moduleName mod
310
311 loadFixDecl mod_name sig@(FixitySig rdr_name fixity loc)
312   = newGlobalName mod_name (rdrNameOcc rdr_name)        `thenRn` \ name ->
313     returnRn (name, fixity)
314
315
316 -----------------------------------------------------
317 --      Loading instance decls
318 -----------------------------------------------------
319
320 loadInstDecls :: Module
321               -> IfaceInsts
322               -> [RdrNameInstDecl]
323               -> RnM d IfaceInsts
324 loadInstDecls mod (insts, n_slurped) decls
325   = setModuleRn mod $
326     foldlRn (loadInstDecl mod) insts decls      `thenRn` \ insts' ->
327     returnRn (insts', n_slurped)
328
329
330 loadInstDecl mod insts decl@(InstDecl inst_ty _ _ _ _)
331   =     -- Find out what type constructors and classes are "gates" for the
332         -- instance declaration.  If all these "gates" are slurped in then
333         -- we should slurp the instance decl too.
334         -- 
335         -- We *don't* want to count names in the context part as gates, though.
336         -- For example:
337         --              instance Foo a => Baz (T a) where ...
338         --
339         -- Here the gates are Baz and T, but *not* Foo.
340     let 
341         munged_inst_ty = removeContext inst_ty
342         free_names     = extractHsTyRdrNames munged_inst_ty
343     in
344     mapRn lookupIfaceName free_names    `thenRn` \ gate_names ->
345     returnRn ((gate_names, (mod, decl)) `consBag` insts)
346
347
348 -- In interface files, the instance decls now look like
349 --      forall a. Foo a -> Baz (T a)
350 -- so we have to strip off function argument types as well
351 -- as the bit before the '=>' (which is always empty in interface files)
352 removeContext (HsForAllTy tvs cxt ty) = HsForAllTy tvs [] (removeFuns ty)
353 removeContext ty                      = removeFuns ty
354
355 removeFuns (HsFunTy _ ty) = removeFuns ty
356 removeFuns ty               = ty
357
358
359 -----------------------------------------------------
360 --      Loading Rules
361 -----------------------------------------------------
362
363 loadRules :: Module -> IfaceRules 
364           -> (Version, [RdrNameRuleDecl])
365           -> RnM d (Version, IfaceRules)
366 loadRules mod (rule_bag, n_slurped) (version, rules)
367   | null rules || opt_IgnoreIfacePragmas 
368   = returnRn (version, (rule_bag, n_slurped))
369   | otherwise
370   = setModuleRn mod                     $
371     mapRn (loadRule mod) rules          `thenRn` \ new_rules ->
372     returnRn (version, (rule_bag `unionBags` listToBag new_rules, n_slurped))
373
374 loadRule :: Module -> RdrNameRuleDecl -> RnM d (GatedDecl RdrNameRuleDecl)
375 -- "Gate" the rule simply by whether the rule variable is
376 -- needed.  We can refine this later.
377 loadRule mod decl@(IfaceRule _ _ var _ _ src_loc)
378   = lookupIfaceName var         `thenRn` \ var_name ->
379     returnRn ([var_name], (mod, decl))
380
381
382 -----------------------------------------------------
383 --      Loading Deprecations
384 -----------------------------------------------------
385
386 loadDeprecs :: Module -> IfaceDeprecs -> RnM d Deprecations
387 loadDeprecs m Nothing                                  = returnRn NoDeprecs
388 loadDeprecs m (Just (Left txt))  = returnRn (DeprecAll txt)
389 loadDeprecs m (Just (Right prs)) = setModuleRn m                                $
390                                    foldlRn loadDeprec emptyNameEnv prs  `thenRn` \ env ->
391                                    returnRn (DeprecSome env)
392 loadDeprec deprec_env (n, txt)
393   = lookupIfaceName n           `thenRn` \ name ->
394     traceRn (text "Loaded deprecation(s) for" <+> ppr name <> colon <+> ppr txt) `thenRn_`
395     returnRn (extendNameEnv deprec_env name (name,txt))
396 \end{code}
397
398
399 %*********************************************************
400 %*                                                      *
401 \subsection{Getting binders out of a declaration}
402 %*                                                      *
403 %*********************************************************
404
405 @getDeclBinders@ returns the names for a @RdrNameHsDecl@.
406 It's used for both source code (from @availsFromDecl@) and interface files
407 (from @loadDecl@).
408
409 It doesn't deal with source-code specific things: @ValD@, @DefD@.  They
410 are handled by the sourc-code specific stuff in @RnNames@.
411
412 \begin{code}
413 getIfaceDeclBinders, getTyClDeclBinders
414         :: Module
415         -> RdrNameTyClDecl
416         -> RnM d AvailInfo
417
418 getIfaceDeclBinders mod tycl_decl
419   = getTyClDeclBinders    mod tycl_decl `thenRn` \ avail ->
420     getSysTyClDeclBinders mod tycl_decl `thenRn` \ extras ->
421     returnRn (addSysAvails avail extras)
422                 -- Add the sys-binders to avail.  When we import the decl,
423                 -- it's full_avail that will get added to the 'already-slurped' set (iSlurp)
424                 -- If we miss out sys-binders, we'll read the decl multiple times!
425
426 getTyClDeclBinders mod (IfaceSig var ty prags src_loc)
427   = newTopBinder mod var src_loc                        `thenRn` \ var_name ->
428     returnRn (Avail var_name)
429
430 getTyClDeclBinders mod tycl_decl
431   = mapRn do_one (tyClDeclNames tycl_decl)      `thenRn` \ (main_name:sub_names) ->
432     returnRn (AvailTC main_name (main_name : sub_names))
433   where
434     do_one (name,loc) = newTopBinder mod name loc
435 \end{code}
436
437 @getDeclSysBinders@ gets the implicit binders introduced by a decl.
438 A the moment that's just the tycon and datacon that come with a class decl.
439 They aren't returned by @getDeclBinders@ because they aren't in scope;
440 but they {\em should} be put into the @DeclsMap@ of this module.
441
442 Note that this excludes the default-method names of a class decl,
443 and the dict fun of an instance decl, because both of these have 
444 bindings of their own elsewhere.
445
446 \begin{code}
447 getSysTyClDeclBinders mod (ClassDecl _ cname _ _ sigs _ names src_loc)
448   = sequenceRn [newTopBinder mod n src_loc | n <- names]
449
450 getSysTyClDeclBinders mod (TyData _ _ _ _ cons _ _ _ _ _)
451   = sequenceRn [newTopBinder mod wkr_name src_loc | ConDecl _ wkr_name _ _ _ src_loc <- cons]
452
453 getSysTyClDeclBinders mod other_decl
454   = returnRn []
455 \end{code}
456
457 %*********************************************************
458 %*                                                      *
459 \subsection{Reading an interface file}
460 %*                                                      *
461 %*********************************************************
462
463 \begin{code}
464 findAndReadIface :: SDoc -> ModuleName 
465                  -> IsBootInterface     -- True  <=> Look for a .hi-boot file
466                                         -- False <=> Look for .hi file
467                  -> RnM d (Either Message (Module, ParsedIface))
468         -- Nothing <=> file not found, or unreadable, or illegible
469         -- Just x  <=> successfully found and parsed 
470
471 findAndReadIface doc_str mod_name hi_boot_file
472   = traceRn trace_msg                   `thenRn_`
473     ioToRnM (findModule mod_name)       `thenRn` \ maybe_found ->
474     doptRn Opt_D_dump_rn_trace          `thenRn` \ rn_trace ->
475     case maybe_found of
476       Right (Just (wanted_mod,locn))
477         -> ioToRnM_no_fail (
478               readIface rn_trace 
479                  (unJust (ml_hi_file locn) "findAndReadIface"
480                   ++ if hi_boot_file then "-boot" else "")
481            )
482                                         `thenRn` \ read_result ->
483            case read_result of
484               Left bad -> returnRn (Left bad)
485               Right iface 
486                  -> let read_mod = pi_mod iface
487                     in warnCheckRn (wanted_mod == read_mod)
488                                    (hiModuleNameMismatchWarn wanted_mod read_mod) 
489                                         `thenRn_`
490                        returnRn (Right (wanted_mod, iface))
491         -- Can't find it
492       other   -> traceRn (ptext SLIT("...not found"))   `thenRn_`
493                  returnRn (Left (noIfaceErr mod_name hi_boot_file))
494
495   where
496     trace_msg = sep [hsep [ptext SLIT("Reading"), 
497                            if hi_boot_file then ptext SLIT("[boot]") else empty,
498                            ptext SLIT("interface for"), 
499                            ppr mod_name <> semi],
500                      nest 4 (ptext SLIT("reason:") <+> doc_str)]
501 \end{code}
502
503 @readIface@ tries just the one file.
504
505 \begin{code}
506 readIface :: Bool -> String -> IO (Either Message ParsedIface)
507         -- Nothing <=> file not found, or unreadable, or illegible
508         -- Just x  <=> successfully found and parsed 
509 readIface tr file_path
510   = when tr (printErrs (ptext SLIT("readIFace") <+> text file_path)) 
511     >>
512     ((hGetStringBuffer False file_path  >>= \ contents ->
513         case parseIface contents
514                         PState{ bol = 0#, atbol = 1#,
515                                 context = [],
516                                 glasgow_exts = 1#,
517                                 loc = mkSrcLoc (mkFastString file_path) 1 } of
518                   POk _  (PIface iface) -> return (Right iface)
519                   PFailed err   -> bale_out err
520                   parse_result  -> bale_out empty
521                         -- This last case can happen if the interface file is (say) empty
522                         -- in which case the parser thinks it looks like an IdInfo or
523                         -- something like that.  Just an artefact of the fact that the
524                         -- parser is used for several purposes at once.
525    )
526    `catch` 
527    (\ io_err -> bale_out (text (show io_err))))
528   where
529     bale_out err = return (Left (badIfaceFile file_path err))
530 \end{code}
531
532
533 %*********************************************************
534 %*                                                      *
535 \subsection{Looking up fixities}
536 %*                                                      *
537 %*********************************************************
538
539 @lookupFixityRn@ has to be in RnIfaces (or RnHiFiles) because 
540 it calls @loadHomeInterface@.
541
542 lookupFixity is a bit strange.  
543
544 * Nested local fixity decls are put in the local fixity env, which we
545   find with getFixtyEnv
546
547 * Imported fixities are found in the HIT or PIT
548
549 * Top-level fixity decls in this module may be for Names that are
550     either  Global         (constructors, class operations)
551     or      Local/Exported (everything else)
552   (See notes with RnNames.getLocalDeclBinders for why we have this split.)
553   We put them all in the local fixity environment
554
555 \begin{code}
556 lookupFixityRn :: Name -> RnMS Fixity
557 lookupFixityRn name
558   = getModuleRn                         `thenRn` \ this_mod ->
559     if nameIsLocalOrFrom this_mod name
560     then        -- It's defined in this module
561         getFixityEnv                    `thenRn` \ local_fix_env ->
562         returnRn (lookupLocalFixity local_fix_env name)
563
564     else        -- It's imported
565       -- For imported names, we have to get their fixities by doing a loadHomeInterface,
566       -- and consulting the Ifaces that comes back from that, because the interface
567       -- file for the Name might not have been loaded yet.  Why not?  Suppose you import module A,
568       -- which exports a function 'f', which is defined in module B.  Then B isn't loaded
569       -- right away (after all, it's possible that nothing from B will be used).
570       -- When we come across a use of 'f', we need to know its fixity, and it's then,
571       -- and only then, that we load B.hi.  That is what's happening here.
572         loadHomeInterface doc name              `thenRn` \ iface ->
573         returnRn (lookupNameEnv (mi_fixities iface) name `orElse` defaultFixity)
574   where
575     doc      = ptext SLIT("Checking fixity for") <+> ppr name
576 \end{code}
577
578
579 %*********************************************************
580 %*                                                       *
581 \subsection{Errors}
582 %*                                                       *
583 %*********************************************************
584
585 \begin{code}
586 noIfaceErr mod_name boot_file
587   = ptext SLIT("Could not find interface file for") <+> quotes (ppr mod_name)
588         -- We used to print the search path, but we can't do that
589         -- now, because it's hidden inside the finder.
590         -- Maybe the finder should expose more functions.
591
592 badIfaceFile file err
593   = vcat [ptext SLIT("Bad interface file:") <+> text file, 
594           nest 4 err]
595
596 hiModuleNameMismatchWarn :: Module -> Module  -> Message
597 hiModuleNameMismatchWarn requested_mod read_mod = 
598     hsep [ ptext SLIT("Something is amiss; requested module name")
599          , ppr (moduleName requested_mod)
600          , ptext SLIT("differs from name found in the interface file")
601          , ppr read_mod
602          ]
603
604 warnRedundantSourceImport mod_name
605   = ptext SLIT("Unnecessary {- SOURCE -} in the import of module")
606           <+> quotes (ppr mod_name)
607 \end{code}
608