Simon's big boxy-type commit
[ghc-hetmet.git] / ghc / compiler / basicTypes / Var.lhs
index 0e282c2..60fdf38 100644 (file)
@@ -7,7 +7,7 @@
 module Var (
        Var, 
        varName, varUnique, 
-       setVarName, setVarUnique, setVarOcc,
+       setVarName, setVarUnique, 
 
        -- TyVars
        TyVar, mkTyVar, mkTcTyVar,
@@ -19,26 +19,25 @@ module Var (
        Id, DictId,
        idName, idType, idUnique, idInfo, modifyIdInfo, maybeModifyIdInfo,
        setIdName, setIdUnique, setIdType, setIdInfo, lazySetIdInfo, 
-       setIdLocalExported, zapSpecPragmaId,
+       setIdExported, setIdNotExported, 
 
        globalIdDetails, globaliseId, 
 
-       mkLocalId, mkExportedLocalId, mkSpecPragmaId,
-       mkGlobalId, 
+       mkLocalId, mkExportedLocalId, mkGlobalId, 
 
        isTyVar, isTcTyVar, isId, isLocalVar, isLocalId,
-       isGlobalId, isExportedId, isSpecPragmaId,
+       isGlobalId, isExportedId, 
        mustHaveLocalBinding
     ) where
 
 #include "HsVersions.h"
 
 import {-# SOURCE #-}  TypeRep( Type )
-import {-# SOURCE #-}  TcType( TcTyVarDetails )
+import {-# SOURCE #-}  TcType( TcTyVarDetails, pprTcTyVarDetails )
 import {-# SOURCE #-}  IdInfo( GlobalIdDetails, notGlobalId, IdInfo, seqIdInfo )
 
-import Name            ( Name, OccName, NamedThing(..),
-                         setNameUnique, setNameOcc, nameUnique
+import Name            ( Name, NamedThing(..),
+                         setNameUnique, nameUnique
                        )
 import Kind            ( Kind )
 import Unique          ( Unique, Uniquable(..), mkUniqueGrimily, getKey# )
@@ -91,9 +90,7 @@ data Var
 data LocalIdDetails 
   = NotExported        -- Not exported
   | 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; 
+  -- Exported Ids are kept alive; 
   -- NotExported things may be discarded as dead code.
 \end{code}
 
@@ -114,7 +111,13 @@ After CoreTidy, top-level LocalIds are turned into GlobalIds
 
 \begin{code}
 instance Outputable Var where
-  ppr var = ppr (varName var)
+  ppr var = ppr (varName var) <+> ifPprDebug (brackets extra)
+       where
+         extra = case var of
+                       GlobalId {} -> ptext SLIT("gid")
+                       LocalId  {} -> ptext SLIT("lid")
+                       TyVar    {} -> ptext SLIT("tv")
+                       TcTyVar {tcTyVarDetails = details} -> pprTcTyVarDetails details
 
 instance Show Var where
   showsPrec p var = showsPrecSDoc p (ppr var)
@@ -150,10 +153,6 @@ setVarName :: Var -> Name -> Var
 setVarName var new_name
   = var { realUnique = getKey# (getUnique new_name), 
          varName = new_name }
-
-setVarOcc :: Var -> OccName -> Var
-setVarOcc var new_occ
-  = var { varName = setNameOcc (varName var) new_occ }
 \end{code}
 
 
@@ -215,9 +214,15 @@ 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 }
 
 globaliseId :: GlobalIdDetails -> Id -> Id
 -- If it's a local, make it global
@@ -227,11 +232,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}
 
@@ -281,16 +281,13 @@ mkLocalId name ty info = mk_local_id name ty NotExported info
 
 mkExportedLocalId :: Name -> Type -> IdInfo -> Id
 mkExportedLocalId name ty info = mk_local_id name ty Exported info
-
-mkSpecPragmaId :: Name -> Type -> IdInfo -> Id
-mkSpecPragmaId name ty info = mk_local_id name ty SpecPragma info
 \end{code}
 
 \begin{code}
-isTyVar, isTcTyVar                      :: Var -> Bool
-isId, isLocalVar, isLocalId                     :: Var -> Bool
-isGlobalId, isExportedId, isSpecPragmaId :: Var -> Bool
-mustHaveLocalBinding                    :: Var -> Bool
+isTyVar, isTcTyVar         :: Var -> Bool
+isId, isLocalVar, isLocalId :: Var -> Bool
+isGlobalId, isExportedId    :: Var -> Bool
+mustHaveLocalBinding       :: Var -> Bool
 
 isTyVar (TyVar {})   = True
 isTyVar (TcTyVar {}) = True
@@ -327,12 +324,8 @@ isExportedId (GlobalId {}) = True
 isExportedId (LocalId {lclDetails = details}) 
   = case details of
        Exported   -> True
-       SpecPragma -> True
        other      -> False
 isExportedId other = False
-
-isSpecPragmaId (LocalId {lclDetails = SpecPragma}) = True
-isSpecPragmaId other = False
 \end{code}
 
 \begin{code}