module Var (
Var,
varName, varUnique,
- setVarName, setVarUnique, setVarOcc,
+ setVarName, setVarUnique,
-- TyVars
TyVar, mkTyVar, mkTcTyVar,
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# )
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}
\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)
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}
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
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}
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
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}