GHC.Types.Id

ghc-9.2.0.20210422: The GHC API

Safe Haskell | Safe-Inferred
Language | Haskell2010

GHC.Types.Id

Contents

- The main types
- In and Out variants
  - Simple construction
  - Taking an Id apart
  - Modifying an Id
  - Predicates on Ids
  - Join variables
  - Inline pragma stuff
  - One-shot lambdas
  - Reading `IdInfo` fields
  - Writing `IdInfo` fields

Description

GHC uses several kinds of name internally:

- `OccName`: see GHC.Types.Name.Occurrence
- `RdrName`: see GHC.Types.Name.Reader
- `Name`: see GHC.Types.Name
- `Id` represents names that not only have a `Name` but also a `Type` and some additional details (a `IdInfo` and one of LocalIdDetails or GlobalIdDetails) that are added, modified and inspected by various compiler passes. These `Var` names may either be global or local, see GHC.Types.Var
- `Var`: see GHC.Types.Var

Synopsis

- data Var
- type Id = Var
- isId :: Var -> Bool
- type InVar = Var
- type InId = Id
- type OutVar = Var
- type OutId = Id
- mkGlobalId :: IdDetails -> Name -> Type -> IdInfo -> Id
- mkVanillaGlobal :: Name -> Type -> Id
- mkVanillaGlobalWithInfo :: Name -> Type -> IdInfo -> Id
- mkLocalId :: HasDebugCallStack => Name -> Mult -> Type -> Id
- mkLocalCoVar :: Name -> Type -> CoVar
- mkLocalIdOrCoVar :: Name -> Mult -> Type -> Id
- mkLocalIdWithInfo :: HasDebugCallStack => Name -> Mult -> Type -> IdInfo -> Id
- mkExportedLocalId :: IdDetails -> Name -> Type -> Id
- mkExportedVanillaId :: Name -> Type -> Id
- mkSysLocal :: FastString -> Unique -> Mult -> Type -> Id
- mkSysLocalM :: MonadUnique m => FastString -> Mult -> Type -> m Id
- mkSysLocalOrCoVar :: FastString -> Unique -> Mult -> Type -> Id
- mkSysLocalOrCoVarM :: MonadUnique m => FastString -> Mult -> Type -> m Id
- mkUserLocal :: OccName -> Unique -> Mult -> Type -> SrcSpan -> Id
- mkUserLocalOrCoVar :: OccName -> Unique -> Mult -> Type -> SrcSpan -> Id
- mkTemplateLocals :: [Type] -> [Id]
- mkTemplateLocalsNum :: Int -> [Type] -> [Id]
- mkTemplateLocal :: Int -> Type -> Id
- mkScaledTemplateLocal :: Int -> Scaled Type -> Id
- mkWorkerId :: Unique -> Id -> Type -> Id
- idName :: Id -> Name
- idType :: Id -> Kind
- idMult :: Id -> Mult
- idScaledType :: Id -> Scaled Type
- idUnique :: Id -> Unique
- idInfo :: HasDebugCallStack => Id -> IdInfo
- idDetails :: Id -> IdDetails
- recordSelectorTyCon :: Id -> RecSelParent
- recordSelectorTyCon_maybe :: Id -> Maybe RecSelParent
- setIdName :: Id -> Name -> Id
- setIdUnique :: Id -> Unique -> Id
- setIdType :: Id -> Type -> Id
- setIdMult :: Id -> Mult -> Id
- updateIdTypeButNotMult :: (Type -> Type) -> Id -> Id
- updateIdTypeAndMult :: (Type -> Type) -> Id -> Id
- updateIdTypeAndMultM :: Monad m => (Type -> m Type) -> Id -> m Id
- setIdExported :: Id -> Id
- setIdNotExported :: Id -> Id
- globaliseId :: Id -> Id
- localiseId :: Id -> Id
- setIdInfo :: Id -> IdInfo -> Id
- lazySetIdInfo :: Id -> IdInfo -> Id
- modifyIdInfo :: HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id
- maybeModifyIdInfo :: Maybe IdInfo -> Id -> Id
- zapLamIdInfo :: Id -> Id
- zapIdDemandInfo :: Id -> Id
- zapIdUsageInfo :: Id -> Id
- zapIdUsageEnvInfo :: Id -> Id
- zapIdUsedOnceInfo :: Id -> Id
- zapIdTailCallInfo :: Id -> Id
- zapFragileIdInfo :: Id -> Id
- zapIdStrictness :: Id -> Id
- zapStableUnfolding :: Id -> Id
- transferPolyIdInfo :: Id -> [Var] -> Id -> Id
- scaleIdBy :: Mult -> Id -> Id
- scaleVarBy :: Mult -> Var -> Var
- isImplicitId :: Id -> Bool
- isDeadBinder :: Id -> Bool
- isStrictId :: Id -> Bool
- isExportedId :: Var -> Bool
- isLocalId :: Var -> Bool
- isGlobalId :: Var -> Bool
- isRecordSelector :: Id -> Bool
- isNaughtyRecordSelector :: Id -> Bool
- isPatSynRecordSelector :: Id -> Bool
- isDataConRecordSelector :: 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
- isDataConWrapId :: Id -> Bool
- isDataConWrapId_maybe :: Id -> Maybe DataCon
- isDataConId_maybe :: Id -> Maybe DataCon
- idDataCon :: Id -> DataCon
- isConLikeId :: Id -> Bool
- isDeadEndId :: Var -> Bool
- idIsFrom :: Module -> Id -> Bool
- hasNoBinding :: Id -> Bool
- type JoinId = Id
- isJoinId :: Var -> Bool
- isJoinId_maybe :: Var -> Maybe JoinArity
- idJoinArity :: JoinId -> JoinArity
- asJoinId :: Id -> JoinArity -> JoinId
- asJoinId_maybe :: Id -> Maybe JoinArity -> Id
- zapJoinId :: Id -> Id
- 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
- 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
- idFunRepArity :: Id -> RepArity
- idUnfolding :: Id -> Unfolding
- realIdUnfolding :: Id -> Unfolding
- idSpecialisation :: Id -> RuleInfo
- idCoreRules :: Id -> [CoreRule]
- idHasRules :: Id -> Bool
- idCafInfo :: Id -> CafInfo
- idLFInfo_maybe :: Id -> Maybe LambdaFormInfo
- idOneShotInfo :: Id -> OneShotInfo
- idStateHackOneShotInfo :: Id -> OneShotInfo
- idOccInfo :: Id -> OccInfo
- isNeverLevPolyId :: Id -> Bool
- setIdUnfolding :: Id -> Unfolding -> Id
- setCaseBndrEvald :: StrictnessMark -> Id -> Id
- setIdArity :: Id -> Arity -> Id
- setIdCallArity :: Id -> Arity -> Id
- setIdSpecialisation :: Id -> RuleInfo -> Id
- setIdCafInfo :: Id -> CafInfo -> Id
- setIdOccInfo :: Id -> OccInfo -> Id
- zapIdOccInfo :: Id -> Id
- setIdLFInfo :: Id -> LambdaFormInfo -> Id
- setIdDemandInfo :: Id -> Demand -> Id
- setIdStrictness :: Id -> StrictSig -> Id
- setIdCprInfo :: Id -> CprSig -> Id
- idDemandInfo :: Id -> Demand
- idStrictness :: Id -> StrictSig
- idCprInfo :: Id -> CprSig

