[project @ 2004-12-23 13:44:06 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcEnv.lhs
1 \begin{code}
2 module TcEnv(
3         TyThing(..), TcTyThing(..), TcId,
4
5         -- Instance environment, and InstInfo type
6         InstInfo(..), pprInstInfo, pprInstInfoDetails,
7         simpleInstInfoTy, simpleInstInfoTyCon, 
8         InstBindings(..),
9
10         -- Global environment
11         tcExtendGlobalEnv, 
12         tcExtendGlobalValEnv,
13         tcLookupLocatedGlobal,  tcLookupGlobal, 
14         tcLookupGlobalId, tcLookupTyCon, tcLookupClass, tcLookupDataCon,
15         tcLookupLocatedGlobalId, tcLookupLocatedTyCon,
16         tcLookupLocatedClass, 
17         
18         -- Local environment
19         tcExtendKindEnv,
20         tcExtendTyVarEnv, tcExtendTyVarEnv2, 
21         tcExtendIdEnv, tcExtendIdEnv1, tcExtendIdEnv2, 
22         tcLookup, tcLookupLocated, tcLookupLocalIds,
23         tcLookupId, tcLookupTyVar,
24         lclEnvElts, getInLocalScope, findGlobals, 
25         wrongThingErr,
26
27         tcExtendRecEnv,         -- For knot-tying
28
29         -- Rules
30         tcExtendRules,
31
32         -- Global type variables
33         tcGetGlobalTyVars,
34
35         -- Template Haskell stuff
36         checkWellStaged, spliceOK, bracketOK, tcMetaTy, thLevel, 
37         topIdLvl, 
38
39         -- Arrow stuff
40         checkProcLevel,
41
42         -- New Ids
43         newLocalName, newDFunName
44   ) where
45
46 #include "HsVersions.h"
47
48 import HsSyn            ( LRuleDecl, LHsBinds, LSig, pprLHsBinds )
49 import TcIface          ( tcImportDecl )
50 import TcRnMonad
51 import TcMType          ( zonkTcType, zonkTcTyVar, zonkTcTyVarsAndFV )
52 import TcType           ( Type, TcKind, TcTyVar, TcTyVarSet, TcType,
53                           tyVarsOfType, tyVarsOfTypes, tcSplitDFunTy, mkGenTyConApp,
54                           getDFunTyKey, tcTyConAppTyCon, tcGetTyVar, mkTyVarTy,
55                           tidyOpenType, tidyOpenTyVar, pprTyThingCategory
56                         )
57 import qualified Type   ( getTyVar_maybe )
58 import Id               ( idName, isLocalId )
59 import Var              ( TyVar, Id, idType )
60 import VarSet
61 import VarEnv
62 import RdrName          ( extendLocalRdrEnv )
63 import DataCon          ( DataCon )
64 import TyCon            ( TyCon )
65 import Class            ( Class )
66 import Name             ( Name, NamedThing(..), getSrcLoc, mkInternalName, nameIsLocalOrFrom )
67 import NameEnv
68 import OccName          ( mkDFunOcc, occNameString )
69 import HscTypes         ( DFunId, extendTypeEnvList, lookupType,
70                           TyThing(..), tyThingId, tyThingDataCon,
71                           ExternalPackageState(..) )
72
73 import SrcLoc           ( SrcLoc, Located(..) )
74 import Outputable
75 \end{code}
76
77
78 %************************************************************************
79 %*                                                                      *
80 %*                      tcLookupGlobal                                  *
81 %*                                                                      *
82 %************************************************************************
83
84 Using the Located versions (eg. tcLookupLocatedGlobal) is preferred,
85 unless you know that the SrcSpan in the monad is already set to the
86 span of the Name.
87
88 \begin{code}
89 tcLookupLocatedGlobal :: Located Name -> TcM TyThing
90 -- c.f. IfaceEnvEnv.tcIfaceGlobal
91 tcLookupLocatedGlobal name
92   = addLocM tcLookupGlobal name
93
94 tcLookupGlobal :: Name -> TcM TyThing
95 tcLookupGlobal name
96   = do  { env <- getGblEnv
97         ; if nameIsLocalOrFrom (tcg_mod env) name
98
99           then  -- It's defined in this module
100               case lookupNameEnv (tcg_type_env env) name of
101                 Just thing -> return thing
102                 Nothing    -> notFound  name    -- Panic!
103          
104           else do               -- It's imported
105         { (eps,hpt) <- getEpsAndHpt
106         ; case lookupType hpt (eps_PTE eps) name of 
107             Just thing -> return thing 
108             Nothing    -> do { traceIf (text "tcLookupGlobal" <+> ppr name)
109                              ; initIfaceTcRn (tcImportDecl name) }
110     }}
111 \end{code}
112
113 \begin{code}
114 tcLookupGlobalId :: Name -> TcM Id
115 -- Never used for Haskell-source DataCons, hence no ADataCon case
116 tcLookupGlobalId name
117   = tcLookupGlobal name         `thenM` \ thing ->
118     return (tyThingId thing)
119
120 tcLookupDataCon :: Name -> TcM DataCon
121 tcLookupDataCon con_name
122   = tcLookupGlobal con_name     `thenM` \ thing ->
123     return (tyThingDataCon thing)
124
125 tcLookupClass :: Name -> TcM Class
126 tcLookupClass name
127   = tcLookupGlobal name         `thenM` \ thing ->
128     case thing of
129         AClass cls -> return cls
130         other      -> wrongThingErr "class" (AGlobal thing) name
131         
132 tcLookupTyCon :: Name -> TcM TyCon
133 tcLookupTyCon name
134   = tcLookupGlobal name         `thenM` \ thing ->
135     case thing of
136         ATyCon tc -> return tc
137         other     -> wrongThingErr "type constructor" (AGlobal thing) name
138
139 tcLookupLocatedGlobalId :: Located Name -> TcM Id
140 tcLookupLocatedGlobalId = addLocM tcLookupId
141
142 tcLookupLocatedClass :: Located Name -> TcM Class
143 tcLookupLocatedClass = addLocM tcLookupClass
144
145 tcLookupLocatedTyCon :: Located Name -> TcM TyCon
146 tcLookupLocatedTyCon = addLocM tcLookupTyCon
147 \end{code}
148
149 %************************************************************************
150 %*                                                                      *
151                 Extending the global environment
152 %*                                                                      *
153 %************************************************************************
154
155
156 \begin{code}
157 tcExtendGlobalEnv :: [TyThing] -> TcM r -> TcM r
158   -- Given a mixture of Ids, TyCons, Classes, all from the
159   -- module being compiled, extend the global environment
160 tcExtendGlobalEnv things thing_inside
161    = do { env <- getGblEnv
162         ; let ge'  = extendTypeEnvList (tcg_type_env env) things
163         ; setGblEnv (env {tcg_type_env = ge'}) thing_inside }
164
165 tcExtendGlobalValEnv :: [Id] -> TcM a -> TcM a
166   -- Same deal as tcExtendGlobalEnv, but for Ids
167 tcExtendGlobalValEnv ids thing_inside 
168   = tcExtendGlobalEnv [AnId id | id <- ids] thing_inside
169 \end{code}
170
171 \begin{code}
172 tcExtendRecEnv :: [(Name,TyThing)] -> TcM r -> TcM r
173 -- Extend the global environments for the type/class knot tying game
174 tcExtendRecEnv gbl_stuff thing_inside
175  = updGblEnv upd thing_inside
176  where
177    upd env = env { tcg_type_env = extend (tcg_type_env env) }
178    extend env = extendNameEnvList env gbl_stuff
179 \end{code}
180
181
182 %************************************************************************
183 %*                                                                      *
184 \subsection{The local environment}
185 %*                                                                      *
186 %************************************************************************
187
188 \begin{code}
189 tcLookupLocated :: Located Name -> TcM TcTyThing
190 tcLookupLocated = addLocM tcLookup
191
192 tcLookup :: Name -> TcM TcTyThing
193 tcLookup name
194   = getLclEnv           `thenM` \ local_env ->
195     case lookupNameEnv (tcl_env local_env) name of
196         Just thing -> returnM thing
197         Nothing    -> tcLookupGlobal name `thenM` \ thing ->
198                       returnM (AGlobal thing)
199
200 tcLookupTyVar :: Name -> TcM TcTyVar
201 tcLookupTyVar name
202   = tcLookup name       `thenM` \ thing -> 
203     case thing of
204         ATyVar _ ty -> returnM (tcGetTyVar "tcLookupTyVar" ty)
205         other       -> pprPanic "tcLookupTyVar" (ppr name)
206
207 tcLookupId :: Name -> TcM Id
208 -- Used when we aren't interested in the binding level
209 -- Never a DataCon. (Why does that matter? see TcExpr.tcId)
210 tcLookupId name
211   = tcLookup name       `thenM` \ thing -> 
212     case thing of
213         ATcId tc_id _ _   -> returnM tc_id
214         AGlobal (AnId id) -> returnM id
215         other             -> pprPanic "tcLookupId" (ppr name)
216
217 tcLookupLocalIds :: [Name] -> TcM [TcId]
218 -- We expect the variables to all be bound, and all at
219 -- the same level as the lookup.  Only used in one place...
220 tcLookupLocalIds ns
221   = getLclEnv           `thenM` \ env ->
222     returnM (map (lookup (tcl_env env) (thLevel (tcl_th_ctxt env))) ns)
223   where
224     lookup lenv lvl name 
225         = case lookupNameEnv lenv name of
226                 Just (ATcId id lvl1 _) -> ASSERT( lvl == lvl1 ) id
227                 other                  -> pprPanic "tcLookupLocalIds" (ppr name)
228
229 lclEnvElts :: TcLclEnv -> [TcTyThing]
230 lclEnvElts env = nameEnvElts (tcl_env env)
231
232 getInLocalScope :: TcM (Name -> Bool)
233   -- Ids only
234 getInLocalScope = getLclEnv     `thenM` \ env ->
235                   let 
236                         lcl_env = tcl_env env
237                   in
238                   return (`elemNameEnv` lcl_env)
239 \end{code}
240
241 \begin{code}
242 tcExtendKindEnv :: [(Name, TcKind)] -> TcM r -> TcM r
243 tcExtendKindEnv things thing_inside
244   = updLclEnv upd thing_inside
245   where
246     upd lcl_env = lcl_env { tcl_env = extend (tcl_env lcl_env) }
247     extend env  = extendNameEnvList env [(n, AThing k) | (n,k) <- things]
248
249 tcExtendTyVarEnv :: [TyVar] -> TcM r -> TcM r
250 tcExtendTyVarEnv tvs thing_inside
251   = tc_extend_tv_env [ATyVar tv (mkTyVarTy tv) | tv <- tvs] thing_inside
252
253 tcExtendTyVarEnv2 :: [(TyVar,TcType)] -> TcM r -> TcM r
254 tcExtendTyVarEnv2 ty_pairs thing_inside
255   = tc_extend_tv_env [ATyVar tv1 ty2 | (tv1,ty2) <- ty_pairs] thing_inside
256
257 tc_extend_tv_env binds thing_inside
258   = getLclEnv      `thenM` \ env@(TcLclEnv {tcl_env = le, 
259                                             tcl_tyvars = gtvs, 
260                                             tcl_rdr = rdr_env}) ->
261     let
262         names      = [getName tv | ATyVar tv _ <- binds]
263         rdr_env'   = extendLocalRdrEnv rdr_env names
264         le'        = extendNameEnvList le (names `zip` binds)
265         new_tv_set = tyVarsOfTypes [ty | ATyVar _ ty <- binds]
266     in
267         -- It's important to add the in-scope tyvars to the global tyvar set
268         -- as well.  Consider
269         --      f (_::r) = let g y = y::r in ...
270         -- Here, g mustn't be generalised.  This is also important during
271         -- class and instance decls, when we mustn't generalise the class tyvars
272         -- when typechecking the methods.
273     tc_extend_gtvs gtvs new_tv_set              `thenM` \ gtvs' ->
274     setLclEnv (env {tcl_env = le', tcl_tyvars = gtvs', tcl_rdr = rdr_env'}) thing_inside
275 \end{code}
276
277
278 \begin{code}
279 tcExtendIdEnv :: [TcId] -> TcM a -> TcM a
280 -- Invariant: the TcIds are fully zonked. Reasons:
281 --      (a) The kinds of the forall'd type variables are defaulted
282 --          (see Kind.defaultKind, done in zonkQuantifiedTyVar)
283 --      (b) There are no via-Indirect occurrences of the bound variables
284 --          in the types, because instantiation does not look through such things
285 --      (c) The call to tyVarsOfTypes is ok without looking through refs
286 tcExtendIdEnv ids thing_inside = tcExtendIdEnv2 [(idName id, id) | id <- ids] thing_inside
287
288 tcExtendIdEnv1 :: Name -> TcId -> TcM a -> TcM a
289 tcExtendIdEnv1 name id thing_inside = tcExtendIdEnv2 [(name,id)] thing_inside
290
291 tcExtendIdEnv2 :: [(Name,TcId)] -> TcM a -> TcM a
292 -- Invariant: the TcIds are fully zonked (see tcExtendIdEnv above)
293 tcExtendIdEnv2 names_w_ids thing_inside
294   = getLclEnv           `thenM` \ env ->
295     let
296         extra_global_tyvars = tyVarsOfTypes [idType id | (name,id) <- names_w_ids]
297         th_lvl              = thLevel    (tcl_th_ctxt   env)
298         proc_lvl            = proc_level (tcl_arrow_ctxt env)
299         extra_env           = [(name, ATcId id th_lvl proc_lvl) | (name,id) <- names_w_ids]
300         le'                 = extendNameEnvList (tcl_env env) extra_env
301         rdr_env'            = extendLocalRdrEnv (tcl_rdr env) (map fst names_w_ids)
302     in
303     tc_extend_gtvs (tcl_tyvars env) extra_global_tyvars `thenM` \ gtvs' ->
304     setLclEnv (env {tcl_env = le', tcl_tyvars = gtvs', tcl_rdr = rdr_env'}) thing_inside
305 \end{code}
306
307
308 \begin{code}
309 -----------------------
310 -- findGlobals looks at the value environment and finds values
311 -- whose types mention the offending type variable.  It has to be 
312 -- careful to zonk the Id's type first, so it has to be in the monad.
313 -- We must be careful to pass it a zonked type variable, too.
314
315 findGlobals :: TcTyVarSet
316             -> TidyEnv 
317             -> TcM (TidyEnv, [SDoc])
318
319 findGlobals tvs tidy_env
320   = getLclEnv           `thenM` \ lcl_env ->
321     go tidy_env [] (lclEnvElts lcl_env)
322   where
323     go tidy_env acc [] = returnM (tidy_env, acc)
324     go tidy_env acc (thing : things)
325       = find_thing ignore_it tidy_env thing     `thenM` \ (tidy_env1, maybe_doc) ->
326         case maybe_doc of
327           Just d  -> go tidy_env1 (d:acc) things
328           Nothing -> go tidy_env1 acc     things
329
330     ignore_it ty = not (tvs `intersectsVarSet` tyVarsOfType ty)
331
332 -----------------------
333 find_thing ignore_it tidy_env (ATcId id _ _)
334   = zonkTcType  (idType id)     `thenM` \ id_ty ->
335     if ignore_it id_ty then
336         returnM (tidy_env, Nothing)
337     else let
338         (tidy_env', tidy_ty) = tidyOpenType tidy_env id_ty
339         msg = sep [ppr id <+> dcolon <+> ppr tidy_ty, 
340                    nest 2 (parens (ptext SLIT("bound at") <+>
341                                    ppr (getSrcLoc id)))]
342     in
343     returnM (tidy_env', Just msg)
344
345 find_thing ignore_it tidy_env (ATyVar tv ty)
346   = zonkTcType ty               `thenM` \ tv_ty ->
347     if ignore_it tv_ty then
348         returnM (tidy_env, Nothing)
349     else let
350         (tidy_env1, tv1)     = tidyOpenTyVar tidy_env  tv
351         (tidy_env2, tidy_ty) = tidyOpenType  tidy_env1 tv_ty
352         msg = sep [ppr tv1 <+> eq_stuff, nest 2 bound_at]
353
354         eq_stuff | Just tv' <- Type.getTyVar_maybe tv_ty, 
355                    tv == tv' = empty
356                  | otherwise = equals <+> ppr tidy_ty
357                 -- It's ok to use Type.getTyVar_maybe because ty is zonked by now
358         bound_at = ptext SLIT("bound at:") <+> ppr (getSrcLoc tv)
359     in
360     returnM (tidy_env2, Just msg)
361 \end{code}
362
363
364 %************************************************************************
365 %*                                                                      *
366 \subsection{The global tyvars}
367 %*                                                                      *
368 %************************************************************************
369
370 \begin{code}
371 tc_extend_gtvs gtvs extra_global_tvs
372   = readMutVar gtvs             `thenM` \ global_tvs ->
373     newMutVar (global_tvs `unionVarSet` extra_global_tvs)
374 \end{code}
375
376 @tcGetGlobalTyVars@ returns a fully-zonked set of tyvars free in the environment.
377 To improve subsequent calls to the same function it writes the zonked set back into
378 the environment.
379
380 \begin{code}
381 tcGetGlobalTyVars :: TcM TcTyVarSet
382 tcGetGlobalTyVars
383   = getLclEnv                                   `thenM` \ (TcLclEnv {tcl_tyvars = gtv_var}) ->
384     readMutVar gtv_var                          `thenM` \ gbl_tvs ->
385     zonkTcTyVarsAndFV (varSetElems gbl_tvs)     `thenM` \ gbl_tvs' ->
386     writeMutVar gtv_var gbl_tvs'                `thenM_` 
387     returnM gbl_tvs'
388 \end{code}
389
390
391 %************************************************************************
392 %*                                                                      *
393 \subsection{Rules}
394 %*                                                                      *
395 %************************************************************************
396
397 \begin{code}
398 tcExtendRules :: [LRuleDecl Id] -> TcM a -> TcM a
399         -- Just pop the new rules into the EPS and envt resp
400         -- All the rules come from an interface file, not soruce
401         -- Nevertheless, some may be for this module, if we read
402         -- its interface instead of its source code
403 tcExtendRules lcl_rules thing_inside
404  = do { env <- getGblEnv
405       ; let
406           env' = env { tcg_rules = lcl_rules ++ tcg_rules env }
407       ; setGblEnv env' thing_inside }
408 \end{code}
409
410
411 %************************************************************************
412 %*                                                                      *
413                 Arrow notation proc levels
414 %*                                                                      *
415 %************************************************************************
416
417 \begin{code}
418 checkProcLevel :: TcId -> ProcLevel -> TcM ()
419 checkProcLevel id id_lvl
420   = do  { banned <- getBannedProcLevels
421         ; checkTc (not (id_lvl `elem` banned))
422                   (procLevelErr id id_lvl) }
423
424 procLevelErr id id_lvl
425   = hang (ptext SLIT("Command-bound variable") <+> quotes (ppr id) <+> ptext SLIT("is not in scope here"))
426          4 (ptext SLIT("Reason: it is used in the left argument of (-<)"))
427 \end{code}
428                 
429
430 %************************************************************************
431 %*                                                                      *
432                 Meta level
433 %*                                                                      *
434 %************************************************************************
435
436 \begin{code}
437 instance Outputable ThStage where
438    ppr Comp          = text "Comp"
439    ppr (Brack l _ _) = text "Brack" <+> int l
440    ppr (Splice l)    = text "Splice" <+> int l
441
442
443 thLevel :: ThStage -> ThLevel
444 thLevel Comp          = topLevel
445 thLevel (Splice l)    = l
446 thLevel (Brack l _ _) = l
447
448
449 checkWellStaged :: SDoc         -- What the stage check is for
450                 -> ThLevel      -- Binding level
451                 -> ThStage      -- Use stage
452                 -> TcM ()       -- Fail if badly staged, adding an error
453 checkWellStaged pp_thing bind_lvl use_stage
454   | bind_lvl <= use_lvl         -- OK!
455   = returnM ()  
456
457   | bind_lvl == topLevel        -- GHC restriction on top level splices
458   = failWithTc $ 
459     sep [ptext SLIT("GHC stage restriction:") <+>  pp_thing,
460          nest 2 (ptext SLIT("is used in a top-level splice, and must be imported, not defined locally"))]
461
462   | otherwise                   -- Badly staged
463   = failWithTc $ 
464     ptext SLIT("Stage error:") <+> pp_thing <+> 
465         hsep   [ptext SLIT("is bound at stage") <+> ppr bind_lvl,
466                 ptext SLIT("but used at stage") <+> ppr use_lvl]
467   where
468     use_lvl = thLevel use_stage
469
470
471 topIdLvl :: Id -> ThLevel
472 -- Globals may either be imported, or may be from an earlier "chunk" 
473 -- (separated by declaration splices) of this module.  The former
474 -- *can* be used inside a top-level splice, but the latter cannot.
475 -- Hence we give the former impLevel, but the latter topLevel
476 -- E.g. this is bad:
477 --      x = [| foo |]
478 --      $( f x )
479 -- By the time we are prcessing the $(f x), the binding for "x" 
480 -- will be in the global env, not the local one.
481 topIdLvl id | isLocalId id = topLevel
482             | otherwise    = impLevel
483
484 -- Indicates the legal transitions on bracket( [| |] ).
485 bracketOK :: ThStage -> Maybe ThLevel
486 bracketOK (Brack _ _ _) = Nothing       -- Bracket illegal inside a bracket
487 bracketOK stage         = Just (thLevel stage + 1)
488
489 -- Indicates the legal transitions on splice($).
490 spliceOK :: ThStage -> Maybe ThLevel
491 spliceOK (Splice _) = Nothing   -- Splice illegal inside splice
492 spliceOK stage      = Just (thLevel stage - 1)
493
494 tcMetaTy :: Name -> TcM Type
495 -- Given the name of a Template Haskell data type, 
496 -- return the type
497 -- E.g. given the name "Expr" return the type "Expr"
498 tcMetaTy tc_name
499   = tcLookupTyCon tc_name       `thenM` \ t ->
500     returnM (mkGenTyConApp t [])
501         -- Use mkGenTyConApp because it might be a synonym
502 \end{code}
503
504
505 %************************************************************************
506 %*                                                                      *
507 \subsection{Making new Ids}
508 %*                                                                      *
509 %************************************************************************
510
511 Constructing new Ids
512
513 \begin{code}
514 newLocalName :: Name -> TcM Name
515 newLocalName name       -- Make a clone
516   = newUnique           `thenM` \ uniq ->
517     returnM (mkInternalName uniq (getOccName name) (getSrcLoc name))
518 \end{code}
519
520 Make a name for the dict fun for an instance decl.  It's a *local*
521 name for the moment.  The CoreTidy pass will externalise it.  Even in
522 --make and ghci stuff, we rebuild the instance environment each time,
523 so the dfun id is internal to begin with, and external when compiling
524 other modules
525
526 \begin{code}
527 newDFunName :: Class -> [Type] -> SrcLoc -> TcM Name
528 newDFunName clas (ty:_) loc
529   = newUnique                   `thenM` \ uniq ->
530     returnM (mkInternalName uniq (mkDFunOcc dfun_string) loc)
531   where
532         -- Any string that is somewhat unique will do
533     dfun_string = occNameString (getOccName clas) ++ occNameString (getDFunTyKey ty)
534
535 newDFunName clas [] loc = pprPanic "newDFunName" (ppr clas <+> ppr loc)
536 \end{code}
537
538
539 %************************************************************************
540 %*                                                                      *
541 \subsection{The InstInfo type}
542 %*                                                                      *
543 %************************************************************************
544
545 The InstInfo type summarises the information in an instance declaration
546
547     instance c => k (t tvs) where b
548
549 It is used just for *local* instance decls (not ones from interface files).
550 But local instance decls includes
551         - derived ones
552         - generic ones
553 as well as explicit user written ones.
554
555 \begin{code}
556 data InstInfo
557   = InstInfo {
558       iDFunId :: DFunId,                -- The dfun id.  Its forall'd type variables 
559       iBinds  :: InstBindings           -- scope over the stuff in InstBindings!
560     }
561
562 data InstBindings
563   = VanillaInst                 -- The normal case
564         (LHsBinds Name)         -- Bindings
565         [LSig Name]             -- User pragmas recorded for generating 
566                                 -- specialised instances
567
568   | NewTypeDerived              -- Used for deriving instances of newtypes, where the
569         [Type]                  -- witness dictionary is identical to the argument 
570                                 -- dictionary.  Hence no bindings, no pragmas
571         -- The [Type] are the representation types
572         -- See notes in TcDeriv
573
574 pprInstInfo info = vcat [ptext SLIT("InstInfo:") <+> ppr (idType (iDFunId info))]
575
576 pprInstInfoDetails info = pprInstInfo info $$ nest 2 (details (iBinds info))
577   where
578     details (VanillaInst b _)  = pprLHsBinds b
579     details (NewTypeDerived _) = text "Derived from the representation type"
580
581 simpleInstInfoTy :: InstInfo -> Type
582 simpleInstInfoTy info = case tcSplitDFunTy (idType (iDFunId info)) of
583                           (_, _, _, [ty]) -> ty
584
585 simpleInstInfoTyCon :: InstInfo -> TyCon
586   -- Gets the type constructor for a simple instance declaration,
587   -- i.e. one of the form       instance (...) => C (T a b c) where ...
588 simpleInstInfoTyCon inst = tcTyConAppTyCon (simpleInstInfoTy inst)
589 \end{code}
590
591
592 %************************************************************************
593 %*                                                                      *
594 \subsection{Errors}
595 %*                                                                      *
596 %************************************************************************
597
598 \begin{code}
599 notFound name 
600   = failWithTc (ptext SLIT("GHC internal error:") <+> quotes (ppr name) <+> 
601                 ptext SLIT("is not in scope"))
602
603 wrongThingErr expected thing name
604   = failWithTc (pp_thing thing <+> quotes (ppr name) <+> 
605                 ptext SLIT("used as a") <+> text expected)
606   where
607     pp_thing (AGlobal thing) = pprTyThingCategory thing
608     pp_thing (ATyVar _ _)    = ptext SLIT("Type variable")
609     pp_thing (ATcId _ _ _)   = ptext SLIT("Local identifier")
610 \end{code}