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