# The main types

data Var Source #

Variable

Essentially a typed `Name`, that may also contain some additional information about the `Var` and its use sites.

#### Instances

Instances details

Data Var # |
Instance details Defined in GHC.Types.Var Methods gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Var -> c Var Source # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Var Source # toConstr :: Var -> Constr Source # dataTypeOf :: Var -> DataType Source # dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c Var) Source # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Var) Source # gmapT :: (forall b. Data b => b -> b) -> Var -> Var Source # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Var -> r Source # gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Var -> r Source # gmapQ :: (forall d. Data d => d -> u) -> Var -> [u] Source # gmapQi :: Int -> (forall d. Data d => d -> u) -> Var -> u Source # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Var -> m Var Source # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Var -> m Var Source # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Var -> m Var Source #
NamedThing Var # |
Instance details Defined in GHC.Types.Var Methods getOccName :: Var -> OccName Source # getName :: Var -> Name Source #
HasOccName Var # |
Instance details Defined in GHC.Types.Var Methods occName :: Var -> OccName Source #
Uniquable Var # |
Instance details Defined in GHC.Types.Var Methods getUnique :: Var -> Unique Source #
Outputable Var # |
Instance details Defined in GHC.Types.Var Methods ppr :: Var -> SDoc Source #
OutputableBndr Var # |
Instance details Defined in GHC.Core.Ppr Methods pprBndr :: BindingSite -> Var -> SDoc Source # pprPrefixOcc :: Var -> SDoc Source # pprInfixOcc :: Var -> SDoc Source # bndrIsJoin_maybe :: Var -> Maybe Int Source #
Eq Var # |
Instance details Defined in GHC.Types.Var Methods (==) :: Var -> Var -> Bool # (/=) :: Var -> Var -> Bool #
Ord Var # |
Instance details Defined in GHC.Types.Var Methods compare :: Var -> Var -> Ordering # (<) :: Var -> Var -> Bool # (<=) :: Var -> Var -> Bool # (>) :: Var -> Var -> Bool # (>=) :: Var -> Var -> Bool # max :: Var -> Var -> Var # min :: Var -> Var -> Var #
Eq (DeBruijn CoreAlt) # |
Instance details Defined in GHC.Core.Map.Expr Methods (==) :: DeBruijn CoreAlt -> DeBruijn CoreAlt -> Bool # (/=) :: DeBruijn CoreAlt -> DeBruijn CoreAlt -> Bool #
Eq (DeBruijn CoreExpr) # |
Instance details Defined in GHC.Core.Map.Expr Methods (==) :: DeBruijn CoreExpr -> DeBruijn CoreExpr -> Bool # (/=) :: DeBruijn CoreExpr -> DeBruijn CoreExpr -> Bool #
type Anno Id # |
Instance details Defined in GHC.Hs.Extension type Anno Id = SrcSpanAnnN
type Anno (LocatedN Id) # |
Instance details Defined in GHC.Hs.Binds type Anno (LocatedN Id) = SrcSpan
type Anno [LocatedN Id] # |
Instance details Defined in GHC.Hs.Binds type Anno [LocatedN Id] = SrcSpan

