[project @ 2005-04-28 10:09:41 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcRnDriver.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[TcModule]{Typechecking a whole module}
5
6 \begin{code}
7 module TcRnDriver (
8 #ifdef GHCI
9         mkExportEnv, getModuleContents, tcRnStmt, 
10         tcRnGetInfo, GetInfoResult,
11         tcRnExpr, tcRnType,
12         tcRnLookupRdrName,
13 #endif
14         tcRnModule, 
15         tcTopSrcDecls,
16         tcRnExtCore
17     ) where
18
19 #include "HsVersions.h"
20
21 import IO
22 #ifdef GHCI
23 import {-# SOURCE #-} TcSplice ( tcSpliceDecls )
24 #endif
25
26 import DynFlags         ( DynFlag(..), DynFlags(..), dopt, GhcMode(..) )
27 import StaticFlags      ( opt_PprStyle_Debug )
28 import Packages         ( moduleToPackageConfig, mkPackageId, package,
29                           isHomeModule )
30 import HsSyn            ( HsModule(..), HsExtCore(..), HsGroup(..), LHsDecl,
31                           SpliceDecl(..), HsBind(..), LHsBinds,
32                           emptyGroup, appendGroups,
33                           nlHsApp, nlHsVar, pprLHsBinds )
34 import RdrHsSyn         ( findSplice )
35
36 import PrelNames        ( runMainIOName, rootMainName, mAIN,
37                           main_RDR_Unqual )
38 import RdrName          ( RdrName, mkRdrUnqual, emptyGlobalRdrEnv, 
39                           plusGlobalRdrEnv )
40 import TcHsSyn          ( zonkTopDecls )
41 import TcExpr           ( tcInferRho )
42 import TcRnMonad
43 import TcType           ( tidyTopType, tcEqType, mkTyVarTys, substTyWith )
44 import Inst             ( showLIE )
45 import InstEnv          ( extendInstEnvList, Instance, pprInstances, instanceDFunId )
46 import TcBinds          ( tcTopBinds, tcHsBootSigs )
47 import TcDefaults       ( tcDefaults )
48 import TcEnv            ( tcExtendGlobalValEnv, iDFunId )
49 import TcRules          ( tcRules )
50 import TcForeign        ( tcForeignImports, tcForeignExports )
51 import TcInstDcls       ( tcInstDecls1, tcInstDecls2 )
52 import TcIface          ( tcExtCoreBindings, tcHiBootIface )
53 import TcSimplify       ( tcSimplifyTop )
54 import TcTyClsDecls     ( tcTyAndClassDecls )
55 import LoadIface        ( loadOrphanModules )
56 import RnNames          ( importsFromLocalDecls, rnImports, exportsFromAvail,
57                           reportUnusedNames, reportDeprecations )
58 import RnEnv            ( lookupSrcOcc_maybe )
59 import RnSource         ( rnSrcDecls, rnTyClDecls, checkModDeprec )
60 import PprCore          ( pprRules, pprCoreBindings )
61 import CoreSyn          ( CoreRule, bindersOfBinds )
62 import DataCon          ( dataConWrapId )
63 import ErrUtils         ( Messages, mkDumpDoc, showPass )
64 import Id               ( Id, mkExportedLocalId, isLocalId, idName, idType )
65 import Var              ( Var )
66 import Module           ( Module, ModuleEnv, mkModule, moduleEnvElts, lookupModuleEnv )
67 import OccName          ( mkVarOcc )
68 import Name             ( Name, NamedThing(..), isExternalName, getSrcLoc, 
69                           getOccName, isWiredInName )
70 import NameSet
71 import TyCon            ( tyConHasGenerics, isSynTyCon, getSynTyConDefn, tyConKind )
72 import SrcLoc           ( srcLocSpan, Located(..), noLoc )
73 import DriverPhases     ( HscSource(..), isHsBoot )
74 import HscTypes         ( ModGuts(..), ModDetails(..), emptyModDetails,
75                           HscEnv(..), ExternalPackageState(..),
76                           IsBootInterface, noDependencies, 
77                           Deprecs( NoDeprecs ), plusDeprecs,
78                           ForeignStubs(NoStubs), TyThing(..), 
79                           TypeEnv, lookupTypeEnv, hptInstances, 
80                           extendTypeEnvWithIds, typeEnvIds, typeEnvTyCons, typeEnvElts,
81                           emptyFixityEnv
82                         )
83 import Outputable
84
85 #ifdef GHCI
86 import HsSyn            ( HsStmtContext(..), Stmt(..), HsExpr(..), HsBindGroup(..), 
87                           LStmt, LHsExpr, LHsType, mkMatchGroup,
88                           collectLStmtsBinders, mkSimpleMatch, nlVarPat,
89                           placeHolderType, noSyntaxExpr )
90 import RdrName          ( GlobalRdrEnv, mkGlobalRdrEnv, GlobalRdrElt(..),
91                           Provenance(..), ImportSpec(..),
92                           lookupLocalRdrEnv, extendLocalRdrEnv )
93 import RnSource         ( addTcgDUs )
94 import TcHsSyn          ( mkHsLet, zonkTopLExpr, zonkTopBndrs )
95 import TcHsType         ( kcHsType )
96 import TcIface          ( loadImportedInsts )
97 import TcMType          ( zonkTcType, zonkQuantifiedTyVar )
98 import TcMatches        ( tcStmts, tcDoStmt )
99 import TcSimplify       ( tcSimplifyInteractive, tcSimplifyInfer )
100 import TcType           ( Type, mkForAllTys, mkFunTys, mkTyConApp, tyVarsOfType, 
101                           isUnLiftedType, tyClsNamesOfDFunHead )
102 import TcEnv            ( tcLookupTyCon, tcLookupId, tcLookupGlobal )
103 import RnTypes          ( rnLHsType )
104 import Inst             ( tcGetInstEnvs )
105 import InstEnv          ( DFunId, classInstances, instEnvElts )
106 import RnExpr           ( rnStmts, rnLExpr )
107 import LoadIface        ( loadSrcInterface, ifaceInstGates )
108 import IfaceSyn         ( IfaceDecl(..), IfaceClassOp(..), IfaceConDecl(..), 
109                           IfaceExtName(..), IfaceConDecls(..), IfaceInst(..),
110                           tyThingToIfaceDecl, instanceToIfaceInst )
111 import IfaceType        ( IfaceTyCon(..), IfaceType, toIfaceType, 
112                           interactiveExtNameFun, isLocalIfaceExtName )
113 import IfaceEnv         ( lookupOrig, ifaceExportNames )
114 import RnEnv            ( lookupOccRn, dataTcOccs, lookupFixityRn )
115 import Id               ( Id, isImplicitId, setIdType, globalIdDetails )
116 import MkId             ( unsafeCoerceId )
117 import DataCon          ( dataConTyCon )
118 import TyCon            ( tyConName )
119 import TysWiredIn       ( mkListTy, unitTy )
120 import IdInfo           ( GlobalIdDetails(..) )
121 import SrcLoc           ( interactiveSrcLoc, unLoc )
122 import Kind             ( Kind )
123 import Var              ( globaliseId )
124 import Name             ( nameOccName )
125 import OccName          ( occNameUserString )
126 import NameEnv          ( delListFromNameEnv )
127 import PrelNames        ( iNTERACTIVE, ioTyConName, printName, itName, 
128                           bindIOName, thenIOName, returnIOName )
129 import HscTypes         ( InteractiveContext(..), HomeModInfo(..), typeEnvElts, typeEnvClasses,
130                           availNames, availName, ModIface(..), icPrintUnqual,
131                           ModDetails(..), Dependencies(..) )
132 import BasicTypes       ( RecFlag(..), Fixity )
133 import ListSetOps       ( removeDups )
134 import Panic            ( ghcError, GhcException(..) )
135 import SrcLoc           ( SrcLoc )
136 #endif
137
138 import FastString       ( mkFastString )
139 import Util             ( sortLe )
140 import Bag              ( unionBags, snocBag, emptyBag, unitBag, unionManyBags )
141
142 import Maybe            ( isJust )
143 \end{code}
144
145
146
147 %************************************************************************
148 %*                                                                      *
149         Typecheck and rename a module
150 %*                                                                      *
151 %************************************************************************
152
153
154 \begin{code}
155 tcRnModule :: HscEnv 
156            -> HscSource
157            -> Bool              -- True <=> save renamed syntax
158            -> Located (HsModule RdrName)
159            -> IO (Messages, Maybe TcGblEnv)
160
161 tcRnModule hsc_env hsc_src save_rn_decls
162          (L loc (HsModule maybe_mod export_ies 
163                           import_decls local_decls mod_deprec))
164  = do { showPass (hsc_dflags hsc_env) "Renamer/typechecker" ;
165
166    let { this_mod = case maybe_mod of
167                         Nothing  -> mAIN          -- 'module M where' is omitted
168                         Just (L _ mod) -> mod } ; -- The normal case
169                 
170    initTc hsc_env hsc_src this_mod $ 
171    setSrcSpan loc $
172    do {
173         checkForPackageModule (hsc_dflags hsc_env) this_mod;
174
175                 -- Deal with imports; sets tcg_rdr_env, tcg_imports
176         (rdr_env, imports) <- rnImports import_decls ;
177
178         let { dep_mods :: ModuleEnv (Module, IsBootInterface)
179             ; dep_mods = imp_dep_mods imports
180
181             ; is_dep_mod :: Module -> Bool
182             ; is_dep_mod mod = case lookupModuleEnv dep_mods mod of
183                                 Nothing           -> False
184                                 Just (_, is_boot) -> not is_boot 
185             ; home_insts = hptInstances hsc_env is_dep_mod
186             } ;
187
188                 -- Record boot-file info in the EPS, so that it's 
189                 -- visible to loadHiBootInterface in tcRnSrcDecls,
190                 -- and any other incrementally-performed imports
191         updateEps_ (\eps -> eps { eps_is_boot = dep_mods }) ;
192
193                 -- Update the gbl env
194         updGblEnv ( \ gbl -> 
195                 gbl { tcg_rdr_env  = rdr_env,
196                       tcg_inst_env = extendInstEnvList (tcg_inst_env gbl) home_insts,
197                       tcg_imports  = tcg_imports gbl `plusImportAvails` imports,
198                       tcg_rn_decls = if save_rn_decls then
199                                         Just emptyGroup
200                                      else
201                                         Nothing })
202                 $ do {
203
204         traceRn (text "rn1" <+> ppr (imp_dep_mods imports)) ;
205                 -- Fail if there are any errors so far
206                 -- The error printing (if needed) takes advantage 
207                 -- of the tcg_env we have now set
208         failIfErrsM ;
209
210                 -- Load any orphan-module interfaces, so that
211                 -- their rules and instance decls will be found
212         loadOrphanModules (imp_orphs imports) ;
213
214         traceRn (text "rn1a") ;
215                 -- Rename and type check the declarations
216         tcg_env <- if isHsBoot hsc_src then
217                         tcRnHsBootDecls local_decls
218                    else 
219                         tcRnSrcDecls local_decls ;
220         setGblEnv tcg_env               $ do {
221
222         traceRn (text "rn3") ;
223
224                 -- Report the use of any deprecated things
225                 -- We do this before processsing the export list so
226                 -- that we don't bleat about re-exporting a deprecated
227                 -- thing (especially via 'module Foo' export item)
228                 -- Only uses in the body of the module are complained about
229         reportDeprecations tcg_env ;
230
231                 -- Process the export list
232         exports <- exportsFromAvail (isJust maybe_mod) export_ies ;
233
234                 -- Check whether the entire module is deprecated
235                 -- This happens only once per module
236         let { mod_deprecs = checkModDeprec mod_deprec } ;
237
238                 -- Add exports and deprecations to envt
239         let { final_env  = tcg_env { tcg_exports = exports,
240                                      tcg_dus = tcg_dus tcg_env `plusDU` usesOnly exports,
241                                      tcg_deprecs = tcg_deprecs tcg_env `plusDeprecs` 
242                                                    mod_deprecs }
243                 -- A module deprecation over-rides the earlier ones
244              } ;
245
246                 -- Report unused names
247         reportUnusedNames export_ies final_env ;
248
249                 -- Dump output and return
250         tcDump final_env ;
251         return final_env
252     }}}}
253
254 -- This is really a sanity check that the user has given -package-name
255 -- if necessary.  -package-name is only necessary when the package database
256 -- already contains the current package, because then we can't tell
257 -- whether a given module is in the current package or not, without knowing
258 -- the name of the current package.
259 checkForPackageModule dflags this_mod
260   | not (isHomeModule dflags this_mod),
261     Just (pkg,_) <- moduleToPackageConfig dflags this_mod =
262         let 
263                 ppr_pkg = ppr (mkPackageId (package pkg))
264         in
265         addErr (ptext SLIT("Module") <+> quotes (ppr this_mod) <+>
266                 ptext SLIT("is a member of package") <+>  ppr_pkg <> char '.' $$
267                 ptext SLIT("To compile this module, please use -ignore-package") <+> ppr_pkg <> char '.')
268   | otherwise = return ()
269 \end{code}
270
271
272 %************************************************************************
273 %*                                                                      *
274         Type-checking external-core modules
275 %*                                                                      *
276 %************************************************************************
277
278 \begin{code}
279 tcRnExtCore :: HscEnv 
280             -> HsExtCore RdrName
281             -> IO (Messages, Maybe ModGuts)
282         -- Nothing => some error occurred 
283
284 tcRnExtCore hsc_env (HsExtCore this_mod decls src_binds)
285         -- The decls are IfaceDecls; all names are original names
286  = do { showPass (hsc_dflags hsc_env) "Renamer/typechecker" ;
287
288    initTc hsc_env ExtCoreFile this_mod $ do {
289
290    let { ldecls  = map noLoc decls } ;
291
292         -- Deal with the type declarations; first bring their stuff
293         -- into scope, then rname them, then type check them
294    (rdr_env, imports) <- importsFromLocalDecls (mkFakeGroup ldecls) ;
295
296    updGblEnv (\gbl -> gbl { tcg_rdr_env = rdr_env `plusGlobalRdrEnv` tcg_rdr_env gbl,
297                             tcg_imports = imports `plusImportAvails` tcg_imports gbl }) 
298                   $ do {
299
300    rn_decls <- rnTyClDecls ldecls ;
301    failIfErrsM ;
302
303         -- Dump trace of renaming part
304    rnDump (ppr rn_decls) ;
305
306         -- Typecheck them all together so that
307         -- any mutually recursive types are done right
308    tcg_env <- checkNoErrs (tcTyAndClassDecls emptyModDetails rn_decls) ;
309         -- Make the new type env available to stuff slurped from interface files
310
311    setGblEnv tcg_env $ do {
312    
313         -- Now the core bindings
314    core_binds <- initIfaceExtCore (tcExtCoreBindings src_binds) ;
315
316         -- Wrap up
317    let {
318         bndrs      = bindersOfBinds core_binds ;
319         my_exports = mkNameSet (map idName bndrs) ;
320                 -- ToDo: export the data types also?
321
322         final_type_env = extendTypeEnvWithIds (tcg_type_env tcg_env) bndrs ;
323
324         mod_guts = ModGuts {    mg_module   = this_mod,
325                                 mg_boot     = False,
326                                 mg_usages   = [],               -- ToDo: compute usage
327                                 mg_dir_imps = [],               -- ??
328                                 mg_deps     = noDependencies,   -- ??
329                                 mg_exports  = my_exports,
330                                 mg_types    = final_type_env,
331                                 mg_insts    = tcg_insts tcg_env,
332                                 mg_rules    = [],
333                                 mg_binds    = core_binds,
334
335                                 -- Stubs
336                                 mg_rdr_env  = emptyGlobalRdrEnv,
337                                 mg_fix_env  = emptyFixityEnv,
338                                 mg_deprecs  = NoDeprecs,
339                                 mg_foreign  = NoStubs
340                     } } ;
341
342    tcCoreDump mod_guts ;
343
344    return mod_guts
345    }}}}
346
347 mkFakeGroup decls -- Rather clumsy; lots of unused fields
348   = HsGroup {   hs_tyclds = decls,      -- This is the one we want
349                 hs_valds = [], hs_fords = [],
350                 hs_instds = [], hs_fixds = [], hs_depds = [],
351                 hs_ruleds = [], hs_defds = [] }
352 \end{code}
353
354
355 %************************************************************************
356 %*                                                                      *
357         Type-checking the top level of a module
358 %*                                                                      *
359 %************************************************************************
360
361 \begin{code}
362 tcRnSrcDecls :: [LHsDecl RdrName] -> TcM TcGblEnv
363         -- Returns the variables free in the decls
364         -- Reason: solely to report unused imports and bindings
365 tcRnSrcDecls decls
366  = do {         -- Load the hi-boot interface for this module, if any
367                 -- We do this now so that the boot_names can be passed
368                 -- to tcTyAndClassDecls, because the boot_names are 
369                 -- automatically considered to be loop breakers
370         mod <- getModule ;
371         boot_iface <- tcHiBootIface mod ;
372
373                 -- Do all the declarations
374         (tc_envs, lie) <- getLIE (tc_rn_src_decls boot_iface decls) ;
375
376              -- tcSimplifyTop deals with constant or ambiguous InstIds.  
377              -- How could there be ambiguous ones?  They can only arise if a
378              -- top-level decl falls under the monomorphism
379              -- restriction, and no subsequent decl instantiates its
380              -- type.  (Usually, ambiguous type variables are resolved
381              -- during the generalisation step.)
382         traceTc (text "Tc8") ;
383         inst_binds <- setEnvs tc_envs (tcSimplifyTop lie) ;
384                 -- Setting the global env exposes the instances to tcSimplifyTop
385                 -- Setting the local env exposes the local Ids to tcSimplifyTop, 
386                 -- so that we get better error messages (monomorphism restriction)
387
388             -- Backsubstitution.  This must be done last.
389             -- Even tcSimplifyTop may do some unification.
390         traceTc (text "Tc9") ;
391         let { (tcg_env, _) = tc_envs ;
392               TcGblEnv { tcg_type_env = type_env, tcg_binds = binds, 
393                          tcg_rules = rules, tcg_fords = fords } = tcg_env } ;
394
395         (bind_ids, binds', fords', rules') <- zonkTopDecls (binds `unionBags` inst_binds)
396                                                            rules fords ;
397
398         let { final_type_env = extendTypeEnvWithIds type_env bind_ids
399             ; tcg_env' = tcg_env { tcg_type_env = final_type_env,
400                                    tcg_binds = binds',
401                                    tcg_rules = rules', 
402                                    tcg_fords = fords' } } ;
403
404         -- Make the new type env available to stuff slurped from interface files
405         writeMutVar (tcg_type_env_var tcg_env) final_type_env ;
406
407         -- Compare the hi-boot iface (if any) with the real thing
408         dfun_binds <- checkHiBootIface tcg_env' boot_iface ;
409
410         return (tcg_env' { tcg_binds = tcg_binds tcg_env' `unionBags` dfun_binds }) 
411    }
412
413 tc_rn_src_decls :: ModDetails -> [LHsDecl RdrName] -> TcM (TcGblEnv, TcLclEnv)
414 -- Loops around dealing with each top level inter-splice group 
415 -- in turn, until it's dealt with the entire module
416 tc_rn_src_decls boot_details ds
417  = do { let { (first_group, group_tail) = findSplice ds } ;
418                 -- If ds is [] we get ([], Nothing)
419
420         -- Type check the decls up to, but not including, the first splice
421         tc_envs@(tcg_env,tcl_env) <- tcRnGroup boot_details first_group ;
422
423         -- Bale out if errors; for example, error recovery when checking
424         -- the RHS of 'main' can mean that 'main' is not in the envt for 
425         -- the subsequent checkMain test
426         failIfErrsM ;
427
428         setEnvs tc_envs $
429
430         -- If there is no splice, we're nearly done
431         case group_tail of {
432            Nothing -> do {      -- Last thing: check for `main'
433                            tcg_env <- checkMain ;
434                            return (tcg_env, tcl_env) 
435                       } ;
436
437         -- If there's a splice, we must carry on
438            Just (SpliceDecl splice_expr, rest_ds) -> do {
439 #ifndef GHCI
440         failWithTc (text "Can't do a top-level splice; need a bootstrapped compiler")
441 #else
442
443         -- Rename the splice expression, and get its supporting decls
444         (rn_splice_expr, splice_fvs) <- rnLExpr splice_expr ;
445         failIfErrsM ;   -- Don't typecheck if renaming failed
446
447         -- Execute the splice
448         spliced_decls <- tcSpliceDecls rn_splice_expr ;
449
450         -- Glue them on the front of the remaining decls and loop
451         setGblEnv (tcg_env `addTcgDUs` usesOnly splice_fvs) $
452         tc_rn_src_decls boot_details (spliced_decls ++ rest_ds)
453 #endif /* GHCI */
454     }}}
455 \end{code}
456
457 %************************************************************************
458 %*                                                                      *
459         Compiling hs-boot source files, and
460         comparing the hi-boot interface with the real thing
461 %*                                                                      *
462 %************************************************************************
463
464 \begin{code}
465 tcRnHsBootDecls :: [LHsDecl RdrName] -> TcM TcGblEnv
466 tcRnHsBootDecls decls
467    = do { let { (first_group, group_tail) = findSplice decls }
468
469         ; case group_tail of
470              Just stuff -> spliceInHsBootErr stuff
471              Nothing    -> return ()
472
473                 -- Rename the declarations
474         ; (tcg_env, rn_group) <- rnTopSrcDecls first_group
475         ; setGblEnv tcg_env $ do {
476
477         -- Todo: check no foreign decls, no rules, no default decls
478
479                 -- Typecheck type/class decls
480         ; traceTc (text "Tc2")
481         ; let tycl_decls = hs_tyclds rn_group
482         ; tcg_env <- checkNoErrs (tcTyAndClassDecls emptyModDetails tycl_decls)
483         ; setGblEnv tcg_env     $ do {
484
485                 -- Typecheck instance decls
486         ; traceTc (text "Tc3")
487         ; (tcg_env, inst_infos, _binds) <- tcInstDecls1 tycl_decls (hs_instds rn_group)
488         ; setGblEnv tcg_env     $ do {
489
490                 -- Typecheck value declarations
491         ; traceTc (text "Tc5") 
492         ; val_ids <- tcHsBootSigs (hs_valds rn_group)
493
494                 -- Wrap up
495                 -- No simplification or zonking to do
496         ; traceTc (text "Tc7a")
497         ; gbl_env <- getGblEnv 
498         
499                 -- Make the final type-env
500                 -- Include the dfun_ids so that their type sigs get
501                 -- are written into the interface file
502         ; let { type_env0 = tcg_type_env gbl_env
503               ; type_env1 = extendTypeEnvWithIds type_env0 val_ids
504               ; type_env2 = extendTypeEnvWithIds type_env1 dfun_ids 
505               ; dfun_ids = map iDFunId inst_infos }
506         ; return (gbl_env { tcg_type_env = type_env2 }) 
507    }}}}
508
509 spliceInHsBootErr (SpliceDecl (L loc _), _)
510   = addErrAt loc (ptext SLIT("Splices are not allowed in hs-boot files"))
511 \end{code}
512
513 Once we've typechecked the body of the module, we want to compare what
514 we've found (gathered in a TypeEnv) with the hi-boot details (if any).
515
516 \begin{code}
517 checkHiBootIface :: TcGblEnv -> ModDetails -> TcM (LHsBinds Id)
518 -- Compare the hi-boot file for this module (if there is one)
519 -- with the type environment we've just come up with
520 -- In the common case where there is no hi-boot file, the list
521 -- of boot_names is empty.
522 --
523 -- The bindings we return give bindings for the dfuns defined in the
524 -- hs-boot file, such as        $fbEqT = $fEqT
525
526 checkHiBootIface
527         (TcGblEnv { tcg_insts = local_insts, tcg_type_env = local_type_env })
528         (ModDetails { md_insts = boot_insts, md_types = boot_type_env })
529   = do  { mapM_ check_one (typeEnvElts boot_type_env)
530         ; dfun_binds <- mapM check_inst boot_insts
531         ; return (unionManyBags dfun_binds) }
532   where
533     check_one boot_thing
534       | no_check name
535       = return ()       
536       | otherwise       
537       = case lookupTypeEnv local_type_env name of
538           Nothing         -> addErrTc (missingBootThing boot_thing)
539           Just real_thing -> check_thing boot_thing real_thing
540       where
541         name = getName boot_thing
542
543     no_check name = isWiredInName name  -- No checking for wired-in names.  In particular,
544                                         -- 'error' is handled by a rather gross hack
545                                         -- (see comments in GHC.Err.hs-boot)
546                   || name `elem` dfun_names
547     dfun_names = map getName boot_insts
548
549     check_inst boot_inst
550         = case [dfun | inst <- local_insts, 
551                        let dfun = instanceDFunId inst,
552                        idType dfun `tcEqType` boot_inst_ty ] of
553             [] -> do { addErrTc (instMisMatch boot_inst); return emptyBag }
554             (dfun:_) -> return (unitBag $ noLoc $ VarBind boot_dfun (nlHsVar dfun))
555         where
556           boot_dfun = instanceDFunId boot_inst
557           boot_inst_ty = idType boot_dfun
558
559 ----------------
560 check_thing (ATyCon boot_tc) (ATyCon real_tc)
561   | isSynTyCon boot_tc && isSynTyCon real_tc,
562     defn1 `tcEqType` substTyWith tvs2 (mkTyVarTys tvs1) defn2
563   = return ()
564
565   | tyConKind boot_tc == tyConKind real_tc
566   = return ()
567   where
568     (tvs1, defn1) = getSynTyConDefn boot_tc
569     (tvs2, defn2) = getSynTyConDefn boot_tc
570
571 check_thing (AnId boot_id) (AnId real_id)
572   | idType boot_id `tcEqType` idType real_id
573   = return ()
574
575 check_thing (ADataCon dc1) (ADataCon dc2)
576   | idType (dataConWrapId dc1) `tcEqType` idType (dataConWrapId dc2)
577   = return ()
578
579         -- Can't declare a class in a hi-boot file
580
581 check_thing boot_thing real_thing       -- Default case; failure
582   = addErrAt (srcLocSpan (getSrcLoc real_thing))
583              (bootMisMatch real_thing)
584
585 ----------------
586 missingBootThing thing
587   = ppr thing <+> ptext SLIT("is defined in the hs-boot file, but not in the module")
588 bootMisMatch thing
589   = ppr thing <+> ptext SLIT("has conflicting definitions in the module and its hs-boot file")
590 instMisMatch inst
591   = hang (ptext SLIT("instance") <+> ppr inst)
592        2 (ptext SLIT("is defined in the hs-boot file, but not in the module"))
593 \end{code}
594
595
596 %************************************************************************
597 %*                                                                      *
598         Type-checking the top level of a module
599 %*                                                                      *
600 %************************************************************************
601
602 tcRnGroup takes a bunch of top-level source-code declarations, and
603  * renames them
604  * gets supporting declarations from interface files
605  * typechecks them
606  * zonks them
607  * and augments the TcGblEnv with the results
608
609 In Template Haskell it may be called repeatedly for each group of
610 declarations.  It expects there to be an incoming TcGblEnv in the
611 monad; it augments it and returns the new TcGblEnv.
612
613 \begin{code}
614 tcRnGroup :: ModDetails -> HsGroup RdrName -> TcM (TcGblEnv, TcLclEnv)
615         -- Returns the variables free in the decls, for unused-binding reporting
616 tcRnGroup boot_details decls
617  = do {         -- Rename the declarations
618         (tcg_env, rn_decls) <- rnTopSrcDecls decls ;
619         setGblEnv tcg_env $ do {
620
621                 -- Typecheck the declarations
622         tcTopSrcDecls boot_details rn_decls 
623   }}
624
625 ------------------------------------------------
626 rnTopSrcDecls :: HsGroup RdrName -> TcM (TcGblEnv, HsGroup Name)
627 rnTopSrcDecls group
628  = do {         -- Bring top level binders into scope
629         (rdr_env, imports) <- importsFromLocalDecls group ;
630         updGblEnv (\gbl -> gbl { tcg_rdr_env = rdr_env `plusGlobalRdrEnv` tcg_rdr_env gbl,
631                                  tcg_imports = imports `plusImportAvails` tcg_imports gbl }) 
632                   $ do {
633
634         traceRn (ptext SLIT("rnTopSrcDecls") <+> ppr rdr_env) ;
635         failIfErrsM ;   -- No point in continuing if (say) we have duplicate declarations
636
637                 -- Rename the source decls
638         (tcg_env, rn_decls) <- rnSrcDecls group ;
639         failIfErrsM ;
640
641                 -- save the renamed syntax, if we want it
642         let { tcg_env'
643                 | Just grp <- tcg_rn_decls tcg_env
644                   = tcg_env{ tcg_rn_decls = Just (appendGroups grp rn_decls) }
645                 | otherwise
646                    = tcg_env };
647
648                 -- Dump trace of renaming part
649         rnDump (ppr rn_decls) ;
650
651         return (tcg_env', rn_decls)
652    }}
653
654 ------------------------------------------------
655 tcTopSrcDecls :: ModDetails -> HsGroup Name -> TcM (TcGblEnv, TcLclEnv)
656 tcTopSrcDecls boot_details
657         (HsGroup { hs_tyclds = tycl_decls, 
658                    hs_instds = inst_decls,
659                    hs_fords  = foreign_decls,
660                    hs_defds  = default_decls,
661                    hs_ruleds = rule_decls,
662                    hs_valds  = val_binds })
663  = do {         -- Type-check the type and class decls, and all imported decls
664                 -- The latter come in via tycl_decls
665         traceTc (text "Tc2") ;
666
667         tcg_env <- checkNoErrs (tcTyAndClassDecls boot_details tycl_decls) ;
668         -- tcTyAndClassDecls recovers internally, but if anything gave rise to
669         -- an error we'd better stop now, to avoid a cascade
670         
671         -- Make these type and class decls available to stuff slurped from interface files
672         writeMutVar (tcg_type_env_var tcg_env) (tcg_type_env tcg_env) ;
673
674
675         setGblEnv tcg_env       $ do {
676                 -- Source-language instances, including derivings,
677                 -- and import the supporting declarations
678         traceTc (text "Tc3") ;
679         (tcg_env, inst_infos, deriv_binds) <- tcInstDecls1 tycl_decls inst_decls ;
680         setGblEnv tcg_env       $ do {
681
682                 -- Foreign import declarations next.  No zonking necessary
683                 -- here; we can tuck them straight into the global environment.
684         traceTc (text "Tc4") ;
685         (fi_ids, fi_decls) <- tcForeignImports foreign_decls ;
686         tcExtendGlobalValEnv fi_ids     $ do {
687
688                 -- Default declarations
689         traceTc (text "Tc4a") ;
690         default_tys <- tcDefaults default_decls ;
691         updGblEnv (\gbl -> gbl { tcg_default = default_tys }) $ do {
692         
693                 -- Value declarations next
694                 -- We also typecheck any extra binds that came out 
695                 -- of the "deriving" process (deriv_binds)
696         traceTc (text "Tc5") ;
697         (tc_val_binds, lcl_env) <- tcTopBinds (val_binds ++ deriv_binds) ;
698         setLclTypeEnv lcl_env   $ do {
699
700                 -- Second pass over class and instance declarations, 
701         traceTc (text "Tc6") ;
702         (tcl_env, inst_binds) <- tcInstDecls2 tycl_decls inst_infos ;
703         showLIE (text "after instDecls2") ;
704
705                 -- Foreign exports
706                 -- They need to be zonked, so we return them
707         traceTc (text "Tc7") ;
708         (foe_binds, foe_decls) <- tcForeignExports foreign_decls ;
709
710                 -- Rules
711         rules <- tcRules rule_decls ;
712
713                 -- Wrap up
714         traceTc (text "Tc7a") ;
715         tcg_env <- getGblEnv ;
716         let { all_binds = tc_val_binds   `unionBags`
717                           inst_binds     `unionBags`
718                           foe_binds  ;
719
720                 -- Extend the GblEnv with the (as yet un-zonked) 
721                 -- bindings, rules, foreign decls
722               tcg_env' = tcg_env {  tcg_binds = tcg_binds tcg_env `unionBags` all_binds,
723                                     tcg_rules = tcg_rules tcg_env ++ rules,
724                                     tcg_fords = tcg_fords tcg_env ++ foe_decls ++ fi_decls } } ;
725         return (tcg_env', lcl_env)
726     }}}}}}
727 \end{code}
728
729
730 %************************************************************************
731 %*                                                                      *
732         Checking for 'main'
733 %*                                                                      *
734 %************************************************************************
735
736 \begin{code}
737 checkMain 
738   = do { ghci_mode <- getGhciMode ;
739          tcg_env   <- getGblEnv ;
740          dflags    <- getDOpts ;
741          let { main_mod = case mainModIs dflags of {
742                                 Just mod -> mkModule mod ;
743                                 Nothing  -> mAIN } ;
744                main_fn  = case mainFunIs dflags of {
745                                 Just fn -> mkRdrUnqual (mkVarOcc (mkFastString fn)) ;
746                                 Nothing -> main_RDR_Unqual } } ;
747         
748          check_main ghci_mode tcg_env main_mod main_fn
749     }
750
751
752 check_main ghci_mode tcg_env main_mod main_fn
753      -- If we are in module Main, check that 'main' is defined.
754      -- It may be imported from another module!
755      --
756      -- 
757      -- Blimey: a whole page of code to do this...
758  | mod /= main_mod
759  = return tcg_env
760
761  | otherwise
762  = addErrCtxt mainCtxt                  $
763    do   { mb_main <- lookupSrcOcc_maybe main_fn
764                 -- Check that 'main' is in scope
765                 -- It might be imported from another module!
766         ; case mb_main of {
767              Nothing -> do { complain_no_main   
768                            ; return tcg_env } ;
769              Just main_name -> do
770         { let { rhs = nlHsApp (nlHsVar runMainIOName) (nlHsVar main_name) }
771                         -- :Main.main :: IO () = runMainIO main 
772
773         ; (main_expr, ty) <- setSrcSpan (srcLocSpan (getSrcLoc main_name)) $
774                              tcInferRho rhs
775
776         ; let { root_main_id = mkExportedLocalId rootMainName ty ;
777                 main_bind    = noLoc (VarBind root_main_id main_expr) }
778
779         ; return (tcg_env { tcg_binds = tcg_binds tcg_env 
780                                         `snocBag` main_bind,
781                             tcg_dus   = tcg_dus tcg_env
782                                         `plusDU` usesOnly (unitFV main_name)
783                         -- Record the use of 'main', so that we don't 
784                         -- complain about it being defined but not used
785                  }) 
786     }}}
787   where
788     mod = tcg_mod tcg_env
789  
790     complain_no_main | ghci_mode == Interactive = return ()
791                      | otherwise                = failWithTc noMainMsg
792         -- In interactive mode, don't worry about the absence of 'main'
793         -- In other modes, fail altogether, so that we don't go on
794         -- and complain a second time when processing the export list.
795
796     mainCtxt  = ptext SLIT("When checking the type of the main function") <+> quotes (ppr main_fn)
797     noMainMsg = ptext SLIT("The main function") <+> quotes (ppr main_fn) 
798                 <+> ptext SLIT("is not defined in module") <+> quotes (ppr main_mod)
799 \end{code}
800
801 %*********************************************************
802 %*                                                       *
803                 GHCi stuff
804 %*                                                       *
805 %*********************************************************
806
807 \begin{code}
808 #ifdef GHCI
809 setInteractiveContext :: HscEnv -> InteractiveContext -> TcRn a -> TcRn a
810 setInteractiveContext hsc_env icxt thing_inside 
811   = let 
812         -- Initialise the tcg_inst_env with instances 
813         -- from all home modules.  This mimics the more selective
814         -- call to hptInstances in tcRnModule
815         dfuns = hptInstances hsc_env (\mod -> True)
816     in
817     updGblEnv (\env -> env { 
818         tcg_rdr_env  = ic_rn_gbl_env icxt,
819         tcg_type_env = ic_type_env   icxt,
820         tcg_inst_env = extendInstEnvList (tcg_inst_env env) dfuns }) $
821
822     updLclEnv (\env -> env { tcl_rdr = ic_rn_local_env icxt })  $
823
824     do  { traceTc (text "setIC" <+> ppr (ic_type_env icxt))
825         ; thing_inside }
826 \end{code}
827
828
829 \begin{code}
830 tcRnStmt :: HscEnv
831          -> InteractiveContext
832          -> LStmt RdrName
833          -> IO (Maybe (InteractiveContext, [Name], LHsExpr Id))
834                 -- The returned [Name] is the same as the input except for
835                 -- ExprStmt, in which case the returned [Name] is [itName]
836                 --
837                 -- The returned TypecheckedHsExpr is of type IO [ () ],
838                 -- a list of the bound values, coerced to ().
839
840 tcRnStmt hsc_env ictxt rdr_stmt
841   = initTcPrintErrors hsc_env iNTERACTIVE $ 
842     setInteractiveContext hsc_env ictxt $ do {
843
844     -- Rename; use CmdLineMode because tcRnStmt is only used interactively
845     (([rn_stmt], _), fvs) <- rnStmts DoExpr [rdr_stmt] (return ((), emptyFVs)) ;
846     traceRn (text "tcRnStmt" <+> vcat [ppr rdr_stmt, ppr rn_stmt, ppr fvs]) ;
847     failIfErrsM ;
848     
849     -- The real work is done here
850     (bound_ids, tc_expr) <- tcUserStmt rn_stmt ;
851     
852     traceTc (text "tcs 1") ;
853     let {       -- (a) Make all the bound ids "global" ids, now that
854                 --     they're notionally top-level bindings.  This is
855                 --     important: otherwise when we come to compile an expression
856                 --     using these ids later, the byte code generator will consider
857                 --     the occurrences to be free rather than global.
858                 -- 
859                 -- (b) Tidy their types; this is important, because :info may
860                 --     ask to look at them, and :info expects the things it looks
861                 --     up to have tidy types
862         global_ids = map globaliseAndTidy bound_ids ;
863     
864                 -- Update the interactive context
865         rn_env   = ic_rn_local_env ictxt ;
866         type_env = ic_type_env ictxt ;
867
868         bound_names = map idName global_ids ;
869         new_rn_env  = extendLocalRdrEnv rn_env bound_names ;
870
871                 -- Remove any shadowed bindings from the type_env;
872                 -- they are inaccessible but might, I suppose, cause 
873                 -- a space leak if we leave them there
874         shadowed = [ n | name <- bound_names,
875                          let rdr_name = mkRdrUnqual (nameOccName name),
876                          Just n <- [lookupLocalRdrEnv rn_env rdr_name] ] ;
877
878         filtered_type_env = delListFromNameEnv type_env shadowed ;
879         new_type_env = extendTypeEnvWithIds filtered_type_env global_ids ;
880
881         new_ic = ictxt { ic_rn_local_env = new_rn_env, 
882                          ic_type_env     = new_type_env }
883     } ;
884
885     dumpOptTcRn Opt_D_dump_tc 
886         (vcat [text "Bound Ids" <+> pprWithCommas ppr global_ids,
887                text "Typechecked expr" <+> ppr tc_expr]) ;
888
889     returnM (new_ic, bound_names, tc_expr)
890     }
891
892 globaliseAndTidy :: Id -> Id
893 globaliseAndTidy id
894 -- Give the Id a Global Name, and tidy its type
895   = setIdType (globaliseId VanillaGlobal id) tidy_type
896   where
897     tidy_type = tidyTopType (idType id)
898 \end{code}
899
900 Here is the grand plan, implemented in tcUserStmt
901
902         What you type                   The IO [HValue] that hscStmt returns
903         -------------                   ------------------------------------
904         let pat = expr          ==>     let pat = expr in return [coerce HVal x, coerce HVal y, ...]
905                                         bindings: [x,y,...]
906
907         pat <- expr             ==>     expr >>= \ pat -> return [coerce HVal x, coerce HVal y, ...]
908                                         bindings: [x,y,...]
909
910         expr (of IO type)       ==>     expr >>= \ it -> return [coerce HVal it]
911           [NB: result not printed]      bindings: [it]
912           
913         expr (of non-IO type,   ==>     let it = expr in print it >> return [coerce HVal it]
914           result showable)              bindings: [it]
915
916         expr (of non-IO type, 
917           result not showable)  ==>     error
918
919
920 \begin{code}
921 ---------------------------
922 tcUserStmt :: LStmt Name -> TcM ([Id], LHsExpr Id)
923 tcUserStmt (L loc (ExprStmt expr _ _))
924   = newUnique           `thenM` \ uniq ->
925     let 
926         fresh_it = itName uniq
927         the_bind = noLoc $ FunBind (noLoc fresh_it) False 
928                              (mkMatchGroup [mkSimpleMatch [] expr])
929     in
930     tryTcLIE_ (do {     -- Try this if the other fails
931                 traceTc (text "tcs 1b") ;
932                 tc_stmts (map (L loc) [
933                     LetStmt [HsBindGroup (unitBag the_bind) [] NonRecursive],
934                     ExprStmt (nlHsApp (nlHsVar printName) (nlHsVar fresh_it))
935                              (HsVar thenIOName) placeHolderType
936         ]) })
937           (do {         -- Try this first 
938                 traceTc (text "tcs 1a") ;
939                 tc_stmts [L loc (BindStmt (nlVarPat fresh_it) expr
940                                           (HsVar bindIOName) noSyntaxExpr) ] })
941
942 tcUserStmt stmt = tc_stmts [stmt]
943
944 ---------------------------
945 tc_stmts :: [LStmt Name] -> TcM ([Id], LHsExpr Id)
946 tc_stmts stmts
947  = do { ioTyCon <- tcLookupTyCon ioTyConName ;
948         let {
949             ret_ty    = mkListTy unitTy ;
950             io_ret_ty = mkTyConApp ioTyCon [ret_ty] ;
951
952             names = map unLoc (collectLStmtsBinders stmts) ;
953
954                 -- mk_return builds the expression
955                 --      returnIO @ [()] [coerce () x, ..,  coerce () z]
956                 --
957                 -- Despite the inconvenience of building the type applications etc,
958                 -- this *has* to be done in type-annotated post-typecheck form
959                 -- because we are going to return a list of *polymorphic* values
960                 -- coerced to type (). If we built a *source* stmt
961                 --      return [coerce x, ..., coerce z]
962                 -- then the type checker would instantiate x..z, and we wouldn't
963                 -- get their *polymorphic* values.  (And we'd get ambiguity errs
964                 -- if they were overloaded, since they aren't applied to anything.)
965             mk_return ret_id ids = nlHsApp (noLoc $ TyApp (nlHsVar ret_id) [ret_ty]) 
966                                            (noLoc $ ExplicitList unitTy (map mk_item ids)) ;
967             mk_item id = nlHsApp (noLoc $ TyApp (nlHsVar unsafeCoerceId) [idType id, unitTy])
968                                (nlHsVar id) ;
969
970             io_ty = mkTyConApp ioTyCon []
971          } ;
972
973         -- OK, we're ready to typecheck the stmts
974         traceTc (text "tcs 2") ;
975         ((ids, tc_expr), lie) <- getLIE $ do {
976                 (tc_stmts, ids) <- tcStmts DoExpr (tcDoStmt io_ty io_ret_ty) stmts $ 
977                                 do {
978                                     -- Look up the names right in the middle,
979                                     -- where they will all be in scope
980                                     ids <- mappM tcLookupId names ;
981                                     return ids } ;
982
983             ret_id <- tcLookupId returnIOName ;         -- return @ IO
984             return (ids, noLoc (HsDo DoExpr tc_stmts (mk_return ret_id ids) io_ret_ty))
985         } ;
986
987         -- Simplify the context right here, so that we fail
988         -- if there aren't enough instances.  Notably, when we see
989         --              e
990         -- we use recoverTc_ to try     it <- e
991         -- and then                     let it = e
992         -- It's the simplify step that rejects the first.
993         traceTc (text "tcs 3") ;
994         const_binds <- tcSimplifyInteractive lie ;
995
996         -- Build result expression and zonk it
997         let { expr = mkHsLet const_binds tc_expr } ;
998         zonked_expr <- zonkTopLExpr expr ;
999         zonked_ids  <- zonkTopBndrs ids ;
1000
1001         -- None of the Ids should be of unboxed type, because we
1002         -- cast them all to HValues in the end!
1003         mappM bad_unboxed (filter (isUnLiftedType . idType) zonked_ids) ;
1004
1005         return (zonked_ids, zonked_expr)
1006         }
1007   where
1008     bad_unboxed id = addErr (sep [ptext SLIT("GHCi can't bind a variable of unlifted type:"),
1009                                   nest 2 (ppr id <+> dcolon <+> ppr (idType id))])
1010 \end{code}
1011
1012
1013 tcRnExpr just finds the type of an expression
1014
1015 \begin{code}
1016 tcRnExpr :: HscEnv
1017          -> InteractiveContext
1018          -> LHsExpr RdrName
1019          -> IO (Maybe Type)
1020 tcRnExpr hsc_env ictxt rdr_expr
1021   = initTcPrintErrors hsc_env iNTERACTIVE $ 
1022     setInteractiveContext hsc_env ictxt $ do {
1023
1024     (rn_expr, fvs) <- rnLExpr rdr_expr ;
1025     failIfErrsM ;
1026
1027         -- Now typecheck the expression; 
1028         -- it might have a rank-2 type (e.g. :t runST)
1029     ((tc_expr, res_ty), lie)       <- getLIE (tcInferRho rn_expr) ;
1030     ((qtvs, _, dict_ids), lie_top) <- getLIE (tcSimplifyInfer smpl_doc (tyVarsOfType res_ty) lie)  ;
1031     tcSimplifyInteractive lie_top ;
1032     qtvs' <- mappM zonkQuantifiedTyVar qtvs ;
1033
1034     let { all_expr_ty = mkForAllTys qtvs' $
1035                         mkFunTys (map idType dict_ids)  $
1036                         res_ty } ;
1037     zonkTcType all_expr_ty
1038     }
1039   where
1040     smpl_doc = ptext SLIT("main expression")
1041 \end{code}
1042
1043 tcRnType just finds the kind of a type
1044
1045 \begin{code}
1046 tcRnType :: HscEnv
1047          -> InteractiveContext
1048          -> LHsType RdrName
1049          -> IO (Maybe Kind)
1050 tcRnType hsc_env ictxt rdr_type
1051   = initTcPrintErrors hsc_env iNTERACTIVE $ 
1052     setInteractiveContext hsc_env ictxt $ do {
1053
1054     rn_type <- rnLHsType doc rdr_type ;
1055     failIfErrsM ;
1056
1057         -- Now kind-check the type
1058     (ty', kind) <- kcHsType rn_type ;
1059     return kind
1060     }
1061   where
1062     doc = ptext SLIT("In GHCi input")
1063
1064 #endif /* GHCi */
1065 \end{code}
1066
1067
1068 %************************************************************************
1069 %*                                                                      *
1070         More GHCi stuff, to do with browsing and getting info
1071 %*                                                                      *
1072 %************************************************************************
1073
1074 \begin{code}
1075 #ifdef GHCI
1076 mkExportEnv :: HscEnv -> [Module]       -- Expose these modules' exports only
1077             -> IO GlobalRdrEnv
1078 mkExportEnv hsc_env exports
1079   = do  { mb_envs <- initTcPrintErrors hsc_env iNTERACTIVE $
1080                      mappM getModuleExports exports 
1081         ; case mb_envs of
1082              Just envs -> return (foldr plusGlobalRdrEnv emptyGlobalRdrEnv envs)
1083              Nothing   -> return emptyGlobalRdrEnv
1084                              -- Some error; initTc will have printed it
1085     }
1086
1087 getModuleExports :: Module -> TcM GlobalRdrEnv
1088 getModuleExports mod 
1089   = do  { iface <- load_iface mod
1090         ; loadOrphanModules (dep_orphs (mi_deps iface))
1091                         -- Load any orphan-module interfaces,
1092                         -- so their instances are visible
1093         ; names <- ifaceExportNames (mi_exports iface)
1094         ; let { gres =  [ GRE  { gre_name = name, gre_prov = vanillaProv mod }
1095                         | name <- nameSetToList names ] }
1096         ; returnM (mkGlobalRdrEnv gres) }
1097
1098 vanillaProv :: Module -> Provenance
1099 -- We're building a GlobalRdrEnv as if the user imported
1100 -- all the specified modules into the global interactive module
1101 vanillaProv mod = Imported [ImportSpec mod mod False 
1102                              (srcLocSpan interactiveSrcLoc)] False
1103 \end{code}
1104
1105 \begin{code}
1106 getModuleContents
1107   :: HscEnv
1108   -> Module                     -- Module to inspect
1109   -> Bool                       -- Grab just the exports, or the whole toplev
1110   -> IO (Maybe [IfaceDecl])
1111
1112 getModuleContents hsc_env mod exports_only
1113  = initTcPrintErrors hsc_env iNTERACTIVE (get_mod_contents exports_only)
1114  where
1115    get_mod_contents exports_only
1116       | not exports_only  -- We want the whole top-level type env
1117                           -- so it had better be a home module
1118       = do { hpt <- getHpt
1119            ; case lookupModuleEnv hpt mod of
1120                Just mod_info -> return (map (toIfaceDecl ext_nm) $
1121                                         filter wantToSee $
1122                                         typeEnvElts $
1123                                         md_types (hm_details mod_info))
1124                Nothing -> ghcError (ProgramError (showSDoc (noRdrEnvErr mod)))
1125                           -- This is a system error; the module should be in the HPT
1126            }
1127   
1128       | otherwise               -- Want the exports only
1129       = do { iface <- load_iface mod
1130            ; mappM get_decl [ (mod,avail) | (mod, avails) <- mi_exports iface
1131                                           , avail <- avails ]
1132         }
1133
1134    get_decl (mod, avail)
1135         = do { main_name <- lookupOrig mod (availName avail) 
1136              ; thing     <- tcLookupGlobal main_name
1137              ; return (filter_decl (availNames avail) (toIfaceDecl ext_nm thing)) }
1138
1139    ext_nm = interactiveExtNameFun (icPrintUnqual (hsc_IC hsc_env))
1140
1141 ---------------------
1142 filter_decl occs decl@(IfaceClass {ifSigs = sigs})
1143   = decl { ifSigs = filter (keep_sig occs) sigs }
1144 filter_decl occs decl@(IfaceData {ifCons = IfDataTyCon cons})
1145   = decl { ifCons = IfDataTyCon (filter (keep_con occs) cons) }
1146 filter_decl occs decl@(IfaceData {ifCons = IfNewTyCon con})
1147   | keep_con occs con = decl
1148   | otherwise         = decl {ifCons = IfAbstractTyCon} -- Hmm?
1149 filter_decl occs decl
1150   = decl
1151
1152 keep_sig occs (IfaceClassOp occ _ _) = occ `elem` occs
1153 keep_con occs con                    = ifConOcc con `elem` occs
1154
1155 wantToSee (AnId id)    = not (isImplicitId id)
1156 wantToSee (ADataCon _) = False  -- They'll come via their TyCon
1157 wantToSee _            = True
1158
1159 ---------------------
1160 load_iface mod = loadSrcInterface doc mod False {- Not boot iface -}
1161                where
1162                  doc = ptext SLIT("context for compiling statements")
1163
1164 ---------------------
1165 noRdrEnvErr mod = ptext SLIT("No top-level environment available for module") 
1166                   <+> quotes (ppr mod)
1167 \end{code}
1168
1169 \begin{code}
1170 type GetInfoResult = (String, IfaceDecl, Fixity, SrcLoc, 
1171                               [(IfaceType,SrcLoc)]      -- Instances
1172                      )
1173
1174 tcRnLookupRdrName :: HscEnv -> RdrName -> IO (Maybe [Name])
1175
1176 tcRnLookupRdrName hsc_env rdr_name 
1177   = initTcPrintErrors hsc_env iNTERACTIVE $ 
1178     setInteractiveContext hsc_env (hsc_IC hsc_env) $ 
1179     lookup_rdr_name rdr_name
1180
1181
1182 lookup_rdr_name rdr_name = do {
1183         -- If the identifier is a constructor (begins with an
1184         -- upper-case letter), then we need to consider both
1185         -- constructor and type class identifiers.
1186     let { rdr_names = dataTcOccs rdr_name } ;
1187
1188         -- results :: [(Messages, Maybe Name)]
1189     results <- mapM (tryTc . lookupOccRn) rdr_names ;
1190
1191     traceRn (text "xx" <+> vcat [ppr rdr_names, ppr (map snd results)]);
1192         -- The successful lookups will be (Just name)
1193     let { (warns_s, good_names) = unzip [ (msgs, name) 
1194                                         | (msgs, Just name) <- results] ;
1195           errs_s = [msgs | (msgs, Nothing) <- results] } ;
1196
1197         -- Fail if nothing good happened, else add warnings
1198     if null good_names then
1199                 -- No lookup succeeded, so
1200                 -- pick the first error message and report it
1201                 -- ToDo: If one of the errors is "could be Foo.X or Baz.X",
1202                 --       while the other is "X is not in scope", 
1203                 --       we definitely want the former; but we might pick the latter
1204         do { addMessages (head errs_s) ; failM }
1205       else                      -- Add deprecation warnings
1206         mapM_ addMessages warns_s ;
1207     
1208     return good_names
1209  }
1210
1211
1212 tcRnGetInfo :: HscEnv
1213             -> InteractiveContext
1214             -> RdrName
1215             -> IO (Maybe [GetInfoResult])
1216
1217 -- Used to implemnent :info in GHCi
1218 --
1219 -- Look up a RdrName and return all the TyThings it might be
1220 -- A capitalised RdrName is given to us in the DataName namespace,
1221 -- but we want to treat it as *both* a data constructor 
1222 --  *and* as a type or class constructor; 
1223 -- hence the call to dataTcOccs, and we return up to two results
1224 tcRnGetInfo hsc_env ictxt rdr_name
1225   = initTcPrintErrors hsc_env iNTERACTIVE $ 
1226     setInteractiveContext hsc_env ictxt $ do {
1227
1228     good_names <- lookup_rdr_name rdr_name ;
1229
1230         -- And lookup up the entities, avoiding duplicates, which arise
1231         -- because constructors and record selectors are represented by
1232         -- their parent declaration
1233     let { do_one name = do { thing  <- tcLookupGlobal name
1234                            ; fixity <- lookupFixityRn name
1235                            ; ispecs <- lookupInsts ext_nm thing
1236                            ; return (str, toIfaceDecl ext_nm thing, fixity, 
1237                                      getSrcLoc thing, 
1238                                      [(toIfaceType ext_nm (idType dfun), getSrcLoc dfun) 
1239                                      | dfun <- map instanceDFunId ispecs ]
1240                              ) } 
1241                 where
1242                         -- str is the the naked occurrence name
1243                         -- after stripping off qualification and parens (+)
1244                   str = occNameUserString (nameOccName name)
1245         } ;
1246
1247                 -- For the SrcLoc, the 'thing' has better info than
1248                 -- the 'name' because getting the former forced the
1249                 -- declaration to be loaded into the cache
1250
1251     results <- mapM do_one good_names ;
1252     return (fst (removeDups cmp results))
1253     }
1254   where
1255     cmp (_,d1,_,_,_) (_,d2,_,_,_) = ifName d1 `compare` ifName d2
1256     ext_nm = interactiveExtNameFun (icPrintUnqual ictxt)
1257
1258
1259 lookupInsts :: (Name -> IfaceExtName) -> TyThing -> TcM [Instance]
1260 -- Filter the instances by the ones whose tycons (or clases resp) 
1261 -- are in scope unqualified.  Otherwise we list a whole lot too many!
1262 lookupInsts ext_nm (AClass cls)
1263   = do  { loadImportedInsts cls []      -- [] means load all instances for cls
1264         ; inst_envs <- tcGetInstEnvs
1265         ; return [ ispec
1266                  | ispec <- classInstances inst_envs cls
1267                  , let (_, tycons) = ifaceInstGates (ifInstHead (instanceToIfaceInst ext_nm ispec))
1268                         -- Rather an indirect/inefficient test, but there we go
1269                  , all print_tycon_unqual tycons ] }
1270   where
1271     print_tycon_unqual (IfaceTc nm) = isLocalIfaceExtName nm
1272     print_tycon_unqual other            = True  -- Int etc
1273    
1274
1275 lookupInsts ext_nm (ATyCon tc)
1276   = do  { eps <- getEps -- Load all instances for all classes that are
1277                         -- in the type environment (which are all the ones
1278                         -- we've seen in any interface file so far)
1279         ; mapM_ (\c -> loadImportedInsts c [])
1280                 (typeEnvClasses (eps_PTE eps))
1281         ; (pkg_ie, home_ie) <- tcGetInstEnvs    -- Search all
1282         ; return [ dfun
1283                  | (_, _, dfun) <- instEnvElts home_ie ++ instEnvElts pkg_ie
1284                  , relevant dfun
1285                  , let (cls, _) = ifaceInstGates (ifInstHead (instanceToIfaceInst ext_nm dfun))
1286                  , isLocalIfaceExtName cls ]  }
1287   where
1288     relevant df = tc_name `elemNameSet` tyClsNamesOfDFunHead (idType (instanceDFunId df))
1289     tc_name     = tyConName tc            
1290
1291 lookupInsts ext_nm other = return []
1292
1293
1294 toIfaceDecl :: (Name -> IfaceExtName) -> TyThing -> IfaceDecl
1295 toIfaceDecl ext_nm thing
1296   = tyThingToIfaceDecl True             -- Discard IdInfo
1297                        emptyNameSet     -- Show data cons
1298                        ext_nm (munge thing)
1299   where
1300         -- munge transforms a thing to its "parent" thing
1301     munge (ADataCon dc) = ATyCon (dataConTyCon dc)
1302     munge (AnId id) = case globalIdDetails id of
1303                         RecordSelId tc lbl -> ATyCon tc
1304                         ClassOpId cls      -> AClass cls
1305                         other              -> AnId id
1306     munge other_thing = other_thing
1307 #endif /* GHCI */
1308 \end{code}
1309
1310 %************************************************************************
1311 %*                                                                      *
1312                 Degugging output
1313 %*                                                                      *
1314 %************************************************************************
1315
1316 \begin{code}
1317 rnDump :: SDoc -> TcRn ()
1318 -- Dump, with a banner, if -ddump-rn
1319 rnDump doc = do { dumpOptTcRn Opt_D_dump_rn (mkDumpDoc "Renamer" doc) }
1320
1321 tcDump :: TcGblEnv -> TcRn ()
1322 tcDump env
1323  = do { dflags <- getDOpts ;
1324
1325         -- Dump short output if -ddump-types or -ddump-tc
1326         ifM (dopt Opt_D_dump_types dflags || dopt Opt_D_dump_tc dflags)
1327             (dumpTcRn short_dump) ;
1328
1329         -- Dump bindings if -ddump-tc
1330         dumpOptTcRn Opt_D_dump_tc (mkDumpDoc "Typechecker" full_dump)
1331    }
1332   where
1333     short_dump = pprTcGblEnv env
1334     full_dump  = pprLHsBinds (tcg_binds env)
1335         -- NB: foreign x-d's have undefined's in their types; 
1336         --     hence can't show the tc_fords
1337
1338 tcCoreDump mod_guts
1339  = do { dflags <- getDOpts ;
1340         ifM (dopt Opt_D_dump_types dflags || dopt Opt_D_dump_tc dflags)
1341             (dumpTcRn (pprModGuts mod_guts)) ;
1342
1343         -- Dump bindings if -ddump-tc
1344         dumpOptTcRn Opt_D_dump_tc (mkDumpDoc "Typechecker" full_dump) }
1345   where
1346     full_dump = pprCoreBindings (mg_binds mod_guts)
1347
1348 -- It's unpleasant having both pprModGuts and pprModDetails here
1349 pprTcGblEnv :: TcGblEnv -> SDoc
1350 pprTcGblEnv (TcGblEnv { tcg_type_env = type_env, 
1351                         tcg_insts    = dfun_ids, 
1352                         tcg_rules    = rules,
1353                         tcg_imports  = imports })
1354   = vcat [ ppr_types dfun_ids type_env
1355          , ppr_insts dfun_ids
1356          , vcat (map ppr rules)
1357          , ppr_gen_tycons (typeEnvTyCons type_env)
1358          , ptext SLIT("Dependent modules:") <+> ppr (moduleEnvElts (imp_dep_mods imports))
1359          , ptext SLIT("Dependent packages:") <+> ppr (imp_dep_pkgs imports)]
1360
1361 pprModGuts :: ModGuts -> SDoc
1362 pprModGuts (ModGuts { mg_types = type_env,
1363                       mg_rules = rules })
1364   = vcat [ ppr_types [] type_env,
1365            ppr_rules rules ]
1366
1367
1368 ppr_types :: [Instance] -> TypeEnv -> SDoc
1369 ppr_types ispecs type_env
1370   = text "TYPE SIGNATURES" $$ nest 4 (ppr_sigs ids)
1371   where
1372     dfun_ids = map instanceDFunId ispecs
1373     ids = [id | id <- typeEnvIds type_env, want_sig id]
1374     want_sig id | opt_PprStyle_Debug = True
1375                 | otherwise          = isLocalId id && 
1376                                        isExternalName (idName id) && 
1377                                        not (id `elem` dfun_ids)
1378         -- isLocalId ignores data constructors, records selectors etc.
1379         -- The isExternalName ignores local dictionary and method bindings
1380         -- that the type checker has invented.  Top-level user-defined things 
1381         -- have External names.
1382
1383 ppr_insts :: [Instance] -> SDoc
1384 ppr_insts []     = empty
1385 ppr_insts ispecs = text "INSTANCES" $$ nest 2 (pprInstances ispecs)
1386
1387 ppr_sigs :: [Var] -> SDoc
1388 ppr_sigs ids
1389         -- Print type signatures; sort by OccName 
1390   = vcat (map ppr_sig (sortLe le_sig ids))
1391   where
1392     le_sig id1 id2 = getOccName id1 <= getOccName id2
1393     ppr_sig id = ppr id <+> dcolon <+> ppr (tidyTopType (idType id))
1394
1395 ppr_rules :: [CoreRule] -> SDoc
1396 ppr_rules [] = empty
1397 ppr_rules rs = vcat [ptext SLIT("{-# RULES"),
1398                       nest 4 (pprRules rs),
1399                       ptext SLIT("#-}")]
1400
1401 ppr_gen_tycons []  = empty
1402 ppr_gen_tycons tcs = vcat [ptext SLIT("Tycons with generics:"),
1403                            nest 2 (fsep (map ppr (filter tyConHasGenerics tcs)))]
1404 \end{code}