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