type Id = Var Source #

Identifier

isId :: Var -> Bool Source #

Is this a value-level (i.e., computationally relevant) `Var`entifier? Satisfies `isId = not . isTyVar`.

# In and Out variants

type InVar = Var Source #

type InId = Id Source #

type OutVar = Var Source #

type OutId = Id Source #

## Simple construction

mkGlobalId :: IdDetails -> Name -> Type -> IdInfo -> Id Source #

For an explanation of global vs. local `Id`s, see GHC.Types.Var.Var

mkVanillaGlobal :: Name -> Type -> Id Source #

Make a global `Id` without any extra information at all

mkVanillaGlobalWithInfo :: Name -> Type -> IdInfo -> Id Source #

Make a global `Id` with no global information but some generic `IdInfo`

mkLocalId :: HasDebugCallStack => Name -> Mult -> Type -> Id Source #

For an explanation of global vs. local `Id`s, see GHC.Types.Var

mkLocalCoVar :: Name -> Type -> CoVar Source #

Make a local CoVar

mkLocalIdOrCoVar :: Name -> Mult -> Type -> Id Source #

Like `mkLocalId`, but checks the type to see if it should make a covar

mkLocalIdWithInfo :: HasDebugCallStack => Name -> Mult -> Type -> IdInfo -> Id Source #

mkExportedLocalId :: IdDetails -> Name -> Type -> Id Source #

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]

mkExportedVanillaId :: Name -> Type -> Id Source #

mkSysLocal :: FastString -> Unique -> Mult -> Type -> Id Source #

Create a system local `Id`. These are local `Id`s (see Var) that are created by the compiler out of thin air

mkSysLocalM :: MonadUnique m => FastString -> Mult -> Type -> m Id Source #

mkSysLocalOrCoVar :: FastString -> Unique -> Mult -> Type -> Id Source #

Like `mkSysLocal`, but checks to see if we have a covar type

mkSysLocalOrCoVarM :: MonadUnique m => FastString -> Mult -> Type -> m Id Source #

mkUserLocal :: OccName -> Unique -> Mult -> Type -> SrcSpan -> Id Source #

Create a user local `Id`. These are local `Id`s (see GHC.Types.Var) with a name and location that the user might recognize

mkUserLocalOrCoVar :: OccName -> Unique -> Mult -> Type -> SrcSpan -> Id Source #

