ghc-7.0.1: The GHC API




GHC uses several kinds of name internally:

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


The main types

type Id = VarSource

Simple construction

mkGlobalId :: IdDetails -> Name -> Type -> IdInfo -> IdSource

For an explanation of global vs. local Ids, see Var

mkVanillaGlobal :: Name -> Type -> IdSource

Make a global Id without any extra information at all

mkVanillaGlobalWithInfo :: Name -> Type -> IdInfo -> IdSource

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

mkLocalId :: Name -> Type -> IdSource

For an explanation of global vs. local Ids, see Var

mkExportedLocalId :: Name -> Type -> IdSource

Create a local Id that is marked as exported. This prevents things attached to it from being removed as dead code.

mkSysLocal :: FastString -> Unique -> Type -> IdSource

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

mkUserLocal :: OccName -> Unique -> Type -> SrcSpan -> IdSource

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

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 -> IdSource

Create a template local: a family of system local Ids in bijection with Ints, typically used in unfoldings

mkWorkerId :: Unique -> Id -> Type -> IdSource

Workers get local names. CoreTidy will externalise these if necessary

Taking an Id apart

recordSelectorFieldLabel :: Id -> (TyCon, FieldLabel)Source

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

Modifying an Id

setIdType :: Id -> Type -> IdSource

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

globaliseId :: Id -> IdSource

If it's a local, make it global

Predicates on Ids

isImplicitId :: Id -> BoolSource

isImplicitId tells whether an Ids 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.

isStrictId :: Id -> BoolSource

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 (e.g., an unlifted type, but see the comment for isStrictType). 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 -> BoolSource

isExportedIdVar means "don't throw this away"

idDataCon :: Id -> DataConSource

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

isBottomingId :: Id -> BoolSource

Returns true if an application to n args would diverge

hasNoBinding :: Id -> BoolSource

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

Inline pragma stuff

One-shot lambdas

isOneShotBndr :: Id -> BoolSource

Returns whether the lambda associated with the Id is certainly applied at most once OR we are applying the "state hack" which makes it appear as if theis is the case for lambdas used in IO. You should prefer using this over isOneShotLambda

isOneShotLambda :: Id -> BoolSource

Returns whether the lambda associated with the Id is certainly applied at most once. You probably want to use isOneShotBndr instead

isStateHackType :: Type -> BoolSource

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

Reading IdInfo fields

Writing IdInfo fields