Add TcRnMonad.newSysLocalIds, and use it
[ghc-hetmet.git] / compiler / typecheck / TcEnv.lhs
index 19deca9..7828394 100644 (file)
@@ -38,26 +38,26 @@ module TcEnv(
        topIdLvl, 
 
        -- New Ids
-       newLocalName, newDFunName
+       newLocalName, newDFunName, newFamInstTyConName
   ) where
 
 #include "HsVersions.h"
 
 import HsSyn           ( LRuleDecl, LHsBinds, LSig, 
                          LHsTyVarBndr, HsTyVarBndr(..), pprLHsBinds,
-                         ExprCoFn(..), idCoercion, (<.>) )
+                         idCoercion, (<.>) )
 import TcIface         ( tcImportDecl )
 import IfaceEnv                ( newGlobalBinder )
 import TcRnMonad
 import TcMType         ( zonkTcType, zonkTcTyVarsAndFV )
-import TcType          ( Type, TcKind, TcTyVar, TcTyVarSet, TcType, TvSubst,
-                         substTy, substTyVar, tyVarsOfType, tcTyVarsOfTypes, mkTyConApp,
+import TcType          ( Type, TcKind, TcTyVar, TcTyVarSet, TcType, 
+                         substTy, tyVarsOfType, tcTyVarsOfTypes, mkTyConApp,
                          getDFunTyKey, tcTyConAppTyCon, tcGetTyVar, mkTyVarTy,
                          tidyOpenType, isRefineableTy
                        )
 import TcGadt          ( Refinement, refineType )
 import qualified Type  ( getTyVar_maybe )
-import Id              ( idName, isLocalId, setIdType )
+import Id              ( idName, isLocalId )
 import Var             ( TyVar, Id, idType, tyVarName )
 import VarSet
 import VarEnv
@@ -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}
@@ -565,7 +567,9 @@ data InstBindings
        [LSig Name]             -- User pragmas recorded for generating 
                                -- specialised instances
 
-  | NewTypeDerived             -- Used for deriving instances of newtypes, where the
+  | 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
@@ -576,7 +580,7 @@ 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
@@ -609,6 +613,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}
+
 
 %************************************************************************
 %*                                                                     *