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