4 TyThing(..), TyThingDetails(..), TcTyThing(..),
6 -- Getting stuff from the environment
8 tcEnvTyCons, tcEnvClasses, tcEnvIds, tcLEnvElts,
11 -- Instance environment, and InstInfo type
12 tcGetInstEnv, tcSetInstEnv,
13 InstInfo(..), pprInstInfo,
14 simpleInstInfoTy, simpleInstInfoTyCon,
17 tcExtendGlobalEnv, tcExtendGlobalValEnv, tcExtendGlobalTypeEnv,
18 tcLookupTyCon, tcLookupClass, tcLookupGlobalId, tcLookupDataCon,
19 tcLookupGlobal_maybe, tcLookupGlobal,
22 tcExtendKindEnv, tcLookupLocalIds, tcInLocalScope,
23 tcExtendTyVarEnv, tcExtendTyVarEnvForMeths,
24 tcExtendLocalValEnv, tcLookup, tcLookup_maybe, tcLookupId,
26 -- Global type variables
27 tcGetGlobalTyVars, tcExtendGlobalTyVars,
29 -- Random useful things
30 RecTcEnv, tcAddImportedIdInfo, tcLookupRecId, tcLookupRecId_maybe,
33 newLocalName, newDFunName,
36 isLocalThing, tcSetEnv
39 #include "HsVersions.h"
41 import RnHsSyn ( RenamedMonoBinds, RenamedSig )
43 import TcMType ( zonkTcTyVarsAndFV )
44 import TcType ( Type, ThetaType, TcKind, TcTyVar, TcTyVarSet,
45 tyVarsOfTypes, tcSplitDFunTy,
46 getDFunTyKey, tcTyConAppTyCon
48 import Id ( idName, isDataConWrapId_maybe )
49 import IdInfo ( vanillaIdInfo )
50 import Var ( TyVar, Id, idType, lazySetIdInfo, idInfo )
52 import DataCon ( DataCon )
53 import TyCon ( TyCon )
54 import Class ( Class, ClassOpItem )
55 import Name ( Name, NamedThing(..),
56 getSrcLoc, mkLocalName, isLocalName, nameIsLocalOrFrom
58 import NameEnv ( NameEnv, lookupNameEnv, nameEnvElts, elemNameEnv,
59 extendNameEnvList, emptyNameEnv, plusNameEnv )
60 import OccName ( mkDFunOcc, occNameString )
61 import HscTypes ( DFunId,
62 PackageTypeEnv, TypeEnv,
63 extendTypeEnvList, extendTypeEnvWithIds,
64 typeEnvTyCons, typeEnvClasses, typeEnvIds,
67 import Module ( Module )
68 import InstEnv ( InstEnv, emptyInstEnv )
69 import HscTypes ( lookupType, TyThing(..) )
70 import Util ( zipEqual )
71 import SrcLoc ( SrcLoc )
74 import IOExts ( newIORef )
77 %************************************************************************
81 %************************************************************************
84 type TcId = Id -- Type may be a TcType
89 tcGST :: Name -> Maybe TyThing, -- The type environment at the moment we began this compilation
91 tcInsts :: InstEnv, -- All instances (both imported and in this module)
93 tcGEnv :: TypeEnv, -- The global type environment we've accumulated while
94 {- NameEnv TyThing-} -- compiling this module:
95 -- types and classes (both imported and local)
97 -- (Ids defined in this module start in the local envt,
98 -- though they move to the global envt during zonking)
100 tcLEnv :: NameEnv TcTyThing, -- The local type environment: Ids and TyVars
101 -- defined in this module
103 tcTyVars :: TcRef TcTyVarSet -- The "global tyvars"
104 -- Namely, the in-scope TyVars bound in tcLEnv, plus the tyvars
105 -- mentioned in the types of Ids bound in tcLEnv
106 -- Why mutable? see notes with tcGetGlobalTyVars
111 The Global-Env/Local-Env story
112 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
113 During type checking, we keep in the GlobalEnv
114 * All types and classes
115 * All Ids derived from types and classes (constructors, selectors)
118 At the end of type checking, we zonk the local bindings,
119 and as we do so we add to the GlobalEnv
120 * Locally defined top-level Ids
122 Why? Because they are now Ids not TcIds. This final GlobalEnv is
124 a) fed back (via the knot) to typechecking the
125 unfoldings of interface signatures
127 b) used to augment the GlobalSymbolTable
131 initTcEnv :: HomeSymbolTable -> PackageTypeEnv -> IO TcEnv
133 = do { gtv_var <- newIORef emptyVarSet ;
134 return (TcEnv { tcGST = lookup,
135 tcGEnv = emptyNameEnv,
136 tcInsts = emptyInstEnv,
137 tcLEnv = emptyNameEnv,
141 lookup name | isLocalName name = Nothing
142 | otherwise = lookupType hst pte name
145 tcEnvClasses env = typeEnvClasses (tcGEnv env)
146 tcEnvTyCons env = typeEnvTyCons (tcGEnv env)
147 tcEnvIds env = typeEnvIds (tcGEnv env)
148 tcLEnvElts env = nameEnvElts (tcLEnv env)
150 getTcGEnv (TcEnv { tcGEnv = genv }) = genv
152 tcInLocalScope :: TcEnv -> Name -> Bool
153 tcInLocalScope env v = v `elemNameEnv` (tcLEnv env)
158 = AGlobal TyThing -- Used only in the return type of a lookup
159 | ATcId TcId -- Ids defined in this module
160 | ATyVar TyVar -- Type variables
161 | AThing TcKind -- Used temporarily, during kind checking
162 -- Here's an example of how the AThing guy is used
163 -- Suppose we are checking (forall a. T a Int):
164 -- 1. We first bind (a -> AThink kv), where kv is a kind variable.
165 -- 2. Then we kind-check the (T a Int) part.
166 -- 3. Then we zonk the kind variable.
167 -- 4. Now we know the kind for 'a', and we add (a -> ATyVar a::K) to the environment
171 This data type is used to help tie the knot
172 when type checking type and class declarations
175 data TyThingDetails = SynTyDetails Type
176 | DataTyDetails ThetaType [DataCon] [Id]
177 | ClassDetails ThetaType [Id] [ClassOpItem] DataCon
178 | ForeignTyDetails -- Nothing yet
181 %************************************************************************
183 \subsection{Basic lookups}
185 %************************************************************************
188 lookup_global :: TcEnv -> Name -> Maybe TyThing
189 -- Try the global envt and then the global symbol table
190 lookup_global env name
191 = case lookupNameEnv (tcGEnv env) name of
192 Just thing -> Just thing
193 Nothing -> tcGST env name
195 lookup_local :: TcEnv -> Name -> Maybe TcTyThing
196 -- Try the local envt and then try the global
197 lookup_local env name
198 = case lookupNameEnv (tcLEnv env) name of
199 Just thing -> Just thing
200 Nothing -> case lookup_global env name of
201 Just thing -> Just (AGlobal thing)
206 type RecTcEnv = TcEnv
207 -- This environment is used for getting the 'right' IdInfo
208 -- on imported things and for looking up Ids in unfoldings
209 -- The environment doesn't have any local Ids in it
211 tcAddImportedIdInfo :: RecTcEnv -> Id -> Id
212 tcAddImportedIdInfo env id
213 = id `lazySetIdInfo` new_info
214 -- The Id must be returned without a data dependency on maybe_id
216 new_info = case tcLookupRecId_maybe env (idName id) of
217 Nothing -> pprTrace "tcAddIdInfo" (ppr id) vanillaIdInfo
218 Just imported_id -> idInfo imported_id
219 -- ToDo: could check that types are the same
221 tcLookupRecId_maybe :: RecTcEnv -> Name -> Maybe Id
222 tcLookupRecId_maybe env name = case lookup_global env name of
223 Just (AnId id) -> Just id
226 tcLookupRecId :: RecTcEnv -> Name -> Id
227 tcLookupRecId env name = case lookup_global env name of
229 Nothing -> pprPanic "tcLookupRecId" (ppr name)
232 %************************************************************************
234 \subsection{Making new Ids}
236 %************************************************************************
241 newLocalName :: Name -> NF_TcM Name
242 newLocalName name -- Make a clone
243 = tcGetUnique `thenNF_Tc` \ uniq ->
244 returnNF_Tc (mkLocalName uniq (getOccName name) (getSrcLoc name))
247 Make a name for the dict fun for an instance decl.
248 It's a *local* name for the moment. The CoreTidy pass
252 newDFunName :: Class -> [Type] -> SrcLoc -> NF_TcM Name
253 newDFunName clas (ty:_) loc
254 = tcGetUnique `thenNF_Tc` \ uniq ->
255 returnNF_Tc (mkLocalName uniq (mkDFunOcc dfun_string) loc)
257 -- Any string that is somewhat unique will do
258 dfun_string = occNameString (getOccName clas) ++ occNameString (getDFunTyKey ty)
260 newDFunName clas [] loc = pprPanic "newDFunName" (ppr clas <+> ppr loc)
264 isLocalThing :: NamedThing a => Module -> a -> Bool
265 isLocalThing mod thing = nameIsLocalOrFrom mod (getName thing)
268 %************************************************************************
270 \subsection{The global environment}
272 %************************************************************************
275 tcExtendGlobalEnv :: [TyThing] -> TcM r -> TcM r
276 tcExtendGlobalEnv things thing_inside
277 = tcGetEnv `thenNF_Tc` \ env ->
279 ge' = extendTypeEnvList (tcGEnv env) things
281 tcSetEnv (env {tcGEnv = ge'}) thing_inside
284 tcExtendGlobalTypeEnv :: TypeEnv -> TcM r -> TcM r
285 tcExtendGlobalTypeEnv extra_env thing_inside
286 = tcGetEnv `thenNF_Tc` \ env ->
288 ge' = tcGEnv env `plusNameEnv` extra_env
290 tcSetEnv (env {tcGEnv = ge'}) thing_inside
292 tcExtendGlobalValEnv :: [Id] -> TcM a -> TcM a
293 tcExtendGlobalValEnv ids thing_inside
294 = tcGetEnv `thenNF_Tc` \ env ->
296 ge' = extendTypeEnvWithIds (tcGEnv env) ids
298 tcSetEnv (env {tcGEnv = ge'}) thing_inside
303 tcLookupGlobal_maybe :: Name -> NF_TcM (Maybe TyThing)
304 tcLookupGlobal_maybe name
305 = tcGetEnv `thenNF_Tc` \ env ->
306 returnNF_Tc (lookup_global env name)
309 A variety of global lookups, when we know what we are looking for.
312 tcLookupGlobal :: Name -> NF_TcM TyThing
314 = tcLookupGlobal_maybe name `thenNF_Tc` \ maybe_thing ->
316 Just thing -> returnNF_Tc thing
317 other -> notFound "tcLookupGlobal" name
319 tcLookupGlobalId :: Name -> NF_TcM Id
320 tcLookupGlobalId name
321 = tcLookupGlobal_maybe name `thenNF_Tc` \ maybe_id ->
323 Just (AnId id) -> returnNF_Tc id
324 other -> notFound "tcLookupGlobalId" name
326 tcLookupDataCon :: Name -> TcM DataCon
327 tcLookupDataCon con_name
328 = tcLookupGlobalId con_name `thenNF_Tc` \ con_id ->
329 case isDataConWrapId_maybe con_id of
330 Just data_con -> returnTc data_con
331 Nothing -> failWithTc (badCon con_id)
334 tcLookupClass :: Name -> NF_TcM Class
336 = tcLookupGlobal_maybe name `thenNF_Tc` \ maybe_clas ->
338 Just (AClass clas) -> returnNF_Tc clas
339 other -> notFound "tcLookupClass" name
341 tcLookupTyCon :: Name -> NF_TcM TyCon
343 = tcLookupGlobal_maybe name `thenNF_Tc` \ maybe_tc ->
345 Just (ATyCon tc) -> returnNF_Tc tc
346 other -> notFound "tcLookupTyCon" name
348 tcLookupId :: Name -> NF_TcM Id
350 = tcLookup name `thenNF_Tc` \ thing ->
352 ATcId tc_id -> returnNF_Tc tc_id
353 AGlobal (AnId id) -> returnNF_Tc id
354 other -> pprPanic "tcLookupId" (ppr name)
356 tcLookupLocalIds :: [Name] -> NF_TcM [TcId]
358 = tcGetEnv `thenNF_Tc` \ env ->
359 returnNF_Tc (map (lookup (tcLEnv env)) ns)
361 lookup lenv name = case lookupNameEnv lenv name of
362 Just (ATcId id) -> id
363 other -> pprPanic "tcLookupLocalIds" (ppr name)
367 %************************************************************************
369 \subsection{The local environment}
371 %************************************************************************
374 tcLookup_maybe :: Name -> NF_TcM (Maybe TcTyThing)
376 = tcGetEnv `thenNF_Tc` \ env ->
377 returnNF_Tc (lookup_local env name)
379 tcLookup :: Name -> NF_TcM TcTyThing
381 = tcLookup_maybe name `thenNF_Tc` \ maybe_thing ->
383 Just thing -> returnNF_Tc thing
384 other -> notFound "tcLookup" name
385 -- Extract the IdInfo from an IfaceSig imported from an interface file
390 tcExtendKindEnv :: [(Name,TcKind)] -> TcM r -> TcM r
391 tcExtendKindEnv pairs thing_inside
392 = tcGetEnv `thenNF_Tc` \ env ->
394 le' = extendNameEnvList (tcLEnv env) [(n, AThing k) | (n,k) <- pairs]
395 -- No need to extend global tyvars for kind checking
397 tcSetEnv (env {tcLEnv = le'}) thing_inside
399 tcExtendTyVarEnv :: [TyVar] -> TcM r -> TcM r
400 tcExtendTyVarEnv tyvars thing_inside
401 = tcGetEnv `thenNF_Tc` \ env@(TcEnv {tcLEnv = le, tcTyVars = gtvs}) ->
403 le' = extendNameEnvList le [ (getName tv, ATyVar tv) | tv <- tyvars]
404 new_tv_set = mkVarSet tyvars
406 -- It's important to add the in-scope tyvars to the global tyvar set
408 -- f (x::r) = let g y = y::r in ...
409 -- Here, g mustn't be generalised. This is also important during
410 -- class and instance decls, when we mustn't generalise the class tyvars
411 -- when typechecking the methods.
412 tc_extend_gtvs gtvs new_tv_set `thenNF_Tc` \ gtvs' ->
413 tcSetEnv (env {tcLEnv = le', tcTyVars = gtvs'}) thing_inside
415 -- This variant, tcExtendTyVarEnvForMeths, takes *two* bunches of tyvars:
416 -- the signature tyvars contain the original names
417 -- the instance tyvars are what those names should be mapped to
418 -- It's needed when typechecking the method bindings of class and instance decls
419 -- It does *not* extend the global tyvars; tcMethodBind does that for itself
421 tcExtendTyVarEnvForMeths :: [TyVar] -> [TcTyVar] -> TcM r -> TcM r
422 tcExtendTyVarEnvForMeths sig_tyvars inst_tyvars thing_inside
423 = tcGetEnv `thenNF_Tc` \ env ->
425 le' = extendNameEnvList (tcLEnv env) stuff
426 stuff = [ (getName sig_tv, ATyVar inst_tv)
427 | (sig_tv, inst_tv) <- zipEqual "tcMeth" sig_tyvars inst_tyvars
430 tcSetEnv (env {tcLEnv = le'}) thing_inside
435 tcExtendLocalValEnv :: [(Name,TcId)] -> TcM a -> TcM a
436 tcExtendLocalValEnv names_w_ids thing_inside
437 = tcGetEnv `thenNF_Tc` \ env ->
439 extra_global_tyvars = tyVarsOfTypes [idType id | (name,id) <- names_w_ids]
440 extra_env = [(name, ATcId id) | (name,id) <- names_w_ids]
441 le' = extendNameEnvList (tcLEnv env) extra_env
443 tc_extend_gtvs (tcTyVars env) extra_global_tyvars `thenNF_Tc` \ gtvs' ->
444 tcSetEnv (env {tcLEnv = le', tcTyVars = gtvs'}) thing_inside
448 %************************************************************************
450 \subsection{The global tyvars}
452 %************************************************************************
455 tcExtendGlobalTyVars extra_global_tvs thing_inside
456 = tcGetEnv `thenNF_Tc` \ env ->
457 tc_extend_gtvs (tcTyVars env) extra_global_tvs `thenNF_Tc` \ gtvs' ->
458 tcSetEnv (env {tcTyVars = gtvs'}) thing_inside
460 tc_extend_gtvs gtvs extra_global_tvs
461 = tcReadMutVar gtvs `thenNF_Tc` \ global_tvs ->
462 tcNewMutVar (global_tvs `unionVarSet` extra_global_tvs)
465 @tcGetGlobalTyVars@ returns a fully-zonked set of tyvars free in the environment.
466 To improve subsequent calls to the same function it writes the zonked set back into
470 tcGetGlobalTyVars :: NF_TcM TcTyVarSet
472 = tcGetEnv `thenNF_Tc` \ (TcEnv {tcTyVars = gtv_var}) ->
473 tcReadMutVar gtv_var `thenNF_Tc` \ gbl_tvs ->
474 zonkTcTyVarsAndFV (varSetElems gbl_tvs) `thenNF_Tc` \ gbl_tvs' ->
475 tcWriteMutVar gtv_var gbl_tvs' `thenNF_Tc_`
480 %************************************************************************
482 \subsection{The instance environment}
484 %************************************************************************
487 tcGetInstEnv :: NF_TcM InstEnv
488 tcGetInstEnv = tcGetEnv `thenNF_Tc` \ env ->
489 returnNF_Tc (tcInsts env)
491 tcSetInstEnv :: InstEnv -> TcM a -> TcM a
492 tcSetInstEnv ie thing_inside
493 = tcGetEnv `thenNF_Tc` \ env ->
494 tcSetEnv (env {tcInsts = ie}) thing_inside
498 %************************************************************************
500 \subsection{The InstInfo type}
502 %************************************************************************
504 The InstInfo type summarises the information in an instance declaration
506 instance c => k (t tvs) where b
511 iDFunId :: DFunId, -- The dfun id
512 iBinds :: RenamedMonoBinds, -- Bindings, b
513 iPrags :: [RenamedSig] -- User pragmas recorded for generating specialised instances
516 pprInstInfo info = vcat [ptext SLIT("InstInfo:") <+> ppr (idType (iDFunId info)),
517 nest 4 (ppr (iBinds info))]
519 simpleInstInfoTy :: InstInfo -> Type
520 simpleInstInfoTy info = case tcSplitDFunTy (idType (iDFunId info)) of
521 (_, _, _, [ty]) -> ty
523 simpleInstInfoTyCon :: InstInfo -> TyCon
524 -- Gets the type constructor for a simple instance declaration,
525 -- i.e. one of the form instance (...) => C (T a b c) where ...
526 simpleInstInfoTyCon inst = tcTyConAppTyCon (simpleInstInfoTy inst)
530 %************************************************************************
534 %************************************************************************
537 badCon con_id = quotes (ppr con_id) <+> ptext SLIT("is not a data constructor")
539 notFound wheRe name = failWithTc (text wheRe <> colon <+> quotes (ppr name) <+>
540 ptext SLIT("is not in scope"))