[project @ 1998-12-02 13:17:09 by simonm]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Var.lhs
1
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section{@Vars@: Variables}
5
6 \begin{code}
7 module Var (
8         Var, IdOrTyVar,         -- Abstract
9         VarDetails(..),         -- Concrete
10         varName, varUnique, varDetails, varInfo, varType,
11         setVarName, setVarUnique, setVarType,
12
13
14         -- TyVars
15         TyVar, GenTyVar,
16         tyVarName, tyVarKind,
17         tyVarFlexi, setTyVarFlexi, removeTyVarFlexi, setTyVarName, setTyVarUnique,
18         mkFlexiTyVar, mkTyVar, mkSysTyVar, isTyVar, isFlexiTyVar,
19
20         -- Ids
21         Id, DictId, GenId,
22         idName, idType, idUnique, idInfo, modifyIdInfo,
23         setIdName, setIdUnique, setIdInfo,
24         mkId, isId, externallyVisibleId
25     ) where
26
27 #include "HsVersions.h"
28
29 import {-# SOURCE #-}   Type( GenType, Kind )
30 import {-# SOURCE #-}   IdInfo( IdInfo )
31 import {-# SOURCE #-}   Const( Con )
32
33 import FieldLabel       ( FieldLabel )
34 import Unique           ( Unique, Uniquable(..), mkUniqueGrimily, getKey )
35 import Name             ( Name, NamedThing(..),
36                           changeUnique, nameUnique, 
37                           mkSysLocalName, isExternallyVisibleName
38                         )
39 import BasicTypes       ( Unused )
40 import Outputable
41 \end{code}
42
43
44
45 %************************************************************************
46 %*                                                                      *
47 \subsection{The main data type declarations}
48 %*                                                                      *
49 %************************************************************************
50
51
52 Every @Var@ has a @Unique@, to uniquify it and for fast comparison, a
53 @Type@, and an @IdInfo@ (non-essential info about it, e.g.,
54 strictness).  The essential info about different kinds of @Vars@ is
55 in its @VarDetails@.
56
57 \begin{code}
58 type IdOrTyVar = Var Unused Unused 
59
60 data Var flex_self flex_ty 
61   = Var {
62         varName    :: Name,
63         realUnique :: Int#,             -- Key for fast comparison
64                                         -- Identical to the Unique in the name,
65                                         -- cached here for speed
66         varType    :: GenType flex_ty,
67         varDetails :: VarDetails flex_self,
68         varInfo    :: IdInfo            -- Only used for Ids at the moment
69     }
70
71 varUnique Var{realUnique = uniq} = mkUniqueGrimily uniq
72
73 data VarDetails flex_self
74   = TyVar
75   | FlexiTyVar flex_self        -- Used during unification
76   | VanillaId                   -- Most Ids are like this
77   | ConstantId Con              -- The Id for a constant (data constructor or primop)
78   | RecordSelId FieldLabel      -- The Id for a record selector
79 \end{code}
80
81 \begin{code}
82 instance Outputable (Var fs ft) where
83   ppr var = ppr (varName var)
84
85 instance Show (Var fs ft) where
86   showsPrec p var = showsPrecSDoc p (ppr var)
87
88 instance NamedThing (Var fs ft) where
89   getName = varName
90
91 instance Uniquable (Var fs ft) where
92   getUnique = varUnique
93
94 instance Eq (Var fs ft) where
95     a == b = realUnique a ==# realUnique b
96
97 instance Ord (Var fs ft) where
98     a <= b = realUnique a <=# realUnique b
99     a <  b = realUnique a <#  realUnique b
100     a >= b = realUnique a >=# realUnique b
101     a >  b = realUnique a >#  realUnique b
102     a `compare` b = varUnique a `compare` varUnique b
103 \end{code}
104
105
106 \begin{code}
107 setVarUnique :: Var fs ft -> Unique -> Var fs ft
108 setVarUnique var uniq = var {realUnique = getKey uniq, 
109                              varName = changeUnique (varName var) uniq}
110
111 setVarName :: Var fs ft -> Name -> Var fs ft
112 setVarName var new_name
113   = var { realUnique = getKey (getUnique new_name), varName = new_name }
114
115 setVarType :: Var flex_self flex_ty1 -> GenType flex_ty2 -> Var flex_self flex_ty2
116 setVarType var ty = var {varType = ty}
117 \end{code}
118
119
120 %************************************************************************
121 %*                                                                      *
122 \subsection{Type variables}
123 %*                                                                      *
124 %************************************************************************
125
126 \begin{code}
127 type GenTyVar flex_self = Var flex_self Unused          -- Perhaps a mutable tyvar, but 
128                                                         -- with a fixed Kind
129
130 type TyVar              = GenTyVar Unused               -- NOt even mutable
131 \end{code}
132
133 \begin{code}
134 tyVarName = varName
135 tyVarKind = varType
136
137 setTyVarUnique = setVarUnique
138 setTyVarName   = setVarName
139
140 tyVarFlexi :: GenTyVar flexi -> flexi
141 tyVarFlexi (Var {varDetails = FlexiTyVar flex}) = flex
142 tyVarFlexi other_var        = pprPanic "tyVarFlexi" (ppr other_var)
143
144 setTyVarFlexi :: GenTyVar flexi1 -> flexi2 -> GenTyVar flexi2
145 setTyVarFlexi var flex = var {varDetails = FlexiTyVar flex}
146
147 removeTyVarFlexi :: GenTyVar flexi1 -> GenTyVar flexi2
148 removeTyVarFlexi var = var {varDetails = TyVar}
149 \end{code}
150
151 \begin{code}
152 mkTyVar :: Name -> Kind -> GenTyVar flexi
153 mkTyVar name kind = Var { varName = name, realUnique = getKey (nameUnique name),
154                           varType = kind, varDetails = TyVar }
155
156 mkSysTyVar :: Unique -> Kind -> GenTyVar flexi
157 mkSysTyVar uniq kind = Var { varName = name, realUnique = getKey uniq,
158                              varType = kind, varDetails = TyVar }
159                      where
160                        name = mkSysLocalName uniq
161
162 mkFlexiTyVar :: Name -> Kind -> flexi -> GenTyVar flexi
163 mkFlexiTyVar name kind flex = Var { varName = name, 
164                                     realUnique = getKey (nameUnique name),
165                                     varType = kind, 
166                                     varDetails = FlexiTyVar flex }
167 \end{code}
168
169 \begin{code}
170 isTyVar :: Var fs ft -> Bool
171 isTyVar (Var {varDetails = details}) = case details of
172                                         TyVar        -> True
173                                         FlexiTyVar _ -> True
174                                         other        -> False
175
176 isFlexiTyVar :: Var fs ft -> Bool
177 isFlexiTyVar (Var {varDetails = FlexiTyVar _}) = True
178 isFlexiTyVar other                             = False
179 \end{code}
180
181
182 %************************************************************************
183 %*                                                                      *
184 \subsection{Id Construction}
185 %*                                                                      *
186 %************************************************************************
187
188         Most Id-related functions are in Id.lhs and MkId.lhs
189
190 \begin{code}
191 type GenId flex_ty = Var Unused flex_ty
192 type Id            = GenId Unused
193 type DictId        = Id
194 \end{code}
195
196 \begin{code}
197 idName    = varName
198 idType    = varType
199 idUnique  = varUnique
200 idInfo    = varInfo
201 idDetails = varDetails
202
203 setIdUnique :: Id -> Unique -> Id
204 setIdUnique = setVarUnique
205
206 setIdName :: Id -> Name -> Id
207 setIdName = setVarName
208
209 setIdInfo :: GenId flexi -> IdInfo -> GenId flexi
210 setIdInfo var info = var {varInfo = info}
211
212 modifyIdInfo :: GenId flexi -> (IdInfo -> IdInfo) -> GenId flexi
213 modifyIdInfo var@(Var {varInfo = info}) fn = var {varInfo = fn info}
214 \end{code}
215
216 \begin{code}
217 mkId :: Name -> GenType flex_ty  -> VarDetails Unused -> IdInfo -> GenId flex_ty
218 mkId name ty details info
219   = Var {varName = name, realUnique = getKey (nameUnique name), varType = ty, 
220          varDetails = details, varInfo = info}
221 \end{code}
222
223 \begin{code}
224 isId :: Var fs ft -> Bool
225 isId (Var {varDetails = details}) = case details of
226                                         VanillaId     -> True
227                                         ConstantId _  -> True
228                                         RecordSelId _ -> True
229                                         other         -> False
230 \end{code}
231
232 @externallyVisibleId@: is it true that another module might be
233 able to ``see'' this Id in a code generation sense. That
234 is, another .o file might refer to this Id.
235
236 In tidyCorePgm (SimplCore.lhs) we carefully set each top level thing's
237 local-ness precisely so that the test here would be easy
238
239 This defn appears here (rather than, say, in Id.lhs) because
240 CostCentre.lhs uses it (CostCentre feeds PprType feeds Id.lhs)
241
242 \end{code}
243 \begin{code}
244 externallyVisibleId :: Id -> Bool
245 externallyVisibleId var = isExternallyVisibleName (varName var)
246 \end{code}