2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section{@Vars@: Variables}
10 setVarName, setVarUnique, setVarOcc,
13 TyVar, mkTyVar, mkTcTyVar,
15 setTyVarName, setTyVarUnique,
20 idName, idType, idUnique, idInfo, modifyIdInfo, maybeModifyIdInfo,
21 setIdName, setIdUnique, setIdType, setIdInfo, lazySetIdInfo,
22 setIdExported, setIdNotExported, zapSpecPragmaId,
24 globalIdDetails, globaliseId,
26 mkLocalId, mkExportedLocalId, mkSpecPragmaId,
29 isTyVar, isTcTyVar, isId, isLocalVar, isLocalId,
30 isGlobalId, isExportedId, isSpecPragmaId,
34 #include "HsVersions.h"
36 import {-# SOURCE #-} TypeRep( Type )
37 import {-# SOURCE #-} TcType( TcTyVarDetails )
38 import {-# SOURCE #-} IdInfo( GlobalIdDetails, notGlobalId, IdInfo, seqIdInfo )
40 import Name ( Name, OccName, NamedThing(..),
41 setNameUnique, setNameOcc, nameUnique
44 import Unique ( Unique, Uniquable(..), mkUniqueGrimily, getKey# )
50 %************************************************************************
52 \subsection{The main data type declarations}
54 %************************************************************************
57 Every @Var@ has a @Unique@, to uniquify it and for fast comparison, a
58 @Type@, and an @IdInfo@ (non-essential info about it, e.g.,
59 strictness). The essential info about different kinds of @Vars@ is
66 realUnique :: FastInt, -- Key for fast comparison
67 -- Identical to the Unique in the name,
68 -- cached here for speed
71 | TcTyVar { -- Used only during type inference
73 realUnique :: FastInt,
75 tcTyVarDetails :: TcTyVarDetails }
77 | GlobalId { -- Used for imported Ids, dict selectors etc
79 realUnique :: FastInt,
82 gblDetails :: GlobalIdDetails }
84 | LocalId { -- Used for locally-defined Ids (see NOTE below)
86 realUnique :: FastInt,
89 lclDetails :: LocalIdDetails }
92 = NotExported -- Not exported
93 | Exported -- Exported
94 | SpecPragma -- Not exported, but not to be discarded either
95 -- It's unclean that this is so deeply built in
96 -- Exported and SpecPragma Ids are kept alive;
97 -- NotExported things may be discarded as dead code.
103 * always a constant (top-level)
104 * imported, or data constructor, or primop, or record selector
105 * has a Unique that is globally unique across the whole
106 GHC invocation (a single invocation may compile multiple modules)
109 * bound within an expression (lambda, case, local let(rec))
110 * or defined at top level in the module being compiled
112 After CoreTidy, top-level LocalIds are turned into GlobalIds
116 instance Outputable Var where
117 ppr var = ppr (varName var)
119 instance Show Var where
120 showsPrec p var = showsPrecSDoc p (ppr var)
122 instance NamedThing Var where
125 instance Uniquable Var where
126 getUnique = varUnique
128 instance Eq Var where
129 a == b = realUnique a ==# realUnique b
131 instance Ord Var where
132 a <= b = realUnique a <=# realUnique b
133 a < b = realUnique a <# realUnique b
134 a >= b = realUnique a >=# realUnique b
135 a > b = realUnique a ># realUnique b
136 a `compare` b = varUnique a `compare` varUnique b
141 varUnique :: Var -> Unique
142 varUnique var = mkUniqueGrimily (iBox (realUnique var))
144 setVarUnique :: Var -> Unique -> Var
145 setVarUnique var uniq
146 = var { realUnique = getKey# uniq,
147 varName = setNameUnique (varName var) uniq }
149 setVarName :: Var -> Name -> Var
150 setVarName var new_name
151 = var { realUnique = getKey# (getUnique new_name),
154 setVarOcc :: Var -> OccName -> Var
155 setVarOcc var new_occ
156 = var { varName = setNameOcc (varName var) new_occ }
160 %************************************************************************
162 \subsection{Type variables}
164 %************************************************************************
171 setTyVarUnique = setVarUnique
172 setTyVarName = setVarName
176 mkTyVar :: Name -> Kind -> TyVar
177 mkTyVar name kind = TyVar { varName = name
178 , realUnique = getKey# (nameUnique name)
182 mkTcTyVar :: Name -> Kind -> TcTyVarDetails -> TyVar
183 mkTcTyVar name kind details
184 = TcTyVar { varName = name,
185 realUnique = getKey# (nameUnique name),
187 tcTyVarDetails = details
192 %************************************************************************
194 \subsection{Id Construction}
196 %************************************************************************
198 Most Id-related functions are in Id.lhs and MkId.lhs
209 setIdUnique :: Id -> Unique -> Id
210 setIdUnique = setVarUnique
212 setIdName :: Id -> Name -> Id
213 setIdName = setVarName
215 setIdType :: Id -> Type -> Id
216 setIdType id ty = id {idType = ty}
218 setIdExported :: Id -> Id
219 -- Can be called on GlobalIds, such as data cons and class ops,
220 -- which are "born" as GlobalIds and automatically exported
221 setIdExported id@(LocalId {}) = id { lclDetails = Exported }
222 setIdExported other_id = ASSERT( isId other_id ) other_id
224 setIdNotExported :: Id -> Id
225 -- We can only do this to LocalIds
226 setIdNotExported id = ASSERT( isLocalId id ) id { lclDetails = NotExported }
228 zapSpecPragmaId :: Id -> Id
230 | isSpecPragmaId id = id {lclDetails = NotExported}
233 globaliseId :: GlobalIdDetails -> Id -> Id
234 -- If it's a local, make it global
235 globaliseId details id = GlobalId { varName = varName id,
236 realUnique = realUnique id,
239 gblDetails = details }
241 lazySetIdInfo :: Id -> IdInfo -> Id
242 lazySetIdInfo id info = id {idInfo = info}
244 setIdInfo :: Id -> IdInfo -> Id
245 setIdInfo id info = seqIdInfo info `seq` id {idInfo = info}
246 -- Try to avoid spack leaks by seq'ing
248 modifyIdInfo :: (IdInfo -> IdInfo) -> Id -> Id
250 = seqIdInfo new_info `seq` id {idInfo = new_info}
252 new_info = fn (idInfo id)
254 -- maybeModifyIdInfo tries to avoid unnecesary thrashing
255 maybeModifyIdInfo :: (IdInfo -> Maybe IdInfo) -> Id -> Id
256 maybeModifyIdInfo fn id
257 = case fn (idInfo id) of
259 Just new_info -> id {idInfo = new_info}
262 %************************************************************************
264 \subsection{Predicates over variables
266 %************************************************************************
269 mkGlobalId :: GlobalIdDetails -> Name -> Type -> IdInfo -> Id
270 mkGlobalId details name ty info
271 = GlobalId { varName = name,
272 realUnique = getKey# (nameUnique name), -- Cache the unique
274 gblDetails = details,
277 mk_local_id :: Name -> Type -> LocalIdDetails -> IdInfo -> Id
278 mk_local_id name ty details info
279 = LocalId { varName = name,
280 realUnique = getKey# (nameUnique name), -- Cache the unique
282 lclDetails = details,
285 mkLocalId :: Name -> Type -> IdInfo -> Id
286 mkLocalId name ty info = mk_local_id name ty NotExported info
288 mkExportedLocalId :: Name -> Type -> IdInfo -> Id
289 mkExportedLocalId name ty info = mk_local_id name ty Exported info
291 mkSpecPragmaId :: Name -> Type -> IdInfo -> Id
292 mkSpecPragmaId name ty info = mk_local_id name ty SpecPragma info
296 isTyVar, isTcTyVar :: Var -> Bool
297 isId, isLocalVar, isLocalId :: Var -> Bool
298 isGlobalId, isExportedId, isSpecPragmaId :: Var -> Bool
299 mustHaveLocalBinding :: Var -> Bool
301 isTyVar (TyVar {}) = True
302 isTyVar (TcTyVar {}) = True
303 isTyVar other = False
305 isTcTyVar (TcTyVar {}) = True
306 isTcTyVar other = False
308 isId (LocalId {}) = True
309 isId (GlobalId {}) = True
312 isLocalId (LocalId {}) = True
313 isLocalId other = False
315 -- isLocalVar returns True for type variables as well as local Ids
316 -- These are the variables that we need to pay attention to when finding free
317 -- variables, or doing dependency analysis.
318 isLocalVar (GlobalId {}) = False
319 isLocalVar other = True
321 -- mustHaveLocalBinding returns True of Ids and TyVars
322 -- that must have a binding in this module. The converse
323 -- is not quite right: there are some GlobalIds that must have
324 -- bindings, such as record selectors. But that doesn't matter,
325 -- because it's only used for assertions
326 mustHaveLocalBinding var = isLocalVar var
328 isGlobalId (GlobalId {}) = True
329 isGlobalId other = False
331 -- isExportedId means "don't throw this away"
332 isExportedId (GlobalId {}) = True
333 isExportedId (LocalId {lclDetails = details})
338 isExportedId other = False
340 isSpecPragmaId (LocalId {lclDetails = SpecPragma}) = True
341 isSpecPragmaId other = False
345 globalIdDetails :: Var -> GlobalIdDetails
346 -- Works OK on local Ids too, returning notGlobalId
347 globalIdDetails (GlobalId {gblDetails = details}) = details
348 globalIdDetails other = notGlobalId