Like `mkUserLocal`, but checks if we have a coercion type

mkTemplateLocals :: [Type] -> [Id] Source #

Create a template local for a series of types

mkTemplateLocalsNum :: Int -> [Type] -> [Id] Source #

Create a template local for a series of type, but start from a specified template local

mkTemplateLocal :: Int -> Type -> Id Source #

Create a template local: a family of system local `Id`s in bijection with `Int`s, typically used in unfoldings

mkScaledTemplateLocal :: Int -> Scaled Type -> Id Source #

mkWorkerId :: Unique -> Id -> Type -> Id Source #

Workers get local names. CoreTidy will externalise these if necessary

## Taking an Id apart

idName :: Id -> Name Source #

idType :: Id -> Kind Source #

idMult :: Id -> Mult Source #

idScaledType :: Id -> Scaled Type Source #

idUnique :: Id -> Unique Source #

idInfo :: HasDebugCallStack => Id -> IdInfo Source #

idDetails :: Id -> IdDetails Source #

recordSelectorTyCon :: Id -> RecSelParent Source #

If the `Id` is that for a record selector, extract the `sel_tycon`. Panic otherwise.

recordSelectorTyCon_maybe :: Id -> Maybe RecSelParent Source #

## Modifying an Id

setIdName :: Id -> Name -> Id Source #

setIdUnique :: Id -> Unique -> Id Source #

setIdType :: Id -> Type -> Id Source #

Not only does this set the `Id` `Type`, it also evaluates the type to try and reduce space usage

setIdMult :: Id -> Mult -> Id Source #

updateIdTypeButNotMult :: (Type -> Type) -> Id -> Id Source #

updateIdTypeAndMult :: (Type -> Type) -> Id -> Id Source #

updateIdTypeAndMultM :: Monad m => (Type -> m Type) -> Id -> m Id Source #

setIdExported :: Id -> Id Source #

setIdNotExported :: Id -> Id Source #

globaliseId :: Id -> Id Source #

If it's a local, make it global

localiseId :: Id -> Id Source #

setIdInfo :: Id -> IdInfo -> Id Source #

lazySetIdInfo :: Id -> IdInfo -> Id Source #

modifyIdInfo :: HasDebugCallStack => (IdInfo -> IdInfo) -> Id -> Id Source #

maybeModifyIdInfo :: Maybe IdInfo -> Id -> Id Source #

zapLamIdInfo :: Id -> Id Source #

zapIdDemandInfo :: Id -> Id Source #

zapIdUsageInfo :: Id -> Id Source #

zapIdUsageEnvInfo :: Id -> Id Source #

zapIdUsedOnceInfo :: Id -> Id Source #

zapIdTailCallInfo :: Id -> Id Source #

zapFragileIdInfo :: Id -> Id Source #

zapIdStrictness :: Id -> Id Source #

zapStableUnfolding :: Id -> Id Source #

transferPolyIdInfo :: Id -> [Var] -> Id -> Id Source #

scaleIdBy :: Mult -> Id -> Id Source #

scaleVarBy :: Mult -> Var -> Var Source #

Like `scaleIdBy`, but skips non-Ids. Useful for scaling a mixed list of ids and tyvars.

## Predicates on Ids

isImplicitId :: Id -> Bool Source #

