Global renamings in HsSyn
[ghc-hetmet.git] / compiler / typecheck / TcEnv.lhs
index 1d093e2..6799653 100644 (file)
@@ -38,20 +38,20 @@ module TcEnv(
        topIdLvl, 
 
        -- New Ids
-       newLocalName, newDFunName
+       newLocalName, newDFunName, newFamInstTyConName
   ) where
 
 #include "HsVersions.h"
 
 import HsSyn           ( LRuleDecl, LHsBinds, LSig, 
                          LHsTyVarBndr, HsTyVarBndr(..), pprLHsBinds,
-                         idCoercion, (<.>) )
+                         idHsWrapper, (<.>) )
 import TcIface         ( tcImportDecl )
 import IfaceEnv                ( newGlobalBinder )
 import TcRnMonad
 import TcMType         ( zonkTcType, zonkTcTyVarsAndFV )
-import TcType          ( Type, TcKind, TcTyVar, TcTyVarSet, TcType, 
-                         substTy, tyVarsOfType, tcTyVarsOfTypes, mkTyConApp,
+import TcType          ( Type, TcKind, TcTyVar, TcTyVarSet, TcType, PredType,
+                         tyVarsOfType, tcTyVarsOfTypes, mkTyConApp,
                          getDFunTyKey, tcTyConAppTyCon, tcGetTyVar, mkTyVarTy,
                          tidyOpenType, isRefineableTy
                        )
@@ -66,11 +66,13 @@ import InstEnv              ( Instance, DFunId, instanceDFunId, instanceHead )
 import DataCon         ( DataCon )
 import TyCon           ( TyCon )
 import Class           ( Class )
-import Name            ( Name, NamedThing(..), getSrcLoc, nameModule )
+import Name            ( Name, NamedThing(..), getSrcLoc, nameModule,
+                         nameOccName )
 import PrelNames       ( thFAKE )
 import NameEnv
-import OccName         ( mkDFunOcc, occNameString )
-import HscTypes                ( extendTypeEnvList, lookupType, TyThing(..), ExternalPackageState(..) )
+import OccName         ( mkDFunOcc, occNameString, mkInstTyTcOcc )
+import HscTypes                ( extendTypeEnvList, lookupType, TyThing(..),
+                         ExternalPackageState(..) )
 import SrcLoc          ( SrcLoc, Located(..) )
 import Outputable
 \end{code}
@@ -324,7 +326,7 @@ tcExtendIdEnv2 names_w_ids thing_inside
                                               tct_level = th_lvl,
                                               tct_type = id_ty, 
                                               tct_co = if isRefineableTy id_ty 
-                                                       then Just idCoercion
+                                                       then Just idHsWrapper
                                                        else Nothing })
                              | (name,id) <- names_w_ids, let id_ty = idType id]
        le'                 = extendNameEnvList (tcl_env env) extra_env
@@ -360,7 +362,7 @@ findGlobals tvs tidy_env
          Just d  -> go tidy_env1 (d:acc) things
          Nothing -> go tidy_env1 acc     things
 
-    ignore_it ty = not (tvs `intersectsVarSet` tyVarsOfType ty)
+    ignore_it ty = tvs `disjointVarSet` tyVarsOfType ty
 
 -----------------------
 find_thing ignore_it tidy_env (ATcId { tct_id = id })
@@ -565,20 +567,26 @@ data InstBindings
        [LSig Name]             -- User pragmas recorded for generating 
                                -- specialised instances
 
-  | NewTypeDerived             
-        TyCon                   -- tycon for the newtype
-                                -- Used for deriving instances of newtypes, where the
-       [Type]                  -- witness dictionary is identical to the argument 
-                               -- dictionary.  Hence no bindings, no pragmas
-       -- The [Type] are the representation types
-       -- See notes in TcDeriv
+  | NewTypeDerived              -- Used for deriving instances of newtypes, where the
+                               -- witness dictionary is identical to the argument 
+                               -- dictionary.  Hence no bindings, no pragmas.
+       (Maybe [PredType])
+               -- Nothing      => The newtype-derived instance involves type variables,
+               --                 and the dfun has a type like df :: forall a. Eq a => Eq (T a)
+               -- Just (r:scs) => The newtype-defined instance has no type variables
+               --                 so the dfun is just a constant, df :: Eq T
+               --                 In this case we need to know waht the rep dict, r, and the 
+               --                 superclasses, scs, are.  (In the Nothing case these are in the
+               --                 dict fun's type.)
+               --                 Invariant: these PredTypes have no free variables
+               -- NB: In both cases, the representation dict is the *first* dict.
 
 pprInstInfo info = vcat [ptext SLIT("InstInfo:") <+> ppr (idType (iDFunId info))]
 
 pprInstInfoDetails info = pprInstInfo info $$ nest 2 (details (iBinds info))
   where
     details (VanillaInst b _)  = pprLHsBinds b
-    details (NewTypeDerived _  _) = text "Derived from the representation type"
+    details (NewTypeDerived _) = text "Derived from the representation type"
 
 simpleInstInfoClsTy :: InstInfo -> (Class, Type)
 simpleInstInfoClsTy info = case instanceHead (iSpec info) of
@@ -611,6 +619,19 @@ newDFunName clas (ty:_) loc
 newDFunName clas [] loc = pprPanic "newDFunName" (ppr clas <+> ppr loc)
 \end{code}
 
+Make a name for the representation tycon of a data/newtype instance.  It's an
+*external* name, like otber top-level names, and hence must be made with
+newGlobalBinder.
+
+\begin{code}
+newFamInstTyConName :: Name -> SrcLoc -> TcM Name
+newFamInstTyConName tc_name loc
+  = do { index <- nextDFunIndex
+       ; mod   <- getModule
+       ; let occ = nameOccName tc_name
+       ; newGlobalBinder mod (mkInstTyTcOcc index occ) Nothing loc }
+\end{code}
+
 
 %************************************************************************
 %*                                                                     *