[project @ 2005-03-04 19:19:56 by sof]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Var.lhs
index 350986e..c3f626e 100644 (file)
@@ -13,13 +13,13 @@ module Var (
        TyVar, mkTyVar, mkTcTyVar,
        tyVarName, tyVarKind,
        setTyVarName, setTyVarUnique,
-       tcTyVarRef, tcTyVarDetails,
+       tcTyVarDetails,
 
        -- Ids
        Id, DictId,
        idName, idType, idUnique, idInfo, modifyIdInfo, maybeModifyIdInfo,
        setIdName, setIdUnique, setIdType, setIdInfo, lazySetIdInfo, 
-       setIdLocalExported, zapSpecPragmaId,
+       setIdExported, setIdNotExported, zapSpecPragmaId,
 
        globalIdDetails, globaliseId, 
 
@@ -34,9 +34,8 @@ module Var (
 #include "HsVersions.h"
 
 import {-# SOURCE #-}  TypeRep( Type )
-import {-# SOURCE #-}  TcType( TyVarDetails )
-import {-# SOURCE #-}  IdInfo( GlobalIdDetails, notGlobalId,
-                               IdInfo, seqIdInfo )
+import {-# SOURCE #-}  TcType( TcTyVarDetails )
+import {-# SOURCE #-}  IdInfo( GlobalIdDetails, notGlobalId, IdInfo, seqIdInfo )
 
 import Name            ( Name, OccName, NamedThing(..),
                          setNameUnique, setNameOcc, nameUnique
@@ -45,7 +44,6 @@ import Kind           ( Kind )
 import Unique          ( Unique, Uniquable(..), mkUniqueGrimily, getKey# )
 import FastTypes
 import Outputable
-import DATA_IOREF
 \end{code}
 
 
@@ -71,11 +69,10 @@ data Var
        tyVarKind :: Kind }
 
   | TcTyVar {                          -- Used only during type inference
-       varName        :: !Name,        -- Could we get away without a Name?
+       varName        :: !Name,
        realUnique     :: FastInt,
        tyVarKind      :: Kind,
-       tcTyVarRef     :: IORef (Maybe Type),
-       tcTyVarDetails :: TyVarDetails }
+       tcTyVarDetails :: TcTyVarDetails }
 
   | GlobalId {                         -- Used for imported Ids, dict selectors etc
        varName    :: !Name,
@@ -96,6 +93,8 @@ data LocalIdDetails
   | Exported   -- Exported
   | SpecPragma -- Not exported, but not to be discarded either
                -- It's unclean that this is so deeply built in
+  -- Exported and SpecPragma Ids are kept alive; 
+  -- NotExported things may be discarded as dead code.
 \end{code}
 
 LocalId and GlobalId
@@ -180,12 +179,11 @@ mkTyVar name kind = TyVar { varName    = name
                          , tyVarKind  = kind
                        }
 
-mkTcTyVar :: Name -> Kind -> TyVarDetails -> IORef (Maybe Type) -> TyVar
-mkTcTyVar name kind details ref
+mkTcTyVar :: Name -> Kind -> TcTyVarDetails -> TyVar
+mkTcTyVar name kind details
   = TcTyVar {  varName    = name,
                realUnique = getKey# (nameUnique name),
                tyVarKind  = kind,
-               tcTyVarRef = ref,
                tcTyVarDetails = details
        }
 \end{code}
@@ -217,9 +215,20 @@ setIdName = setVarName
 setIdType :: Id -> Type -> Id
 setIdType id ty = id {idType = ty}
 
-setIdLocalExported :: Id -> Id
--- It had better be a LocalId already
-setIdLocalExported id = id { lclDetails = Exported }
+setIdExported :: Id -> Id
+-- Can be called on GlobalIds, such as data cons and class ops,
+-- which are "born" as GlobalIds and automatically exported
+setIdExported id@(LocalId {}) = id { lclDetails = Exported }
+setIdExported other_id       = ASSERT( isId other_id ) other_id
+
+setIdNotExported :: Id -> Id
+-- We can only do this to LocalIds
+setIdNotExported id = ASSERT( isLocalId id ) id { lclDetails = NotExported }
+
+zapSpecPragmaId :: Id -> Id
+zapSpecPragmaId id
+  | isSpecPragmaId id = id {lclDetails = NotExported}
+  | otherwise         = id
 
 globaliseId :: GlobalIdDetails -> Id -> Id
 -- If it's a local, make it global
@@ -229,11 +238,6 @@ globaliseId details id = GlobalId { varName    = varName id,
                                    idInfo     = idInfo id,
                                    gblDetails = details }
 
-zapSpecPragmaId :: Id -> Id
-zapSpecPragmaId id
-  | isSpecPragmaId id = id {lclDetails = NotExported}
-  | otherwise         = id
-
 lazySetIdInfo :: Id -> IdInfo -> Id
 lazySetIdInfo id info = id {idInfo = info}