`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 Source #

isStrictId :: Id -> Bool Source #

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 Source #

`isExportedIdVar` means "don't throw this away"

isLocalId :: Var -> Bool Source #

isGlobalId :: Var -> Bool Source #

isRecordSelector :: Id -> Bool Source #

isNaughtyRecordSelector :: Id -> Bool Source #

isPatSynRecordSelector :: Id -> Bool Source #

isDataConRecordSelector :: Id -> Bool Source #

isClassOpId_maybe :: Id -> Maybe Class Source #

isDFunId :: Id -> Bool Source #

isPrimOpId :: Id -> Bool Source #

isPrimOpId_maybe :: Id -> Maybe PrimOp Source #

isFCallId :: Id -> Bool Source #

isFCallId_maybe :: Id -> Maybe ForeignCall Source #

isDataConWorkId :: Id -> Bool Source #

isDataConWorkId_maybe :: Id -> Maybe DataCon Source #

isDataConWrapId :: Id -> Bool Source #

isDataConWrapId_maybe :: Id -> Maybe DataCon Source #

isDataConId_maybe :: Id -> Maybe DataCon Source #

idDataCon :: Id -> DataCon Source #

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 Source #

isDeadEndId :: Var -> Bool Source #

Returns true if an application to n args diverges or throws an exception See Note [Dead ends] in GHC.Types.Demand.

idIsFrom :: Module -> Id -> Bool Source #

hasNoBinding :: Id -> Bool Source #

Returns `True` of an `Id` which may not have a binding, even though it is defined in this module.

## Join variables

type JoinId = Id Source #

isJoinId :: Var -> Bool Source #

isJoinId_maybe :: Var -> Maybe JoinArity Source #

idJoinArity :: JoinId -> JoinArity Source #

asJoinId :: Id -> JoinArity -> JoinId infixl 1 Source #

asJoinId_maybe :: Id -> Maybe JoinArity -> Id infixl 1 Source #

zapJoinId :: Id -> Id Source #

## Inline pragma stuff

idInlinePragma :: Id -> InlinePragma Source #

setInlinePragma :: Id -> InlinePragma -> Id infixl 1 Source #

modifyInlinePragma :: Id -> (InlinePragma -> InlinePragma) -> Id Source #

idInlineActivation :: Id -> Activation Source #

setInlineActivation :: Id -> Activation -> Id infixl 1 Source #

idRuleMatchInfo :: Id -> RuleMatchInfo Source #

## One-shot lambdas

isOneShotBndr :: Var -> Bool Source #

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 See Note [The state-transformer hack] in GHC.Core.Opt.Arity

isProbablyOneShotLambda :: Id -> Bool Source #

setOneShotLambda :: Id -> Id Source #

clearOneShotLambda :: Id -> Id Source #

updOneShotInfo :: Id -> OneShotInfo -> Id Source #

setIdOneShotInfo :: Id -> OneShotInfo -> Id infixl 1 Source #

isStateHackType :: Type -> Bool Source #

stateHackOneShot :: OneShotInfo Source #

Should we apply the state hack to values of this `Type`?

typeOneShot :: Type -> OneShotInfo Source #

## Reading `IdInfo` fields

idArity :: Id -> Arity Source #

idCallArity :: Id -> Arity Source #

idFunRepArity :: Id -> RepArity Source #

idUnfolding :: Id -> Unfolding Source #

realIdUnfolding :: Id -> Unfolding Source #

idSpecialisation :: Id -> RuleInfo Source #

idCoreRules :: Id -> [CoreRule] Source #

idHasRules :: Id -> Bool Source #

idCafInfo :: Id -> CafInfo infixl 1 Source #

idLFInfo_maybe :: Id -> Maybe LambdaFormInfo Source #

idOneShotInfo :: Id -> OneShotInfo Source #

idStateHackOneShotInfo :: Id -> OneShotInfo Source #

Like `idOneShotInfo`, but taking the Horrible State Hack in to account See Note [The state-transformer hack] in GHC.Core.Opt.Arity

idOccInfo :: Id -> OccInfo Source #

isNeverLevPolyId :: Id -> Bool Source #

## Writing `IdInfo` fields

setIdUnfolding :: Id -> Unfolding -> Id infixl 1 Source #

setCaseBndrEvald :: StrictnessMark -> Id -> Id Source #

setIdArity :: Id -> Arity -> Id infixl 1 Source #

setIdCallArity :: Id -> Arity -> Id infixl 1 Source #

setIdSpecialisation :: Id -> RuleInfo -> Id infixl 1 Source #

setIdCafInfo :: Id -> CafInfo -> Id Source #

setIdOccInfo :: Id -> OccInfo -> Id infixl 1 Source #

zapIdOccInfo :: Id -> Id Source #

setIdLFInfo :: Id -> LambdaFormInfo -> Id Source #

setIdDemandInfo :: Id -> Demand -> Id infixl 1 Source #

setIdStrictness :: Id -> StrictSig -> Id infixl 1 Source #

setIdCprInfo :: Id -> CprSig -> Id infixl 1 Source #

idDemandInfo :: Id -> Demand Source #

idStrictness :: Id -> StrictSig Source #

Accesses the `Id'`s `strictnessInfo`.

idCprInfo :: Id -> CprSig Source #