Safe Haskell | None |
---|---|
Language | Haskell2010 |
Id
Contents
Description
GHC uses several kinds of name internally:
OccName
: see OccNameRdrName
: see RdrNameName
: see NameId
represents names that not only have aName
but also aType
and some additional details (aIdInfo
and one ofLocalIdDetails
orGlobalIdDetails
) that are added, modified and inspected by various compiler passes. TheseVar
names may either be global or local, see VarVar
: see Var
- data Var
- type Id = Var
- isId :: Var -> Bool
- mkGlobalId :: IdDetails -> Name -> Type -> IdInfo -> Id
- mkVanillaGlobal :: Name -> Type -> Id
- mkVanillaGlobalWithInfo :: Name -> Type -> IdInfo -> Id
- mkLocalId :: Name -> Type -> Id
- mkLocalIdWithInfo :: Name -> Type -> IdInfo -> Id
- mkExportedLocalId :: IdDetails -> Name -> Type -> Id
- mkSysLocal :: FastString -> Unique -> Type -> Id
- mkSysLocalM :: MonadUnique m => FastString -> Type -> m Id
- mkUserLocal :: OccName -> Unique -> Type -> SrcSpan -> Id
- mkUserLocalM :: MonadUnique m => OccName -> Type -> SrcSpan -> m Id
- mkDerivedLocalM :: MonadUnique m => (OccName -> OccName) -> Id -> Type -> m Id
- mkTemplateLocals :: [Type] -> [Id]
- mkTemplateLocalsNum :: Int -> [Type] -> [Id]
- mkTemplateLocal :: Int -> Type -> Id
- mkWorkerId :: Unique -> Id -> Type -> Id
- mkWiredInIdName :: Module -> FastString -> Unique -> Id -> Name
- idName :: Id -> Name
- idType :: Id -> Kind
- idUnique :: Id -> Unique
- idInfo :: Id -> IdInfo
- idDetails :: Id -> IdDetails
- idRepArity :: Id -> RepArity
- recordSelectorFieldLabel :: Id -> (TyCon, FieldLabel)
- setIdName :: Id -> Name -> Id
- setIdUnique :: Id -> Unique -> Id
- setIdType :: Id -> Type -> Id
- setIdExported :: Id -> Id
- setIdNotExported :: Id -> Id
- globaliseId :: Id -> Id
- localiseId :: Id -> Id
- setIdInfo :: Id -> IdInfo -> Id
- lazySetIdInfo :: Id -> IdInfo -> Id
- modifyIdInfo :: (IdInfo -> IdInfo) -> Id -> Id
- maybeModifyIdInfo :: Maybe IdInfo -> Id -> Id
- zapLamIdInfo :: Id -> Id
- zapIdDemandInfo :: Id -> Id
- zapIdUsageInfo :: Id -> Id
- zapFragileIdInfo :: Id -> Id
- zapIdStrictness :: Id -> Id
- transferPolyIdInfo :: Id -> [Var] -> Id -> Id
- isImplicitId :: Id -> Bool
- isDeadBinder :: Id -> Bool
- isStrictId :: Id -> Bool
- isExportedId :: Var -> Bool
- isLocalId :: Var -> Bool
- isGlobalId :: Var -> Bool
- isRecordSelector :: Id -> Bool
- isNaughtyRecordSelector :: Id -> Bool
- isClassOpId_maybe :: Id -> Maybe Class
- isDFunId :: Id -> Bool
- isPrimOpId :: Id -> Bool
- isPrimOpId_maybe :: Id -> Maybe PrimOp
- isFCallId :: Id -> Bool
- isFCallId_maybe :: Id -> Maybe ForeignCall
- isDataConWorkId :: Id -> Bool
- isDataConWorkId_maybe :: Id -> Maybe DataCon
- isDataConId_maybe :: Id -> Maybe DataCon
- idDataCon :: Id -> DataCon
- isConLikeId :: Id -> Bool
- isBottomingId :: Id -> Bool
- idIsFrom :: Module -> Id -> Bool
- hasNoBinding :: Id -> Bool
- type DictId = EvId
- isDictId :: Id -> Bool
- dfunNSilent :: Id -> Int
- isEvVar :: Var -> Bool
- idInlinePragma :: Id -> InlinePragma
- setInlinePragma :: Id -> InlinePragma -> Id
- modifyInlinePragma :: Id -> (InlinePragma -> InlinePragma) -> Id
- idInlineActivation :: Id -> Activation
- setInlineActivation :: Id -> Activation -> Id
- idRuleMatchInfo :: Id -> RuleMatchInfo
- isOneShotBndr :: Var -> Bool
- isOneShotLambda :: Id -> Bool
- isProbablyOneShotLambda :: Id -> Bool
- setOneShotLambda :: Id -> Id
- clearOneShotLambda :: Id -> Id
- updOneShotInfo :: Id -> OneShotInfo -> Id
- setIdOneShotInfo :: Id -> OneShotInfo -> Id
- isStateHackType :: Type -> Bool
- stateHackOneShot :: OneShotInfo
- typeOneShot :: Type -> OneShotInfo
- idArity :: Id -> Arity
- idCallArity :: Id -> Arity
- idUnfolding :: Id -> Unfolding
- realIdUnfolding :: Id -> Unfolding
- idSpecialisation :: Id -> SpecInfo
- idCoreRules :: Id -> [CoreRule]
- idHasRules :: Id -> Bool
- idCafInfo :: Id -> CafInfo
- idOneShotInfo :: Id -> OneShotInfo
- idOccInfo :: Id -> OccInfo
- setIdUnfoldingLazily :: Id -> Unfolding -> Id
- setIdUnfolding :: Id -> Unfolding -> Id
- setIdArity :: Id -> Arity -> Id
- setIdCallArity :: Id -> Arity -> Id
- setIdSpecialisation :: Id -> SpecInfo -> Id
- setIdCafInfo :: Id -> CafInfo -> Id
- setIdOccInfo :: Id -> OccInfo -> Id
- zapIdOccInfo :: Id -> Id
- setIdDemandInfo :: Id -> Demand -> Id
- setIdStrictness :: Id -> StrictSig -> Id
- idDemandInfo :: Id -> Demand
- idStrictness :: Id -> StrictSig
The main types
data Var
Simple construction
mkVanillaGlobal :: Name -> Type -> Id
Make a global Id
without any extra information at all
mkVanillaGlobalWithInfo :: Name -> Type -> IdInfo -> Id
mkLocalIdWithInfo :: Name -> Type -> IdInfo -> Id
mkExportedLocalId :: IdDetails -> Name -> Type -> Id
Create a local Id
that is marked as exported.
This prevents things attached to it from being removed as dead code.
See Note [Exported LocalIds]
mkSysLocal :: FastString -> Unique -> Type -> Id
mkSysLocalM :: MonadUnique m => FastString -> Type -> m Id
mkUserLocalM :: MonadUnique m => OccName -> Type -> SrcSpan -> m Id
mkDerivedLocalM :: MonadUnique m => (OccName -> OccName) -> Id -> Type -> m Id
mkTemplateLocals :: [Type] -> [Id]
Create a template local for a series of types
mkTemplateLocalsNum :: Int -> [Type] -> [Id]
Create a template local for a series of type, but start from a specified template local
mkTemplateLocal :: Int -> Type -> Id
Create a template local: a family of system local Id
s in bijection with Int
s, typically used in unfoldings
mkWorkerId :: Unique -> Id -> Type -> Id
Workers get local names. CoreTidy will externalise these if necessary
mkWiredInIdName :: Module -> FastString -> Unique -> Id -> Name
Taking an Id apart
idRepArity :: Id -> RepArity
recordSelectorFieldLabel :: Id -> (TyCon, FieldLabel)
Modifying an Id
setIdUnique :: Id -> Unique -> Id
setIdExported :: Id -> Id
setIdNotExported :: Id -> Id
globaliseId :: Id -> Id
If it's a local, make it global
localiseId :: Id -> Id
lazySetIdInfo :: Id -> IdInfo -> Id
modifyIdInfo :: (IdInfo -> IdInfo) -> Id -> Id
maybeModifyIdInfo :: Maybe IdInfo -> Id -> Id
zapLamIdInfo :: Id -> Id
zapIdDemandInfo :: Id -> Id
zapIdUsageInfo :: Id -> Id
zapFragileIdInfo :: Id -> Id
zapIdStrictness :: Id -> Id
transferPolyIdInfo :: Id -> [Var] -> Id -> Id
Predicates on Ids
isImplicitId :: Id -> Bool
isImplicitId
tells whether an Id
s info is implied by other
declarations, so we don't need to put its signature in an interface
file, even if it's mentioned in some other interface unfolding.
isDeadBinder :: Id -> Bool
isStrictId :: Id -> Bool
This predicate says whether the Id
has a strict demand placed on it or
has a type such that it can always be evaluated strictly (i.e an
unlifted type, as of GHC 7.6). We need to
check separately whether the Id
has a so-called "strict type" because if
the demand for the given id
hasn't been computed yet but id
has a strict
type, we still want isStrictId id
to be True
.
isExportedId :: Var -> Bool
isExportedIdVar
means "don't throw this away"
isGlobalId :: Var -> Bool
isRecordSelector :: Id -> Bool
isNaughtyRecordSelector :: Id -> Bool
isClassOpId_maybe :: Id -> Maybe Class
isPrimOpId :: Id -> Bool
isPrimOpId_maybe :: Id -> Maybe PrimOp
isFCallId_maybe :: Id -> Maybe ForeignCall
isDataConWorkId :: Id -> Bool
isDataConWorkId_maybe :: Id -> Maybe DataCon
isDataConId_maybe :: Id -> Maybe DataCon
Get from either the worker or the wrapper Id
to the DataCon
. Currently used only in the desugarer.
INVARIANT: idDataCon (dataConWrapId d) = d
: remember, dataConWrapId
can return either the wrapper or the worker
isConLikeId :: Id -> Bool
isBottomingId :: Id -> Bool
Returns true if an application to n args would diverge
hasNoBinding :: Id -> Bool
Returns True
of an Id
which may not have a
binding, even though it is defined in this module.
Evidence variables
dfunNSilent :: Id -> Int
Inline pragma stuff
idInlinePragma :: Id -> InlinePragma
setInlinePragma :: Id -> InlinePragma -> Id infixl 1
modifyInlinePragma :: Id -> (InlinePragma -> InlinePragma) -> Id
idInlineActivation :: Id -> Activation
setInlineActivation :: Id -> Activation -> Id infixl 1
idRuleMatchInfo :: Id -> RuleMatchInfo
One-shot lambdas
isOneShotBndr :: Var -> Bool
Returns whether the lambda associated with the Id
is certainly applied at most once
This one is the "business end", called externally.
It works on type variables as well as Ids, returning True
Its main purpose is to encapsulate the Horrible State Hack
isOneShotLambda :: Id -> Bool
Returns whether the lambda associated with the Id
is certainly applied at most once.
You probably want to use isOneShotBndr
instead
isProbablyOneShotLambda :: Id -> Bool
setOneShotLambda :: Id -> Id
clearOneShotLambda :: Id -> Id
updOneShotInfo :: Id -> OneShotInfo -> Id
setIdOneShotInfo :: Id -> OneShotInfo -> Id infixl 1
isStateHackType :: Type -> Bool
stateHackOneShot :: OneShotInfo
Should we apply the state hack to values of this Type
?
typeOneShot :: Type -> OneShotInfo
Reading IdInfo
fields
idCallArity :: Id -> Arity
idUnfolding :: Id -> Unfolding
realIdUnfolding :: Id -> Unfolding
idSpecialisation :: Id -> SpecInfo
idCoreRules :: Id -> [CoreRule]
idHasRules :: Id -> Bool
idOneShotInfo :: Id -> OneShotInfo
Writing IdInfo
fields
setIdUnfoldingLazily :: Id -> Unfolding -> Id infixl 1
setIdUnfolding :: Id -> Unfolding -> Id infixl 1
setIdArity :: Id -> Arity -> Id infixl 1
setIdCallArity :: Id -> Arity -> Id infixl 1
setIdSpecialisation :: Id -> SpecInfo -> Id infixl 1
setIdCafInfo :: Id -> CafInfo -> Id
setIdOccInfo :: Id -> OccInfo -> Id infixl 1
zapIdOccInfo :: Id -> Id
setIdDemandInfo :: Id -> Demand -> Id infixl 1
setIdStrictness :: Id -> StrictSig -> Id infixl 1
idDemandInfo :: Id -> Demand
idStrictness :: Id -> StrictSig