[project @ 2004-12-23 13:44:06 by simonpj]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcEnv.lhs
index 54c4eee..e5ea1aa 100644 (file)
@@ -10,18 +10,19 @@ module TcEnv(
        -- Global environment
        tcExtendGlobalEnv, 
        tcExtendGlobalValEnv,
-       tcLookupGlobal, 
+       tcLookupLocatedGlobal,  tcLookupGlobal, 
        tcLookupGlobalId, tcLookupTyCon, tcLookupClass, tcLookupDataCon,
+       tcLookupLocatedGlobalId, tcLookupLocatedTyCon,
+       tcLookupLocatedClass, 
        
-       getInGlobalScope,
-
        -- Local environment
-       tcExtendTyVarKindEnv,
-       tcExtendTyVarEnv,    tcExtendTyVarEnv2, 
-       tcExtendLocalValEnv, tcExtendLocalValEnv2, 
-       tcLookup, tcLookupLocalIds,
+       tcExtendKindEnv,
+       tcExtendTyVarEnv, tcExtendTyVarEnv2, 
+       tcExtendIdEnv, tcExtendIdEnv1, tcExtendIdEnv2, 
+       tcLookup, tcLookupLocated, tcLookupLocalIds,
        tcLookupId, tcLookupTyVar,
        lclEnvElts, getInLocalScope, findGlobals, 
+       wrongThingErr,
 
        tcExtendRecEnv,         -- For knot-tying
 
@@ -44,36 +45,33 @@ module TcEnv(
 
 #include "HsVersions.h"
 
-import RnHsSyn         ( RenamedMonoBinds, RenamedSig )
-import HsSyn           ( RuleDecl(..), , HsTyVarBndr(..) )
+import HsSyn           ( LRuleDecl, LHsBinds, LSig, pprLHsBinds )
 import TcIface         ( tcImportDecl )
 import TcRnMonad
 import TcMType         ( zonkTcType, zonkTcTyVar, zonkTcTyVarsAndFV )
-import TcType          ( Type, TcTyVar, TcTyVarSet, 
+import TcType          ( Type, TcKind, TcTyVar, TcTyVarSet, TcType,
                          tyVarsOfType, tyVarsOfTypes, tcSplitDFunTy, mkGenTyConApp,
-                         getDFunTyKey, tcTyConAppTyCon, tyVarBindingInfo, 
-                         tidyOpenType, tidyOpenTyVar
+                         getDFunTyKey, tcTyConAppTyCon, tcGetTyVar, mkTyVarTy,
+                         tidyOpenType, tidyOpenTyVar, pprTyThingCategory
                        )
 import qualified Type  ( getTyVar_maybe )
 import Id              ( idName, isLocalId )
-import Var             ( TyVar, Id, mkTyVar, idType )
+import Var             ( TyVar, Id, idType )
 import VarSet
 import VarEnv
+import RdrName         ( extendLocalRdrEnv )
 import DataCon         ( DataCon )
 import TyCon           ( TyCon )
 import Class           ( Class )
-import Name            ( Name, NamedThing(..), 
-                         getSrcLoc, mkInternalName, nameIsLocalOrFrom
-                       )
+import Name            ( Name, NamedThing(..), getSrcLoc, mkInternalName, nameIsLocalOrFrom )
 import NameEnv
 import OccName         ( mkDFunOcc, occNameString )
 import HscTypes                ( DFunId, extendTypeEnvList, lookupType,
-                         TyThing(..), tyThingId, tyThingTyCon, tyThingClass, tyThingDataCon,
+                         TyThing(..), tyThingId, tyThingDataCon,
                          ExternalPackageState(..) )
 
-import SrcLoc          ( SrcLoc )
+import SrcLoc          ( SrcLoc, Located(..) )
 import Outputable
-import Maybe           ( isJust )
 \end{code}
 
 
@@ -83,9 +81,17 @@ import Maybe         ( isJust )
 %*                                                                     *
 %************************************************************************
 
+Using the Located versions (eg. tcLookupLocatedGlobal) is preferred,
+unless you know that the SrcSpan in the monad is already set to the
+span of the Name.
+
 \begin{code}
-tcLookupGlobal :: Name -> TcM TyThing
+tcLookupLocatedGlobal :: Located Name -> TcM TyThing
 -- c.f. IfaceEnvEnv.tcIfaceGlobal
+tcLookupLocatedGlobal name
+  = addLocM tcLookupGlobal name
+
+tcLookupGlobal :: Name -> TcM TyThing
 tcLookupGlobal name
   = do { env <- getGblEnv
        ; if nameIsLocalOrFrom (tcg_mod env) name
@@ -93,11 +99,10 @@ tcLookupGlobal name
          then  -- It's defined in this module
              case lookupNameEnv (tcg_type_env env) name of
                Just thing -> return thing
-               Nothing    -> notFound "tcLookupGlobal" name
+               Nothing    -> notFound  name    -- Panic!
         
          else do               -- It's imported
-       { eps <- getEps
-       ; hpt <- getHpt
+       { (eps,hpt) <- getEpsAndHpt
        ; case lookupType hpt (eps_PTE eps) name of 
            Just thing -> return thing 
            Nothing    -> do { traceIf (text "tcLookupGlobal" <+> ppr name)
@@ -119,13 +124,26 @@ tcLookupDataCon con_name
 
 tcLookupClass :: Name -> TcM Class
 tcLookupClass name
-  = tcLookupGlobal name        `thenM` \ thing ->
-    return (tyThingClass thing)
+  = tcLookupGlobal name                `thenM` \ thing ->
+    case thing of
+       AClass cls -> return cls
+       other      -> wrongThingErr "class" (AGlobal thing) name
        
 tcLookupTyCon :: Name -> TcM TyCon
 tcLookupTyCon name
-  = tcLookupGlobal name        `thenM` \ thing ->
-    return (tyThingTyCon thing)
+  = tcLookupGlobal name                `thenM` \ thing ->
+    case thing of
+       ATyCon tc -> return tc
+       other     -> wrongThingErr "type constructor" (AGlobal thing) name
+
+tcLookupLocatedGlobalId :: Located Name -> TcM Id
+tcLookupLocatedGlobalId = addLocM tcLookupId
+
+tcLookupLocatedClass :: Located Name -> TcM Class
+tcLookupLocatedClass = addLocM tcLookupClass
+
+tcLookupLocatedTyCon :: Located Name -> TcM TyCon
+tcLookupLocatedTyCon = addLocM tcLookupTyCon
 \end{code}
 
 %************************************************************************
@@ -150,33 +168,14 @@ tcExtendGlobalValEnv ids thing_inside
   = tcExtendGlobalEnv [AnId id | id <- ids] thing_inside
 \end{code}
 
-A variety of global lookups, when we know what we are looking for.
-
 \begin{code}
-getInGlobalScope :: TcM (Name -> Bool)
--- Get all things in the global environment; used for deciding what 
--- rules to suck in.  Anything defined in this module (nameIsLocalOrFrom)
--- is certainly in the envt, so we don't bother to look.
-getInGlobalScope 
-  = do { mod <- getModule
-       ; eps <- getEps
-       ; hpt <- getHpt
-       ; return (\n -> nameIsLocalOrFrom mod n || 
-                      isJust (lookupType hpt (eps_PTE eps) n)) }
-\end{code}
-
-
-\begin{code}
-tcExtendRecEnv :: [(Name,TyThing)]     -- Global bindings
-              -> [(Name,TcTyThing)]    -- Local bindings
-              -> TcM r -> TcM r
--- Extend both local and global environments for the type/class knot tying game
-tcExtendRecEnv gbl_stuff lcl_stuff thing_inside
- = do { (gbl_env, lcl_env) <- getEnvs
-      ; let { ge' = extendNameEnvList (tcg_type_env gbl_env) gbl_stuff
-           ; le' = extendNameEnvList (tcl_env lcl_env)      lcl_stuff }
-      ; setEnvs (gbl_env {tcg_type_env = ge'}, lcl_env {tcl_env = le'}) 
-               thing_inside }
+tcExtendRecEnv :: [(Name,TyThing)] -> TcM r -> TcM r
+-- Extend the global environments for the type/class knot tying game
+tcExtendRecEnv gbl_stuff thing_inside
+ = updGblEnv upd thing_inside
+ where
+   upd env = env { tcg_type_env = extend (tcg_type_env env) }
+   extend env = extendNameEnvList env gbl_stuff
 \end{code}
 
 
@@ -187,6 +186,9 @@ tcExtendRecEnv gbl_stuff lcl_stuff thing_inside
 %************************************************************************
 
 \begin{code}
+tcLookupLocated :: Located Name -> TcM TcTyThing
+tcLookupLocated = addLocM tcLookup
+
 tcLookup :: Name -> TcM TcTyThing
 tcLookup name
   = getLclEnv          `thenM` \ local_env ->
@@ -195,12 +197,12 @@ tcLookup name
        Nothing    -> tcLookupGlobal name `thenM` \ thing ->
                      returnM (AGlobal thing)
 
-tcLookupTyVar :: Name -> TcM Id
+tcLookupTyVar :: Name -> TcM TcTyVar
 tcLookupTyVar name
   = tcLookup name      `thenM` \ thing -> 
     case thing of
-       ATyVar tv -> returnM tv
-       other     -> pprPanic "tcLookupTyVar" (ppr name)
+       ATyVar _ ty -> returnM (tcGetTyVar "tcLookupTyVar" ty)
+       other       -> pprPanic "tcLookupTyVar" (ppr name)
 
 tcLookupId :: Name -> TcM Id
 -- Used when we aren't interested in the binding level
@@ -237,31 +239,30 @@ getInLocalScope = getLclEnv       `thenM` \ env ->
 \end{code}
 
 \begin{code}
-tcExtendTyVarKindEnv :: [HsTyVarBndr Name] -> TcM r -> TcM r
--- The tyvars are all kinded
-tcExtendTyVarKindEnv tvs thing_inside
+tcExtendKindEnv :: [(Name, TcKind)] -> TcM r -> TcM r
+tcExtendKindEnv things thing_inside
   = updLclEnv upd thing_inside
   where
     upd lcl_env = lcl_env { tcl_env = extend (tcl_env lcl_env) }
-    extend env  = extendNameEnvList env [(n, ATyVar (mkTyVar n k)) 
-                                       | KindedTyVar n k <- tvs]
-       -- No need to extend global tyvars for kind checking
+    extend env  = extendNameEnvList env [(n, AThing k) | (n,k) <- things]
 
 tcExtendTyVarEnv :: [TyVar] -> TcM r -> TcM r
 tcExtendTyVarEnv tvs thing_inside
-  = tc_extend_tv_env [(getName tv, ATyVar tv) | tv <- tvs] tvs thing_inside
+  = tc_extend_tv_env [ATyVar tv (mkTyVarTy tv) | tv <- tvs] thing_inside
 
-tcExtendTyVarEnv2 :: [(TyVar,TcTyVar)] -> TcM r -> TcM r
-tcExtendTyVarEnv2 tv_pairs thing_inside
-  = tc_extend_tv_env [(getName tv1, ATyVar tv2) | (tv1,tv2) <- tv_pairs]
-                    [tv | (_,tv) <- tv_pairs]
-                    thing_inside
+tcExtendTyVarEnv2 :: [(TyVar,TcType)] -> TcM r -> TcM r
+tcExtendTyVarEnv2 ty_pairs thing_inside
+  = tc_extend_tv_env [ATyVar tv1 ty2 | (tv1,ty2) <- ty_pairs] thing_inside
 
-tc_extend_tv_env binds tyvars thing_inside
-  = getLclEnv     `thenM` \ env@(TcLclEnv {tcl_env = le, tcl_tyvars = gtvs}) ->
+tc_extend_tv_env binds thing_inside
+  = getLclEnv     `thenM` \ env@(TcLclEnv {tcl_env = le, 
+                                           tcl_tyvars = gtvs, 
+                                           tcl_rdr = rdr_env}) ->
     let
-       le'        = extendNameEnvList le binds
-       new_tv_set = mkVarSet tyvars
+       names      = [getName tv | ATyVar tv _ <- binds]
+       rdr_env'   = extendLocalRdrEnv rdr_env names
+       le'        = extendNameEnvList le (names `zip` binds)
+       new_tv_set = tyVarsOfTypes [ty | ATyVar _ ty <- binds]
     in
        -- It's important to add the in-scope tyvars to the global tyvar set
        -- as well.  Consider
@@ -270,26 +271,26 @@ tc_extend_tv_env binds tyvars thing_inside
        -- class and instance decls, when we mustn't generalise the class tyvars
        -- when typechecking the methods.
     tc_extend_gtvs gtvs new_tv_set             `thenM` \ gtvs' ->
-    setLclEnv (env {tcl_env = le', tcl_tyvars = gtvs'}) thing_inside
+    setLclEnv (env {tcl_env = le', tcl_tyvars = gtvs', tcl_rdr = rdr_env'}) thing_inside
 \end{code}
 
 
 \begin{code}
-tcExtendLocalValEnv :: [TcId] -> TcM a -> TcM a
-tcExtendLocalValEnv ids thing_inside
-  = getLclEnv          `thenM` \ env ->
-    let
-       extra_global_tyvars = tyVarsOfTypes [idType id | id <- ids]
-       th_lvl              = thLevel (tcl_th_ctxt env)
-       proc_lvl            = proc_level (tcl_arrow_ctxt env)
-       extra_env           = [(idName id, ATcId id th_lvl proc_lvl) | id <- ids]
-       le'                 = extendNameEnvList (tcl_env env) extra_env
-    in
-    tc_extend_gtvs (tcl_tyvars env) extra_global_tyvars        `thenM` \ gtvs' ->
-    setLclEnv (env {tcl_env = le', tcl_tyvars = gtvs'}) thing_inside
-
-tcExtendLocalValEnv2 :: [(Name,TcId)] -> TcM a -> TcM a
-tcExtendLocalValEnv2 names_w_ids thing_inside
+tcExtendIdEnv :: [TcId] -> TcM a -> TcM a
+-- Invariant: the TcIds are fully zonked. Reasons:
+--     (a) The kinds of the forall'd type variables are defaulted
+--         (see Kind.defaultKind, done in zonkQuantifiedTyVar)
+--     (b) There are no via-Indirect occurrences of the bound variables
+--         in the types, because instantiation does not look through such things
+--     (c) The call to tyVarsOfTypes is ok without looking through refs
+tcExtendIdEnv ids thing_inside = tcExtendIdEnv2 [(idName id, id) | id <- ids] thing_inside
+
+tcExtendIdEnv1 :: Name -> TcId -> TcM a -> TcM a
+tcExtendIdEnv1 name id thing_inside = tcExtendIdEnv2 [(name,id)] thing_inside
+
+tcExtendIdEnv2 :: [(Name,TcId)] -> TcM a -> TcM a
+-- Invariant: the TcIds are fully zonked (see tcExtendIdEnv above)
+tcExtendIdEnv2 names_w_ids thing_inside
   = getLclEnv          `thenM` \ env ->
     let
        extra_global_tyvars = tyVarsOfTypes [idType id | (name,id) <- names_w_ids]
@@ -297,9 +298,10 @@ tcExtendLocalValEnv2 names_w_ids thing_inside
        proc_lvl            = proc_level (tcl_arrow_ctxt env)
        extra_env           = [(name, ATcId id th_lvl proc_lvl) | (name,id) <- names_w_ids]
        le'                 = extendNameEnvList (tcl_env env) extra_env
+       rdr_env'            = extendLocalRdrEnv (tcl_rdr env) (map fst names_w_ids)
     in
     tc_extend_gtvs (tcl_tyvars env) extra_global_tyvars        `thenM` \ gtvs' ->
-    setLclEnv (env {tcl_env = le', tcl_tyvars = gtvs'}) thing_inside
+    setLclEnv (env {tcl_env = le', tcl_tyvars = gtvs', tcl_rdr = rdr_env'}) thing_inside
 \end{code}
 
 
@@ -340,8 +342,8 @@ find_thing ignore_it tidy_env (ATcId id _ _)
     in
     returnM (tidy_env', Just msg)
 
-find_thing ignore_it tidy_env (ATyVar tv)
-  = zonkTcTyVar tv             `thenM` \ tv_ty ->
+find_thing ignore_it tidy_env (ATyVar tv ty)
+  = zonkTcType ty              `thenM` \ tv_ty ->
     if ignore_it tv_ty then
        returnM (tidy_env, Nothing)
     else let
@@ -353,8 +355,7 @@ find_thing ignore_it tidy_env (ATyVar tv)
                   tv == tv' = empty
                 | otherwise = equals <+> ppr tidy_ty
                -- It's ok to use Type.getTyVar_maybe because ty is zonked by now
-       
-       bound_at = tyVarBindingInfo tv
+       bound_at = ptext SLIT("bound at:") <+> ppr (getSrcLoc tv)
     in
     returnM (tidy_env2, Just msg)
 \end{code}
@@ -394,7 +395,7 @@ tcGetGlobalTyVars
 %************************************************************************
 
 \begin{code}
-tcExtendRules :: [RuleDecl Id] -> TcM a -> TcM a
+tcExtendRules :: [LRuleDecl Id] -> TcM a -> TcM a
        -- Just pop the new rules into the EPS and envt resp
        -- All the rules come from an interface file, not soruce
        -- Nevertheless, some may be for this module, if we read
@@ -483,7 +484,7 @@ topIdLvl id | isLocalId id = topLevel
 -- Indicates the legal transitions on bracket( [| |] ).
 bracketOK :: ThStage -> Maybe ThLevel
 bracketOK (Brack _ _ _) = Nothing      -- Bracket illegal inside a bracket
-bracketOK stage         = (Just (thLevel stage + 1))
+bracketOK stage         = Just (thLevel stage + 1)
 
 -- Indicates the legal transitions on splice($).
 spliceOK :: ThStage -> Maybe ThLevel
@@ -554,14 +555,14 @@ as well as explicit user written ones.
 \begin{code}
 data InstInfo
   = InstInfo {
-      iDFunId :: DFunId,               -- The dfun id
-      iBinds  :: InstBindings
+      iDFunId :: DFunId,               -- The dfun id.  Its forall'd type variables 
+      iBinds  :: InstBindings          -- scope over the stuff in InstBindings!
     }
 
 data InstBindings
   = VanillaInst                -- The normal case
-       RenamedMonoBinds        -- Bindings
-       [RenamedSig]            -- User pragmas recorded for generating 
+       (LHsBinds Name)         -- Bindings
+       [LSig Name]             -- User pragmas recorded for generating 
                                -- specialised instances
 
   | NewTypeDerived             -- Used for deriving instances of newtypes, where the
@@ -574,7 +575,7 @@ pprInstInfo info = vcat [ptext SLIT("InstInfo:") <+> ppr (idType (iDFunId info))
 
 pprInstInfoDetails info = pprInstInfo info $$ nest 2 (details (iBinds info))
   where
-    details (VanillaInst b _)  = ppr b
+    details (VanillaInst b _)  = pprLHsBinds b
     details (NewTypeDerived _) = text "Derived from the representation type"
 
 simpleInstInfoTy :: InstInfo -> Type
@@ -595,6 +596,15 @@ simpleInstInfoTyCon inst = tcTyConAppTyCon (simpleInstInfoTy inst)
 %************************************************************************
 
 \begin{code}
-notFound wheRe name = failWithTc (text wheRe <> colon <+> quotes (ppr name) <+> 
-                                 ptext SLIT("is not in scope"))
+notFound name 
+  = failWithTc (ptext SLIT("GHC internal error:") <+> quotes (ppr name) <+> 
+               ptext SLIT("is not in scope"))
+
+wrongThingErr expected thing name
+  = failWithTc (pp_thing thing <+> quotes (ppr name) <+> 
+               ptext SLIT("used as a") <+> text expected)
+  where
+    pp_thing (AGlobal thing) = pprTyThingCategory thing
+    pp_thing (ATyVar _ _)    = ptext SLIT("Type variable")
+    pp_thing (ATcId _ _ _)   = ptext SLIT("Local identifier")
 \end{code}