f1a0d5728cee5a7b69f71822da8ffbc98d5ed5e8
[ghc.git] / compiler / iface / MkIface.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1993-1998
3 %
4
5 \begin{code}
6 module MkIface ( 
7         mkUsageInfo,    -- Construct the usage info for a module
8
9         mkIface,        -- Build a ModIface from a ModGuts, 
10                         -- including computing version information
11
12         writeIfaceFile, -- Write the interface file
13
14         checkOldIface,  -- See if recompilation is required, by
15                         -- comparing version information
16
17         tyThingToIfaceDecl -- Converting things to their Iface equivalents
18  ) where
19 \end{code}
20
21         -----------------------------------------------
22                 MkIface.lhs deals with versioning
23         -----------------------------------------------
24
25 Here's the version-related info in an interface file
26
27   module Foo 8          -- module-version 
28              3          -- export-list-version
29              2          -- rule-version
30     Usages:     -- Version info for what this compilation of Foo imported
31         Baz 3           -- Module version
32             [4]         -- The export-list version if Foo depended on it
33             (g,2)       -- Function and its version
34             (T,1)       -- Type and its version
35
36     <version> f :: Int -> Int {- Unfolding: \x -> Wib.t[2] x -}
37                 -- The [2] says that f's unfolding 
38                 -- mentions verison 2 of Wib.t
39         
40         -----------------------------------------------
41                         Basic idea
42         -----------------------------------------------
43
44 Basic idea: 
45   * In the mi_usages information in an interface, we record the 
46     version number of each free variable of the module
47
48   * In mkIface, we compute the version number of each exported thing A.f
49     by comparing its A.f's info with its new info, and bumping its 
50     version number if it differs.  If A.f mentions B.g, and B.g's version
51     number has changed, then we count A.f as having changed too.
52
53   * In checkOldIface we compare the mi_usages for the module with
54     the actual version info for all each thing recorded in mi_usages
55
56
57 Fixities
58 ~~~~~~~~
59 We count A.f as changing if its fixity changes
60
61 Rules
62 ~~~~~
63 If a rule changes, we want to recompile any module that might be
64 affected by that rule.  For non-orphan rules, this is relatively easy.
65 If module M defines f, and a rule for f, just arrange that the version
66 number for M.f changes if any of the rules for M.f change.  Any module
67 that does not depend on M.f can't be affected by the rule-change
68 either.
69
70 Orphan rules (ones whose 'head function' is not defined in M) are
71 harder.  Here's what we do.
72
73   * We have a per-module orphan-rule version number which changes if 
74     any orphan rule changes. (It's unaffected by non-orphan rules.)
75
76   * We record usage info for any orphan module 'below' this one,
77     giving the orphan-rule version number.  We recompile if this 
78     changes. 
79
80 The net effect is that if an orphan rule changes, we recompile every
81 module above it.  That's very conservative, but it's devilishly hard
82 to know what it might affect, so we just have to be conservative.
83
84 Instance decls
85 ~~~~~~~~~~~~~~
86 In an iface file we have
87      module A where
88         instance Eq a => Eq [a]  =  dfun29
89         dfun29 :: ... 
90
91 We have a version number for dfun29, covering its unfolding
92 etc. Suppose we are compiling a module M that imports A only
93 indirectly.  If typechecking M uses this instance decl, we record the
94 dependency on A.dfun29 as if it were a free variable of the module
95 (via the tcg_inst_usages accumulator).  That means that A will appear
96 in M's usage list.  If the shape of the instance declaration changes,
97 then so will dfun29's version, triggering a recompilation.
98
99 Adding an instance declaration, or changing an instance decl that is
100 not currently used, is more tricky.  (This really only makes a
101 difference when we have overlapping instance decls, because then the
102 new instance decl might kick in to override the old one.)  We handle
103 this in a very similar way that we handle rules above.
104
105   * For non-orphan instance decls, identify one locally-defined tycon/class
106     mentioned in the decl.  Treat the instance decl as part of the defn of that
107     tycon/class, so that if the shape of the instance decl changes, so does the
108     tycon/class; that in turn will force recompilation of anything that uses
109     that tycon/class.
110
111   * For orphan instance decls, act the same way as for orphan rules.
112     Indeed, we use the same global orphan-rule version number.
113
114 mkUsageInfo
115 ~~~~~~~~~~~
116 mkUsageInfo figures out what the ``usage information'' for this
117 moudule is; that is, what it must record in its interface file as the
118 things it uses.  
119
120 We produce a line for every module B below the module, A, currently being
121 compiled:
122         import B <n> ;
123 to record the fact that A does import B indirectly.  This is used to decide
124 to look to look for B.hi rather than B.hi-boot when compiling a module that
125 imports A.  This line says that A imports B, but uses nothing in it.
126 So we'll get an early bale-out when compiling A if B's version changes.
127
128 The usage information records:
129
130 \begin{itemize}
131 \item   (a) anything reachable from its body code
132 \item   (b) any module exported with a @module Foo@
133 \item   (c) anything reachable from an exported item
134 \end{itemize}
135
136 Why (b)?  Because if @Foo@ changes then this module's export list
137 will change, so we must recompile this module at least as far as
138 making a new interface file --- but in practice that means complete
139 recompilation.
140
141 Why (c)?  Consider this:
142 \begin{verbatim}
143         module A( f, g ) where  |       module B( f ) where
144           import B( f )         |         f = h 3
145           g = ...               |         h = ...
146 \end{verbatim}
147
148 Here, @B.f@ isn't used in A.  Should we nevertheless record @B.f@ in
149 @A@'s usages?  Our idea is that we aren't going to touch A.hi if it is
150 *identical* to what it was before.  If anything about @B.f@ changes
151 than anyone who imports @A@ should be recompiled in case they use
152 @B.f@ (they'll get an early exit if they don't).  So, if anything
153 about @B.f@ changes we'd better make sure that something in A.hi
154 changes, and the convenient way to do that is to record the version
155 number @B.f@ in A.hi in the usage list.  If B.f changes that'll force a
156 complete recompiation of A, which is overkill but it's the only way to 
157 write a new, slightly different, A.hi.
158
159 But the example is tricker.  Even if @B.f@ doesn't change at all,
160 @B.h@ may do so, and this change may not be reflected in @f@'s version
161 number.  But with -O, a module that imports A must be recompiled if
162 @B.h@ changes!  So A must record a dependency on @B.h@.  So we treat
163 the occurrence of @B.f@ in the export list *just as if* it were in the
164 code of A, and thereby haul in all the stuff reachable from it.
165
166         *** Conclusion: if A mentions B.f in its export list,
167             behave just as if A mentioned B.f in its source code,
168             and slurp in B.f and all its transitive closure ***
169
170 [NB: If B was compiled with -O, but A isn't, we should really *still*
171 haul in all the unfoldings for B, in case the module that imports A *is*
172 compiled with -O.  I think this is the case.]
173
174
175 \begin{code}
176 #include "HsVersions.h"
177
178 import IfaceSyn         -- All of it
179 import IfaceType        ( toIfaceTvBndrs, toIfaceType, toIfaceContext )
180 import LoadIface        ( readIface, loadInterface, pprModIface )
181 import Id               ( Id, idName, idType, idInfo, idArity, isDataConWorkId_maybe, isFCallId_maybe )
182 import IdInfo           ( IdInfo, CafInfo(..), WorkerInfo(..), 
183                           arityInfo, cafInfo, newStrictnessInfo, 
184                           workerInfo, unfoldingInfo, inlinePragInfo )
185 import NewDemand        ( isTopSig )
186 import CoreSyn
187 import Class            ( classExtraBigSig, classTyCon )
188 import TyCon            ( TyCon, AlgTyConRhs(..), SynTyConRhs(..),
189                           isRecursiveTyCon, isForeignTyCon, 
190                           isSynTyCon, isAlgTyCon, isPrimTyCon, isFunTyCon,
191                           isTupleTyCon, tupleTyConBoxity, tyConStupidTheta,
192                           tyConHasGenerics, synTyConRhs, isGadtSyntaxTyCon,
193                           tyConArity, tyConTyVars, algTyConRhs, tyConExtName,
194                           tyConFamInst_maybe )
195 import DataCon          ( dataConName, dataConFieldLabels, dataConStrictMarks,
196                           dataConTyCon, dataConIsInfix, dataConUnivTyVars,
197                           dataConExTyVars, dataConEqSpec, dataConTheta,
198                           dataConOrigArgTys ) 
199 import Type             ( TyThing(..), splitForAllTys, funResultTy )
200 import TcType           ( deNoteType )
201 import TysPrim          ( alphaTyVars )
202 import InstEnv          ( Instance(..) )
203 import TcRnMonad
204 import HscTypes         ( ModIface(..), ModDetails(..), 
205                           ModGuts(..), HscEnv(..), hscEPS, Dependencies(..),
206                           FixItem(..), 
207                           ModSummary(..), msHiFilePath, 
208                           mkIfaceDepCache, mkIfaceFixCache, mkIfaceVerCache,
209                           typeEnvElts, mkIfaceFamInstsCache,
210                           GenAvailInfo(..), availName, 
211                           ExternalPackageState(..),
212                           Usage(..), IsBootInterface,
213                           Deprecs(..), IfaceDeprecs, Deprecations,
214                           lookupIfaceByModule
215                         )
216
217
218 import DynFlags         ( GhcMode(..), DynFlags(..), DynFlag(..), dopt )
219 import Name             ( Name, nameModule, nameOccName, nameParent,
220                           isExternalName, isInternalName, nameParent_maybe, isWiredInName,
221                           isImplicitName, NamedThing(..) )
222 import NameEnv
223 import NameSet
224 import OccName          ( OccName, OccEnv, mkOccEnv, lookupOccEnv, emptyOccEnv,
225                           extendOccEnv_C,
226                           OccSet, emptyOccSet, elemOccSet, occSetElts, 
227                           extendOccSet, extendOccSetList,
228                           isEmptyOccSet, intersectOccSet, intersectsOccSet,
229                           occNameFS, isTcOcc )
230 import Module
231 import Outputable
232 import BasicTypes       ( Version, initialVersion, bumpVersion, isAlwaysActive,
233                           Activation(..), RecFlag(..), boolToRecFlag )
234 import Outputable
235 import Util             ( createDirectoryHierarchy, directoryOf, sortLe, seqList, lengthIs )
236 import BinIface         ( writeBinIface )
237 import Unique           ( Unique, Uniquable(..) )
238 import ErrUtils         ( dumpIfSet_dyn, showPass )
239 import Digraph          ( stronglyConnComp, SCC(..) )
240 import SrcLoc           ( SrcSpan )
241 import UniqFM
242 import PackageConfig    ( PackageId )
243 import FiniteMap
244 import FastString
245
246 import Monad            ( when )
247 import List             ( insert )
248 import Maybes           ( orElse, mapCatMaybes, isNothing, isJust, 
249                           expectJust, catMaybes, MaybeErr(..) )
250 \end{code}
251
252
253
254 %************************************************************************
255 %*                                                                      *
256 \subsection{Completing an interface}
257 %*                                                                      *
258 %************************************************************************
259
260 \begin{code}
261 mkIface :: HscEnv
262         -> Maybe ModIface       -- The old interface, if we have it
263         -> ModGuts              -- Usages, deprecations, etc
264         -> ModDetails           -- The trimmed, tidied interface
265         -> IO (ModIface,        -- The new one, complete with decls and versions
266                Bool)            -- True <=> there was an old Iface, and the new one
267                                 --          is identical, so no need to write it
268
269 mkIface hsc_env maybe_old_iface 
270         (ModGuts{     mg_module   = this_mod,
271                       mg_boot     = is_boot,
272                       mg_usages   = usages,
273                       mg_deps     = deps,
274                       mg_rdr_env  = rdr_env,
275                       mg_fix_env  = fix_env,
276                       mg_deprecs  = src_deprecs })
277         (ModDetails{  md_insts    = insts, 
278                       md_fam_insts= _fam_inst,  -- we use the type_env instead
279                       md_rules    = rules,
280                       md_types    = type_env,
281                       md_exports  = exports })
282         
283 -- NB:  notice that mkIface does not look at the bindings
284 --      only at the TypeEnv.  The previous Tidy phase has
285 --      put exactly the info into the TypeEnv that we want
286 --      to expose in the interface
287
288   = do  { eps <- hscEPS hsc_env
289         ; let   { ext_nm_rhs = mkExtNameFn hsc_env eps this_mod
290                 ; ext_nm_lhs = mkLhsNameFn this_mod
291
292                 ; decls  = [ tyThingToIfaceDecl ext_nm_rhs thing 
293                            | thing <- typeEnvElts type_env, 
294                              let name = getName thing,
295                              not (isImplicitName name || isWiredInName name) ]
296                         -- Don't put implicit Ids and class tycons in the interface file
297                         -- Nor wired-in things; the compiler knows about them anyhow
298
299                 ; fixities        = [ (occ,fix) 
300                                     | FixItem occ fix _ <- nameEnvElts fix_env]
301                 ; deprecs         = mkIfaceDeprec src_deprecs
302                 ; iface_rules     = map (coreRuleToIfaceRule 
303                                            ext_nm_lhs ext_nm_rhs) rules
304                 ; iface_insts     = map (instanceToIfaceInst ext_nm_lhs) insts
305                 ; iface_fam_insts = extractIfFamInsts decls
306
307                 ; intermediate_iface = ModIface { 
308                         mi_module   = this_mod,
309                         mi_boot     = is_boot,
310                         mi_deps     = deps,
311                         mi_usages   = usages,
312                         mi_exports  = mkIfaceExports exports,
313                         mi_insts    = sortLe le_inst iface_insts,
314                         mi_fam_insts= mkIfaceFamInstsCache decls,
315                         mi_rules    = sortLe le_rule iface_rules,
316                         mi_fixities = fixities,
317                         mi_deprecs  = deprecs,
318                         mi_globals  = Just rdr_env,
319
320                         -- Left out deliberately: filled in by addVersionInfo
321                         mi_mod_vers  = initialVersion,
322                         mi_exp_vers  = initialVersion,
323                         mi_rule_vers = initialVersion,
324                         mi_orphan    = False,   -- Always set by addVersionInfo, but
325                                                 -- it's a strict field, so we can't omit it.
326                         mi_decls     = deliberatelyOmitted "decls",
327                         mi_ver_fn    = deliberatelyOmitted "ver_fn",
328
329                         -- And build the cached values
330                         mi_dep_fn = mkIfaceDepCache deprecs,
331                         mi_fix_fn = mkIfaceFixCache fixities }
332
333                 -- Add version information
334                 ; (new_iface, no_change_at_all, pp_diffs, pp_orphs) 
335                         = _scc_ "versioninfo" 
336                          addVersionInfo maybe_old_iface intermediate_iface decls
337                 }
338
339                 -- Debug printing
340         ; when (isJust pp_orphs && dopt Opt_WarnOrphans dflags) 
341                (printDump (expectJust "mkIface" pp_orphs))
342         ; when (dopt Opt_D_dump_hi_diffs dflags) (printDump pp_diffs)
343         ; dumpIfSet_dyn dflags Opt_D_dump_hi "FINAL INTERFACE" 
344                         (pprModIface new_iface)
345
346         ; return (new_iface, no_change_at_all) }
347   where
348      r1      `le_rule`     r2      = ifRuleName r1 <= ifRuleName r2
349      i1      `le_inst`     i2      = ifDFun     i1 <= ifDFun     i2
350
351      dflags = hsc_dflags hsc_env
352      deliberatelyOmitted x = panic ("Deliberately omitted: " ++ x)
353
354                                               
355 -----------------------------
356 writeIfaceFile :: ModLocation -> ModIface -> IO ()
357 writeIfaceFile location new_iface
358     = do createDirectoryHierarchy (directoryOf hi_file_path)
359          writeBinIface hi_file_path new_iface
360     where hi_file_path = ml_hi_file location
361
362
363 -----------------------------
364 mkExtNameFn :: HscEnv -> ExternalPackageState -> Module -> Name -> IfaceExtName
365 mkExtNameFn hsc_env eps this_mod
366   = ext_nm
367   where
368     hpt = hsc_HPT hsc_env
369     pit = eps_PIT eps
370
371     ext_nm name 
372       | mod == this_mod = case nameParent_maybe name of
373                                 Nothing  -> LocalTop occ
374                                 Just par -> LocalTopSub occ (nameOccName par)
375       | isWiredInName name       = ExtPkg  mod occ
376       | is_home mod              = HomePkg mod_name occ vers
377       | otherwise                = ExtPkg  mod occ
378       where
379         dflags = hsc_dflags hsc_env
380         this_pkg = thisPackage dflags
381         is_home mod = modulePackageId mod == this_pkg
382
383         mod      = nameModule name
384         mod_name = moduleName mod
385         occ      = nameOccName name
386         par_occ  = nameOccName (nameParent name)
387                 -- The version of the *parent* is the one want
388         vers     = lookupVersion mod par_occ occ
389               
390     lookupVersion :: Module -> OccName -> OccName -> Version
391         -- Even though we're looking up a home-package thing, in
392         -- one-shot mode the imported interfaces may be in the PIT
393     lookupVersion mod par_occ occ
394       = mi_ver_fn iface par_occ `orElse` 
395         pprPanic "lookupVers1" (ppr mod <+> ppr par_occ <+> ppr occ)
396       where
397         iface = lookupIfaceByModule (hsc_dflags hsc_env) hpt pit mod `orElse` 
398                 pprPanic "lookupVers2" (ppr mod <+> ppr par_occ <+> ppr occ)
399
400
401 ---------------------
402 -- mkLhsNameFn ignores versioning info altogether
403 -- It is used for the LHS of instance decls and rules, where we 
404 -- there's no point in recording version info
405 mkLhsNameFn :: Module -> Name -> IfaceExtName
406 mkLhsNameFn this_mod name       
407   | isInternalName name = pprTrace "mkLhsNameFn: unexpected internal" (ppr name) $
408                           LocalTop occ  -- Should not happen
409   | mod == this_mod = LocalTop occ
410   | otherwise       = ExtPkg mod occ
411   where
412     mod = nameModule name
413     occ = nameOccName name
414
415
416 -----------------------------
417 -- Compute version numbers for local decls
418
419 addVersionInfo :: Maybe ModIface        -- The old interface, read from M.hi
420                -> ModIface              -- The new interface decls (lacking decls)
421                -> [IfaceDecl]           -- The new decls
422                -> (ModIface, 
423                    Bool,                -- True <=> no changes at all; no need to write new Iface
424                    SDoc,                -- Differences
425                    Maybe SDoc)          -- Warnings about orphans
426
427 addVersionInfo Nothing new_iface new_decls
428 -- No old interface, so definitely write a new one!
429   = (new_iface { mi_orphan = anyNothing ifInstOrph (mi_insts new_iface)
430                           || anyNothing ifRuleOrph (mi_rules new_iface),
431                  mi_decls  = [(initialVersion, decl) | decl <- new_decls],
432                  mi_ver_fn = \n -> Just initialVersion },
433      False, 
434      ptext SLIT("No old interface file"),
435      pprOrphans orph_insts orph_rules)
436   where
437     orph_insts = filter (isNothing . ifInstOrph) (mi_insts new_iface)
438     orph_rules = filter (isNothing . ifRuleOrph) (mi_rules new_iface)
439
440 addVersionInfo (Just old_iface@(ModIface { mi_mod_vers  = old_mod_vers, 
441                                            mi_exp_vers  = old_exp_vers, 
442                                            mi_rule_vers = old_rule_vers, 
443                                            mi_decls     = old_decls,
444                                            mi_ver_fn    = old_decl_vers,
445                                            mi_fix_fn    = old_fixities }))
446                new_iface@(ModIface { mi_fix_fn = new_fixities })
447                new_decls
448
449   | no_change_at_all = (old_iface,   True,  ptext SLIT("Interface file unchanged"), pp_orphs)
450   | otherwise        = (final_iface, False, vcat [ptext SLIT("Interface file has changed"),
451                                                   nest 2 pp_diffs], pp_orphs)
452   where
453     final_iface = new_iface { mi_mod_vers  = bump_unless no_output_change old_mod_vers,
454                               mi_exp_vers  = bump_unless no_export_change old_exp_vers,
455                               mi_rule_vers = bump_unless no_rule_change   old_rule_vers,
456                               mi_orphan    = not (null new_orph_rules && null new_orph_insts),
457                               mi_decls     = decls_w_vers,
458                               mi_ver_fn    = mkIfaceVerCache decls_w_vers }
459
460     decls_w_vers = [(add_vers decl, decl) | decl <- new_decls]
461
462     -------------------
463     (old_non_orph_insts, old_orph_insts) = mkOrphMap ifInstOrph (mi_insts old_iface)
464     (new_non_orph_insts, new_orph_insts) = mkOrphMap ifInstOrph (mi_insts new_iface)
465     same_insts occ = eqMaybeBy  (eqListBy eqIfInst) 
466                                 (lookupOccEnv old_non_orph_insts occ)
467                                 (lookupOccEnv new_non_orph_insts occ)
468   
469     (old_non_orph_rules, old_orph_rules) = mkOrphMap ifRuleOrph (mi_rules old_iface)
470     (new_non_orph_rules, new_orph_rules) = mkOrphMap ifRuleOrph (mi_rules new_iface)
471     same_rules occ = eqMaybeBy  (eqListBy eqIfRule)
472                                 (lookupOccEnv old_non_orph_rules occ)
473                                 (lookupOccEnv new_non_orph_rules occ)
474     -------------------
475     -- Computing what changed
476     no_output_change = no_decl_change   && no_rule_change && 
477                        no_export_change && no_deprec_change
478     no_export_change = mi_exports new_iface == mi_exports old_iface     -- Kept sorted
479     no_decl_change   = isEmptyOccSet changed_occs
480     no_rule_change   = not (changedWrt changed_occs (eqListBy eqIfRule old_orph_rules new_orph_rules)
481                          || changedWrt changed_occs (eqListBy eqIfInst old_orph_insts new_orph_insts))
482     no_deprec_change = mi_deprecs new_iface == mi_deprecs old_iface
483
484         -- If the usages havn't changed either, we don't need to write the interface file
485     no_other_changes = mi_usages new_iface == mi_usages old_iface && 
486                        mi_deps new_iface == mi_deps old_iface
487     no_change_at_all = no_output_change && no_other_changes
488  
489     pp_diffs = vcat [pp_change no_export_change "Export list" 
490                         (ppr old_exp_vers <+> arrow <+> ppr (mi_exp_vers final_iface)),
491                      pp_change no_rule_change "Rules"
492                         (ppr old_rule_vers <+> arrow <+> ppr (mi_rule_vers final_iface)),
493                      pp_change no_deprec_change "Deprecations" empty,
494                      pp_change no_other_changes  "Usages" empty,
495                      pp_decl_diffs]
496     pp_change True  what info = empty
497     pp_change False what info = text what <+> ptext SLIT("changed") <+> info
498
499     -------------------
500     old_decl_env = mkOccEnv [(ifName decl, decl) | (_,decl) <- old_decls]
501     same_fixity n = bool (old_fixities n == new_fixities n)
502
503     -------------------
504     -- Adding version info
505     new_version = bumpVersion old_mod_vers      -- Start from the old module version, not from zero
506                                                 -- so that if you remove f, and then add it again,
507                                                 -- you don't thereby reduce f's version number
508     add_vers decl | occ `elemOccSet` changed_occs = new_version
509                   | otherwise = expectJust "add_vers" (old_decl_vers occ)
510                                 -- If it's unchanged, there jolly well 
511                   where         -- should be an old version number
512                     occ = ifName decl
513
514     -------------------
515     changed_occs :: OccSet
516     changed_occs = computeChangedOccs eq_info
517
518     eq_info :: [(OccName, IfaceEq)]
519     eq_info = map check_eq new_decls
520     check_eq new_decl | Just old_decl <- lookupOccEnv old_decl_env occ 
521                       = (occ, new_decl `eqIfDecl` old_decl &&&
522                               eq_indirects new_decl)
523                       | otherwise {- No corresponding old decl -}      
524                       = (occ, NotEqual) 
525                       where
526                         occ = ifName new_decl
527
528     eq_indirects :: IfaceDecl -> IfaceEq
529                 -- When seeing if two decls are the same, remember to
530                 -- check whether any relevant fixity or rules have changed
531     eq_indirects (IfaceId {ifName = occ}) = eq_ind_occ occ
532     eq_indirects (IfaceClass {ifName = cls_occ, ifSigs = sigs})
533         = same_insts cls_occ &&& 
534           eq_ind_occs [op | IfaceClassOp op _ _ <- sigs] 
535     eq_indirects (IfaceData {ifName = tc_occ, ifCons = cons})
536         = same_insts tc_occ &&& same_fixity tc_occ &&&  -- The TyCon can have a fixity too
537           eq_ind_occs (map ifConOcc (visibleIfConDecls cons))
538     eq_indirects other = Equal  -- Synonyms and foreign declarations
539
540     eq_ind_occ :: OccName -> IfaceEq    -- For class ops and Ids; check fixity and rules
541     eq_ind_occ occ = same_fixity occ &&& same_rules occ
542     eq_ind_occs = foldr ((&&&) . eq_ind_occ) Equal 
543    
544     -------------------
545     -- Diffs
546     pp_decl_diffs :: SDoc       -- Nothing => no changes
547     pp_decl_diffs 
548         | isEmptyOccSet changed_occs = empty
549         | otherwise 
550         = vcat [ptext SLIT("Changed occs:") <+> ppr (occSetElts changed_occs),
551                 ptext SLIT("Version change for these decls:"),
552                 nest 2 (vcat (map show_change new_decls))]
553
554     eq_env = mkOccEnv eq_info
555     show_change new_decl
556         | not (occ `elemOccSet` changed_occs) = empty
557         | otherwise
558         = vcat [ppr occ <+> ppr (old_decl_vers occ) <+> arrow <+> ppr new_version, 
559                 nest 2 why]
560         where
561           occ = ifName new_decl
562           why = case lookupOccEnv eq_env occ of
563                     Just (EqBut occs) -> sep [ppr occ <> colon, ptext SLIT("Free vars (only) changed:"),
564                                               nest 2 (braces (fsep (map ppr (occSetElts 
565                                                 (occs `intersectOccSet` changed_occs)))))]
566                     Just NotEqual  
567                         | Just old_decl <- lookupOccEnv old_decl_env occ 
568                         -> vcat [ptext SLIT("Old:") <+> ppr old_decl,
569                          ptext SLIT("New:") <+> ppr new_decl]
570                         | otherwise 
571                         -> ppr occ <+> ptext SLIT("only in new interface")
572                     other -> pprPanic "MkIface.show_change" (ppr occ)
573         
574     pp_orphs = pprOrphans new_orph_insts new_orph_rules
575
576 pprOrphans insts rules
577   | null insts && null rules = Nothing
578   | otherwise
579   = Just $ vcat [
580         if null insts then empty else
581              hang (ptext SLIT("Warning: orphan instances:"))
582                 2 (vcat (map ppr insts)),
583         if null rules then empty else
584              hang (ptext SLIT("Warning: orphan rules:"))
585                 2 (vcat (map ppr rules))
586     ]
587
588 computeChangedOccs :: [(OccName, IfaceEq)] -> OccSet
589 computeChangedOccs eq_info
590   = foldl add_changes emptyOccSet (stronglyConnComp edges)
591   where
592     edges :: [((OccName,IfaceEq), Unique, [Unique])]
593     edges = [ (node, getUnique occ, map getUnique occs)
594             | node@(occ, iface_eq) <- eq_info
595             , let occs = case iface_eq of
596                            EqBut occ_set -> occSetElts occ_set
597                            other -> [] ]
598
599     -- Changes in declarations
600     add_changes :: OccSet -> SCC (OccName, IfaceEq) -> OccSet
601     add_changes so_far (AcyclicSCC (occ, iface_eq)) 
602         | changedWrt so_far iface_eq                            -- This one has changed
603         = extendOccSet so_far occ
604     add_changes so_far (CyclicSCC pairs)
605         | changedWrt so_far (foldr1 (&&&) (map snd pairs))      -- One of this group has changed
606         = extendOccSetList so_far (map fst pairs)
607     add_changes so_far other = so_far
608
609 changedWrt :: OccSet -> IfaceEq -> Bool
610 changedWrt so_far Equal        = False
611 changedWrt so_far NotEqual     = True
612 changedWrt so_far (EqBut kids) = so_far `intersectsOccSet` kids
613
614 ----------------------
615 -- mkOrphMap partitions instance decls or rules into
616 --      (a) an OccEnv for ones that are not orphans, 
617 --          mapping the local OccName to a list of its decls
618 --      (b) a list of orphan decls
619 mkOrphMap :: (decl -> Maybe OccName)    -- (Just occ) for a non-orphan decl, keyed by occ
620                                         -- Nothing for an orphan decl
621           -> [decl]                     -- Sorted into canonical order
622           -> (OccEnv [decl],            -- Non-orphan decls associated with their key;
623                                         --      each sublist in canonical order
624               [decl])                   -- Orphan decls; in canonical order
625 mkOrphMap get_key decls
626   = foldl go (emptyOccEnv, []) decls
627   where
628     go (non_orphs, orphs) d
629         | Just occ <- get_key d
630         = (extendOccEnv_C (\ ds _ -> d:ds) non_orphs occ [d], orphs)
631         | otherwise = (non_orphs, d:orphs)
632
633 anyNothing :: (a -> Maybe b) -> [a] -> Bool
634 anyNothing p []     = False
635 anyNothing p (x:xs) = isNothing (p x) || anyNothing p xs
636
637 ----------------------
638 mkIfaceDeprec :: Deprecations -> IfaceDeprecs
639 mkIfaceDeprec NoDeprecs        = NoDeprecs
640 mkIfaceDeprec (DeprecAll t)    = DeprecAll t
641 mkIfaceDeprec (DeprecSome env) = DeprecSome (sortLe (<=) (nameEnvElts env))
642
643 ----------------------
644 bump_unless :: Bool -> Version -> Version
645 bump_unless True  v = v -- True <=> no change
646 bump_unless False v = bumpVersion v
647 \end{code}
648
649
650 %*********************************************************
651 %*                                                      *
652 \subsection{Keeping track of what we've slurped, and version numbers}
653 %*                                                      *
654 %*********************************************************
655
656
657 \begin{code}
658 mkUsageInfo :: HscEnv 
659             -> ModuleEnv (Module, Bool, SrcSpan)
660             -> [(ModuleName, IsBootInterface)]
661             -> NameSet -> IO [Usage]
662 mkUsageInfo hsc_env dir_imp_mods dep_mods used_names
663   = do  { eps <- hscEPS hsc_env
664         ; let usages = mk_usage_info (eps_PIT eps) hsc_env 
665                                      dir_imp_mods dep_mods used_names
666         ; usages `seqList`  return usages }
667          -- seq the list of Usages returned: occasionally these
668          -- don't get evaluated for a while and we can end up hanging on to
669          -- the entire collection of Ifaces.
670
671 mk_usage_info pit hsc_env dir_imp_mods dep_mods proto_used_names
672   = mapCatMaybes mkUsage dep_mods
673         -- ToDo: do we need to sort into canonical order?
674   where
675     hpt = hsc_HPT hsc_env
676     dflags = hsc_dflags hsc_env
677
678     used_names = mkNameSet $                    -- Eliminate duplicates
679                  [ nameParent n                 -- Just record usage on the 'main' names
680                  | n <- nameSetToList proto_used_names
681                  , not (isWiredInName n)        -- Don't record usages for wired-in names
682                  , isExternalName n             -- Ignore internal names
683                  ]
684
685     -- ent_map groups together all the things imported and used
686     -- from a particular module in this package
687     ent_map :: ModuleEnv [OccName]
688     ent_map  = foldNameSet add_mv emptyModuleEnv used_names
689     add_mv name mv_map = extendModuleEnv_C add_item mv_map mod [occ]
690                    where
691                      occ = nameOccName name
692                      mod = nameModule name
693                      add_item occs _ = occ:occs
694     
695     depend_on_exports mod = case lookupModuleEnv dir_imp_mods mod of
696                                 Just (_,no_imp,_) -> not no_imp
697                                 Nothing           -> True
698     
699     -- We want to create a Usage for a home module if 
700     --  a) we used something from; has something in used_names
701     --  b) we imported all of it, even if we used nothing from it
702     --          (need to recompile if its export list changes: export_vers)
703     --  c) is a home-package orphan module (need to recompile if its
704     --          instance decls change: rules_vers)
705     mkUsage :: (ModuleName, IsBootInterface) -> Maybe Usage
706     mkUsage (mod_name, _)
707       |  isNothing maybe_iface          -- We can't depend on it if we didn't
708       || (null used_occs                -- load its interface.
709           && isNothing export_vers
710           && not orphan_mod)
711       = Nothing                 -- Record no usage info
712     
713       | otherwise       
714       = Just (Usage { usg_name     = mod_name,
715                       usg_mod      = mod_vers,
716                       usg_exports  = export_vers,
717                       usg_entities = ent_vers,
718                       usg_rules    = rules_vers })
719       where
720         maybe_iface  = lookupIfaceByModule dflags hpt pit mod
721                 -- In one-shot mode, the interfaces for home-package 
722                 -- modules accumulate in the PIT not HPT.  Sigh.
723
724         mod = mkModule (thisPackage dflags) mod_name
725
726         Just iface   = maybe_iface
727         orphan_mod   = mi_orphan    iface
728         version_env  = mi_ver_fn    iface
729         mod_vers     = mi_mod_vers  iface
730         rules_vers   = mi_rule_vers iface
731         export_vers | depend_on_exports mod = Just (mi_exp_vers iface)
732                     | otherwise             = Nothing
733     
734         -- The sort is to put them into canonical order
735         used_occs = lookupModuleEnv ent_map mod `orElse` []
736         ent_vers :: [(OccName,Version)]
737         ent_vers = [ (occ, version_env occ `orElse` initialVersion) 
738                    | occ <- sortLe (<=) used_occs]
739 \end{code}
740
741 \begin{code}
742 mkIfaceExports :: NameSet -> [(Module, [GenAvailInfo OccName])]
743   -- Group by module and sort by occurrence
744   -- This keeps the list in canonical order
745 mkIfaceExports exports 
746   = [ (mod, eltsUFM avails)
747     | (mod, avails) <- fmToList groupFM
748     ]
749   where
750     groupFM :: ModuleEnv (UniqFM (GenAvailInfo OccName))
751         -- Deliberately use the FastString so we
752         -- get a canonical ordering
753     groupFM = foldl add emptyModuleEnv (nameSetToList exports)
754
755     add env name = extendModuleEnv_C add_avail env mod
756                                         (unitUFM avail_fs avail)
757       where
758         occ    = nameOccName name
759         mod    = nameModule name
760         avail | Just p <- nameParent_maybe name = AvailTC (nameOccName p) [occ]
761               | isTcOcc occ                     = AvailTC occ [occ]
762               | otherwise                       = Avail occ
763         avail_fs = occNameFS (availName avail)      
764         add_avail avail_fm _ = addToUFM_C add_item avail_fm avail_fs avail
765
766         add_item (AvailTC p occs) _ = AvailTC p (List.insert occ occs)
767         add_item (Avail n)        _ = pprPanic "MkIface.addAvail" (ppr n <+> ppr name)
768 \end{code}
769
770
771 %************************************************************************
772 %*                                                                      *
773         Load the old interface file for this module (unless
774         we have it aleady), and check whether it is up to date
775         
776 %*                                                                      *
777 %************************************************************************
778
779 \begin{code}
780 checkOldIface :: HscEnv
781               -> ModSummary
782               -> Bool                   -- Source unchanged
783               -> Maybe ModIface         -- Old interface from compilation manager, if any
784               -> IO (RecompileRequired, Maybe ModIface)
785
786 checkOldIface hsc_env mod_summary source_unchanged maybe_iface
787   = do  { showPass (hsc_dflags hsc_env) 
788                    ("Checking old interface for " ++ 
789                         showSDoc (ppr (ms_mod mod_summary))) ;
790
791         ; initIfaceCheck hsc_env $
792           check_old_iface hsc_env mod_summary source_unchanged maybe_iface
793      }
794
795 check_old_iface hsc_env mod_summary source_unchanged maybe_iface
796  =      -- CHECK WHETHER THE SOURCE HAS CHANGED
797     ifM (not source_unchanged)
798         (traceHiDiffs (nest 4 (text "Source file changed or recompilation check turned off")))
799                                                 `thenM_`
800
801      -- If the source has changed and we're in interactive mode, avoid reading
802      -- an interface; just return the one we might have been supplied with.
803     getGhcMode                                  `thenM` \ ghc_mode ->
804     if (ghc_mode == Interactive || ghc_mode == JustTypecheck) 
805         && not source_unchanged then
806          returnM (outOfDate, maybe_iface)
807     else
808
809     case maybe_iface of {
810        Just old_iface -> do -- Use the one we already have
811         recomp <- checkVersions hsc_env source_unchanged old_iface
812         return (recomp, Just old_iface)
813
814     ;  Nothing ->
815
816         -- Try and read the old interface for the current module
817         -- from the .hi file left from the last time we compiled it
818     let
819         iface_path = msHiFilePath mod_summary
820     in
821     readIface (ms_mod mod_summary) iface_path False     `thenM` \ read_result ->
822     case read_result of {
823        Failed err ->    -- Old interface file not found, or garbled; give up
824                    traceIf (text "FYI: cannot read old interface file:"
825                                  $$ nest 4 err)         `thenM_`
826                    returnM (outOfDate, Nothing)
827
828     ;  Succeeded iface ->       
829
830         -- We have got the old iface; check its versions
831     checkVersions hsc_env source_unchanged iface        `thenM` \ recomp ->
832     returnM (recomp, Just iface)
833     }}
834 \end{code}
835
836 @recompileRequired@ is called from the HscMain.   It checks whether
837 a recompilation is required.  It needs access to the persistent state,
838 finder, etc, because it may have to load lots of interface files to
839 check their versions.
840
841 \begin{code}
842 type RecompileRequired = Bool
843 upToDate  = False       -- Recompile not required
844 outOfDate = True        -- Recompile required
845
846 checkVersions :: HscEnv
847               -> Bool           -- True <=> source unchanged
848               -> ModIface       -- Old interface
849               -> IfG RecompileRequired
850 checkVersions hsc_env source_unchanged iface
851   | not source_unchanged
852   = returnM outOfDate
853   | otherwise
854   = do  { traceHiDiffs (text "Considering whether compilation is required for" <+> 
855                         ppr (mi_module iface) <> colon)
856
857         -- Source code unchanged and no errors yet... carry on 
858
859         -- First put the dependent-module info, read from the old interface, into the envt, 
860         -- so that when we look for interfaces we look for the right one (.hi or .hi-boot)
861         -- 
862         -- It's just temporary because either the usage check will succeed 
863         -- (in which case we are done with this module) or it'll fail (in which
864         -- case we'll compile the module from scratch anyhow).
865         --      
866         -- We do this regardless of compilation mode
867         ; updateEps_ $ \eps  -> eps { eps_is_boot = mod_deps }
868
869         ; let this_pkg = thisPackage (hsc_dflags hsc_env)
870         ; checkList [checkModUsage this_pkg u | u <- mi_usages iface]
871     }
872   where
873         -- This is a bit of a hack really
874     mod_deps :: ModuleNameEnv (ModuleName, IsBootInterface)
875     mod_deps = mkModDeps (dep_mods (mi_deps iface))
876
877 checkModUsage :: PackageId ->Usage -> IfG RecompileRequired
878 -- Given the usage information extracted from the old
879 -- M.hi file for the module being compiled, figure out
880 -- whether M needs to be recompiled.
881
882 checkModUsage this_pkg (Usage { usg_name = mod_name, usg_mod = old_mod_vers,
883                                 usg_rules = old_rule_vers,
884                                 usg_exports = maybe_old_export_vers, 
885                                 usg_entities = old_decl_vers })
886   =     -- Load the imported interface is possible
887     let
888         doc_str = sep [ptext SLIT("need version info for"), ppr mod_name]
889     in
890     traceHiDiffs (text "Checking usages for module" <+> ppr mod_name) `thenM_`
891
892     let
893         mod = mkModule this_pkg mod_name
894     in
895     loadInterface doc_str mod ImportBySystem            `thenM` \ mb_iface ->
896         -- Load the interface, but don't complain on failure;
897         -- Instead, get an Either back which we can test
898
899     case mb_iface of {
900         Failed exn ->  (out_of_date (sep [ptext SLIT("Can't find version number for module"), 
901                                        ppr mod_name]));
902                 -- Couldn't find or parse a module mentioned in the
903                 -- old interface file.  Don't complain -- it might just be that
904                 -- the current module doesn't need that import and it's been deleted
905
906         Succeeded iface -> 
907     let
908         new_mod_vers    = mi_mod_vers  iface
909         new_decl_vers   = mi_ver_fn    iface
910         new_export_vers = mi_exp_vers  iface
911         new_rule_vers   = mi_rule_vers iface
912     in
913         -- CHECK MODULE
914     checkModuleVersion old_mod_vers new_mod_vers        `thenM` \ recompile ->
915     if not recompile then
916         returnM upToDate
917     else
918                                  
919         -- CHECK EXPORT LIST
920     if checkExportList maybe_old_export_vers new_export_vers then
921         out_of_date_vers (ptext SLIT("  Export list changed"))
922                          (expectJust "checkModUsage" maybe_old_export_vers) 
923                          new_export_vers
924     else
925
926         -- CHECK RULES
927     if old_rule_vers /= new_rule_vers then
928         out_of_date_vers (ptext SLIT("  Rules changed")) 
929                          old_rule_vers new_rule_vers
930     else
931
932         -- CHECK ITEMS ONE BY ONE
933     checkList [checkEntityUsage new_decl_vers u | u <- old_decl_vers]   `thenM` \ recompile ->
934     if recompile then
935         returnM outOfDate       -- This one failed, so just bail out now
936     else
937         up_to_date (ptext SLIT("  Great!  The bits I use are up to date"))
938     }
939
940 ------------------------
941 checkModuleVersion old_mod_vers new_mod_vers
942   | new_mod_vers == old_mod_vers
943   = up_to_date (ptext SLIT("Module version unchanged"))
944
945   | otherwise
946   = out_of_date_vers (ptext SLIT("  Module version has changed"))
947                      old_mod_vers new_mod_vers
948
949 ------------------------
950 checkExportList Nothing  new_vers = upToDate
951 checkExportList (Just v) new_vers = v /= new_vers
952
953 ------------------------
954 checkEntityUsage new_vers (name,old_vers)
955   = case new_vers name of
956
957         Nothing       ->        -- We used it before, but it ain't there now
958                           out_of_date (sep [ptext SLIT("No longer exported:"), ppr name])
959
960         Just new_vers   -- It's there, but is it up to date?
961           | new_vers == old_vers -> traceHiDiffs (text "  Up to date" <+> ppr name <+> parens (ppr new_vers)) `thenM_`
962                                     returnM upToDate
963           | otherwise            -> out_of_date_vers (ptext SLIT("  Out of date:") <+> ppr name)
964                                                      old_vers new_vers
965
966 up_to_date  msg = traceHiDiffs msg `thenM_` returnM upToDate
967 out_of_date msg = traceHiDiffs msg `thenM_` returnM outOfDate
968 out_of_date_vers msg old_vers new_vers 
969   = out_of_date (hsep [msg, ppr old_vers, ptext SLIT("->"), ppr new_vers])
970
971 ----------------------
972 checkList :: [IfG RecompileRequired] -> IfG RecompileRequired
973 -- This helper is used in two places
974 checkList []             = returnM upToDate
975 checkList (check:checks) = check        `thenM` \ recompile ->
976                            if recompile then 
977                                 returnM outOfDate
978                            else
979                                 checkList checks
980 \end{code}
981
982 %************************************************************************
983 %*                                                                      *
984                 Converting things to their Iface equivalents
985 %*                                                                      *
986 %************************************************************************
987
988 \begin{code}
989 tyThingToIfaceDecl :: (Name -> IfaceExtName) -> TyThing -> IfaceDecl
990 -- Assumption: the thing is already tidied, so that locally-bound names
991 --             (lambdas, for-alls) already have non-clashing OccNames
992 -- Reason: Iface stuff uses OccNames, and the conversion here does
993 --         not do tidying on the way
994 tyThingToIfaceDecl ext (AnId id)
995   = IfaceId { ifName   = getOccName id, 
996               ifType   = toIfaceType ext (idType id),
997               ifIdInfo = info }
998   where
999     info = case toIfaceIdInfo ext (idInfo id) of
1000                 []    -> NoInfo
1001                 items -> HasInfo items
1002
1003 tyThingToIfaceDecl ext (AClass clas)
1004   = IfaceClass { ifCtxt   = toIfaceContext ext sc_theta,
1005                  ifName   = getOccName clas,
1006                  ifTyVars = toIfaceTvBndrs clas_tyvars,
1007                  ifFDs    = map toIfaceFD clas_fds,
1008                  ifATs    = map (tyThingToIfaceDecl ext . ATyCon) clas_ats,
1009                  ifSigs   = map toIfaceClassOp op_stuff,
1010                  ifRec    = boolToRecFlag (isRecursiveTyCon tycon) }
1011   where
1012     (clas_tyvars, clas_fds, sc_theta, _, clas_ats, op_stuff) 
1013       = classExtraBigSig clas
1014     tycon = classTyCon clas
1015
1016     toIfaceClassOp (sel_id, def_meth)
1017         = ASSERT(sel_tyvars == clas_tyvars)
1018           IfaceClassOp (getOccName sel_id) def_meth (toIfaceType ext op_ty)
1019         where
1020                 -- Be careful when splitting the type, because of things
1021                 -- like         class Foo a where
1022                 --                op :: (?x :: String) => a -> a
1023                 -- and          class Baz a where
1024                 --                op :: (Ord a) => a -> a
1025           (sel_tyvars, rho_ty) = splitForAllTys (idType sel_id)
1026           op_ty                = funResultTy rho_ty
1027
1028     toIfaceFD (tvs1, tvs2) = (map (occNameFS.getOccName) tvs1, map (occNameFS.getOccName) tvs2)
1029
1030 tyThingToIfaceDecl ext (ATyCon tycon)
1031   | isSynTyCon tycon
1032   = IfaceSyn {  ifName    = getOccName tycon,
1033                 ifTyVars  = toIfaceTvBndrs tyvars,
1034                 ifOpenSyn = syn_isOpen,
1035                 ifSynRhs  = toIfaceType ext syn_tyki }
1036
1037   | isAlgTyCon tycon
1038   = IfaceData { ifName    = getOccName tycon,
1039                 ifTyVars  = toIfaceTvBndrs tyvars,
1040                 ifCtxt    = toIfaceContext ext (tyConStupidTheta tycon),
1041                 ifCons    = ifaceConDecls (algTyConRhs tycon),
1042                 ifRec     = boolToRecFlag (isRecursiveTyCon tycon),
1043                 ifGadtSyntax = isGadtSyntaxTyCon tycon,
1044                 ifGeneric = tyConHasGenerics tycon,
1045                 ifFamInst = famInstToIface (tyConFamInst_maybe tycon)}
1046
1047   | isForeignTyCon tycon
1048   = IfaceForeign { ifName    = getOccName tycon,
1049                    ifExtName = tyConExtName tycon }
1050
1051   | isPrimTyCon tycon || isFunTyCon tycon
1052         -- Needed in GHCi for ':info Int#', for example
1053   = IfaceData { ifName    = getOccName tycon,
1054                 ifTyVars  = toIfaceTvBndrs (take (tyConArity tycon) alphaTyVars),
1055                 ifCtxt    = [],
1056                 ifCons    = IfAbstractTyCon,
1057                 ifGadtSyntax = False,
1058                 ifGeneric = False,
1059                 ifRec     = NonRecursive,
1060                 ifFamInst = Nothing }
1061
1062   | otherwise = pprPanic "toIfaceDecl" (ppr tycon)
1063   where
1064     tyvars = tyConTyVars tycon
1065     (syn_isOpen, syn_tyki) = case synTyConRhs tycon of
1066                                OpenSynTyCon ki -> (True , ki)
1067                                SynonymTyCon ty -> (False, ty)
1068
1069     ifaceConDecls (NewTyCon { data_con = con })    = 
1070       IfNewTyCon  (ifaceConDecl con)
1071     ifaceConDecls (DataTyCon { data_cons = cons }) = 
1072       IfDataTyCon (map ifaceConDecl cons)
1073     ifaceConDecls OpenDataTyCon                    = IfOpenDataTyCon
1074     ifaceConDecls OpenNewTyCon                     = IfOpenNewTyCon
1075     ifaceConDecls AbstractTyCon                    = IfAbstractTyCon
1076         -- The last case happens when a TyCon has been trimmed during tidying
1077         -- Furthermore, tyThingToIfaceDecl is also used
1078         -- in TcRnDriver for GHCi, when browsing a module, in which case the
1079         -- AbstractTyCon case is perfectly sensible.
1080
1081     ifaceConDecl data_con 
1082         = IfCon   { ifConOcc     = getOccName (dataConName data_con),
1083                     ifConInfix   = dataConIsInfix data_con,
1084                     ifConUnivTvs = toIfaceTvBndrs (dataConUnivTyVars data_con),
1085                     ifConExTvs   = toIfaceTvBndrs (dataConExTyVars data_con),
1086                     ifConEqSpec  = to_eq_spec (dataConEqSpec data_con),
1087                     ifConCtxt    = toIfaceContext ext (dataConTheta data_con),
1088                     ifConArgTys  = map (toIfaceType ext) 
1089                                        (dataConOrigArgTys data_con),
1090                     ifConFields  = map getOccName 
1091                                        (dataConFieldLabels data_con),
1092                     ifConStricts = dataConStrictMarks data_con }
1093
1094     to_eq_spec spec = [(getOccName tv, toIfaceType ext ty) | (tv,ty) <- spec]
1095
1096     famInstToIface Nothing                    = Nothing
1097     famInstToIface (Just (famTyCon, instTys)) = 
1098       Just $ IfaceFamInst { ifFamInstTyCon = toIfaceTyCon ext famTyCon
1099                           , ifFamInstTys   = map (toIfaceType ext) instTys
1100                           }
1101
1102 tyThingToIfaceDecl ext (ADataCon dc)
1103  = pprPanic "toIfaceDecl" (ppr dc)      -- Should be trimmed out earlier
1104
1105
1106 --------------------------
1107 instanceToIfaceInst :: (Name -> IfaceExtName) -> Instance -> IfaceInst
1108 instanceToIfaceInst ext_lhs ispec@(Instance { is_dfun = dfun_id, is_flag = oflag,
1109                                               is_cls = cls, is_tcs = mb_tcs, 
1110                                               is_orph = orph })
1111   = IfaceInst { ifDFun    = getOccName dfun_id, 
1112                 ifOFlag   = oflag,
1113                 ifInstCls = ext_lhs cls,
1114                 ifInstTys = map do_rough mb_tcs,
1115                 ifInstOrph = orph }
1116   where
1117     do_rough Nothing  = Nothing
1118     do_rough (Just n) = Just (toIfaceTyCon_name ext_lhs n)
1119
1120 --------------------------
1121 toIfaceIdInfo :: (Name -> IfaceExtName) -> IdInfo -> [IfaceInfoItem]
1122 toIfaceIdInfo ext id_info
1123   = catMaybes [arity_hsinfo, caf_hsinfo, strict_hsinfo, 
1124                inline_hsinfo, wrkr_hsinfo,  unfold_hsinfo] 
1125   where
1126     ------------  Arity  --------------
1127     arity_info = arityInfo id_info
1128     arity_hsinfo | arity_info == 0 = Nothing
1129                  | otherwise       = Just (HsArity arity_info)
1130
1131     ------------ Caf Info --------------
1132     caf_info   = cafInfo id_info
1133     caf_hsinfo = case caf_info of
1134                    NoCafRefs -> Just HsNoCafRefs
1135                    _other    -> Nothing
1136
1137     ------------  Strictness  --------------
1138         -- No point in explicitly exporting TopSig
1139     strict_hsinfo = case newStrictnessInfo id_info of
1140                         Just sig | not (isTopSig sig) -> Just (HsStrictness sig)
1141                         _other                        -> Nothing
1142
1143     ------------  Worker  --------------
1144     work_info   = workerInfo id_info
1145     has_worker  = case work_info of { HasWorker _ _ -> True; other -> False }
1146     wrkr_hsinfo = case work_info of
1147                     HasWorker work_id wrap_arity -> 
1148                         Just (HsWorker (ext (idName work_id)) wrap_arity)
1149                     NoWorker -> Nothing
1150
1151     ------------  Unfolding  --------------
1152     -- The unfolding is redundant if there is a worker
1153     unfold_info  = unfoldingInfo id_info
1154     rhs          = unfoldingTemplate unfold_info
1155     no_unfolding = neverUnfold unfold_info
1156                         -- The CoreTidy phase retains unfolding info iff
1157                         -- we want to expose the unfolding, taking into account
1158                         -- unconditional NOINLINE, etc.  See TidyPgm.addExternal
1159     unfold_hsinfo | no_unfolding = Nothing                      
1160                   | has_worker   = Nothing      -- Unfolding is implicit
1161                   | otherwise    = Just (HsUnfold (toIfaceExpr ext rhs))
1162                                         
1163     ------------  Inline prag  --------------
1164     inline_prag = inlinePragInfo id_info
1165     inline_hsinfo | isAlwaysActive inline_prag     = Nothing
1166                   | no_unfolding && not has_worker = Nothing
1167                         -- If the iface file give no unfolding info, we 
1168                         -- don't need to say when inlining is OK!
1169                   | otherwise                      = Just (HsInline inline_prag)
1170
1171 --------------------------
1172 coreRuleToIfaceRule :: (Name -> IfaceExtName)   -- For the LHS names
1173                     -> (Name -> IfaceExtName)   -- For the RHS names
1174                     -> CoreRule -> IfaceRule
1175 coreRuleToIfaceRule ext_lhs ext_rhs (BuiltinRule { ru_fn = fn})
1176   = pprTrace "toHsRule: builtin" (ppr fn) $
1177     bogusIfaceRule (mkIfaceExtName fn)
1178
1179 coreRuleToIfaceRule ext_lhs ext_rhs
1180     (Rule { ru_name = name, ru_fn = fn, ru_act = act, ru_bndrs = bndrs,
1181             ru_args = args, ru_rhs = rhs, ru_orph = orph })
1182   = IfaceRule { ifRuleName  = name, ifActivation = act, 
1183                 ifRuleBndrs = map (toIfaceBndr ext_lhs) bndrs,
1184                 ifRuleHead  = ext_lhs fn, 
1185                 ifRuleArgs  = map do_arg args,
1186                 ifRuleRhs   = toIfaceExpr ext_rhs rhs,
1187                 ifRuleOrph  = orph }
1188   where
1189         -- For type args we must remove synonyms from the outermost
1190         -- level.  Reason: so that when we read it back in we'll
1191         -- construct the same ru_rough field as we have right now;
1192         -- see tcIfaceRule
1193     do_arg (Type ty) = IfaceType (toIfaceType ext_lhs (deNoteType ty))
1194     do_arg arg       = toIfaceExpr ext_lhs arg
1195
1196 bogusIfaceRule :: IfaceExtName -> IfaceRule
1197 bogusIfaceRule id_name
1198   = IfaceRule { ifRuleName = FSLIT("bogus"), ifActivation = NeverActive,  
1199         ifRuleBndrs = [], ifRuleHead = id_name, ifRuleArgs = [], 
1200         ifRuleRhs = IfaceExt id_name, ifRuleOrph = Nothing }
1201
1202 ---------------------
1203 toIfaceExpr :: (Name -> IfaceExtName) -> CoreExpr -> IfaceExpr
1204 toIfaceExpr ext (Var v)       = toIfaceVar ext v
1205 toIfaceExpr ext (Lit l)       = IfaceLit l
1206 toIfaceExpr ext (Type ty)     = IfaceType (toIfaceType ext ty)
1207 toIfaceExpr ext (Lam x b)     = IfaceLam (toIfaceBndr ext x) (toIfaceExpr ext b)
1208 toIfaceExpr ext (App f a)     = toIfaceApp ext f [a]
1209 toIfaceExpr ext (Case s x ty as) = IfaceCase (toIfaceExpr ext s) (occNameFS (getOccName x)) (toIfaceType ext ty) (map (toIfaceAlt ext) as)
1210 toIfaceExpr ext (Let b e)     = IfaceLet (toIfaceBind ext b) (toIfaceExpr ext e)
1211 toIfaceExpr ext (Cast e co)   = IfaceCast (toIfaceExpr ext e) (toIfaceType ext co)
1212 toIfaceExpr ext (Note n e)    = IfaceNote (toIfaceNote ext n) (toIfaceExpr ext e)
1213
1214 ---------------------
1215 toIfaceNote ext (SCC cc)      = IfaceSCC cc
1216 toIfaceNote ext InlineMe      = IfaceInlineMe
1217 toIfaceNote ext (CoreNote s)  = IfaceCoreNote s
1218
1219 ---------------------
1220 toIfaceBind ext (NonRec b r) = IfaceNonRec (toIfaceIdBndr ext b) (toIfaceExpr ext r)
1221 toIfaceBind ext (Rec prs)    = IfaceRec [(toIfaceIdBndr ext b, toIfaceExpr ext r) | (b,r) <- prs]
1222
1223 ---------------------
1224 toIfaceAlt ext (c,bs,r) = (toIfaceCon c, map (occNameFS.getOccName) bs, toIfaceExpr ext r)
1225
1226 ---------------------
1227 toIfaceCon (DataAlt dc) | isTupleTyCon tc = IfaceTupleAlt (tupleTyConBoxity tc)
1228                         | otherwise       = IfaceDataAlt (getOccName dc)
1229                         where
1230                           tc = dataConTyCon dc
1231            
1232 toIfaceCon (LitAlt l) = IfaceLitAlt l
1233 toIfaceCon DEFAULT    = IfaceDefault
1234
1235 ---------------------
1236 toIfaceApp ext (App f a) as = toIfaceApp ext f (a:as)
1237 toIfaceApp ext (Var v) as
1238   = case isDataConWorkId_maybe v of
1239         -- We convert the *worker* for tuples into IfaceTuples
1240         Just dc |  isTupleTyCon tc && saturated 
1241                 -> IfaceTuple (tupleTyConBoxity tc) tup_args
1242           where
1243             val_args  = dropWhile isTypeArg as
1244             saturated = val_args `lengthIs` idArity v
1245             tup_args  = map (toIfaceExpr ext) val_args
1246             tc        = dataConTyCon dc
1247
1248         other -> mkIfaceApps ext (toIfaceVar ext v) as
1249
1250 toIfaceApp ext e as = mkIfaceApps ext (toIfaceExpr ext e) as
1251
1252 mkIfaceApps ext f as = foldl (\f a -> IfaceApp f (toIfaceExpr ext a)) f as
1253
1254 ---------------------
1255 toIfaceVar :: (Name -> IfaceExtName) -> Id -> IfaceExpr
1256 toIfaceVar ext v 
1257   | Just fcall <- isFCallId_maybe v = IfaceFCall fcall (toIfaceType ext (idType v))
1258           -- Foreign calls have special syntax
1259   | isExternalName name             = IfaceExt (ext name)
1260   | otherwise                       = IfaceLcl (occNameFS (nameOccName name))
1261   where
1262     name = idName v
1263 \end{code}