Amend comment per Marlow's comments.
[ghc-hetmet.git] / compiler / basicTypes / OccName.lhs
1 %
2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 %
5
6 \begin{code}
7 -- |
8 -- #name_types#
9 -- GHC uses several kinds of name internally:
10 --
11 -- * 'OccName.OccName' represents names as strings with just a little more information:
12 --   the \"namespace\" that the name came from, e.g. the namespace of value, type constructors or
13 --   data constructors
14 --
15 -- * 'RdrName.RdrName': see "RdrName#name_types"
16 --
17 -- * 'Name.Name': see "Name#name_types"
18 --
19 -- * 'Id.Id': see "Id#name_types"
20 --
21 -- * 'Var.Var': see "Var#name_types"
22 module OccName (
23         -- * The 'NameSpace' type
24         NameSpace, -- Abstract
25         
26         -- ** Construction
27         -- $real_vs_source_data_constructors
28         tcName, clsName, tcClsName, dataName, varName, 
29         tvName, srcDataName,
30
31         -- ** Pretty Printing
32         pprNameSpace, pprNonVarNameSpace, pprNameSpaceBrief,
33
34         -- * The 'OccName' type
35         OccName,        -- Abstract, instance of Outputable
36         pprOccName, 
37
38         -- ** Construction      
39         mkOccName, mkOccNameFS, 
40         mkVarOcc, mkVarOccFS,
41         mkDataOcc, mkDataOccFS,
42         mkTyVarOcc, mkTyVarOccFS,
43         mkTcOcc, mkTcOccFS,
44         mkClsOcc, mkClsOccFS,
45         mkDFunOcc,
46         mkTupleOcc, 
47         setOccNameSpace,
48
49         -- ** Derived 'OccName's
50         isDerivedOccName,
51         mkDataConWrapperOcc, mkWorkerOcc, mkDefaultMethodOcc,
52         mkDerivedTyConOcc, mkNewTyCoOcc, mkClassOpAuxOcc,
53         mkCon2TagOcc, mkTag2ConOcc, mkMaxTagOcc,
54         mkClassTyConOcc, mkClassDataConOcc, mkDictOcc, mkIPOcc, 
55         mkSpecOcc, mkForeignExportOcc, mkGenOcc1, mkGenOcc2,
56         mkDataTOcc, mkDataCOcc, mkDataConWorkerOcc,
57         mkSuperDictSelOcc, mkLocalOcc, mkMethodOcc, mkInstTyTcOcc,
58         mkInstTyCoOcc, mkEqPredCoOcc,
59         mkVectOcc, mkVectTyConOcc, mkVectDataConOcc, mkVectIsoOcc,
60         mkPDataTyConOcc, mkPDataDataConOcc,
61         mkPReprTyConOcc, 
62         mkPADFunOcc,
63
64         -- ** Deconstruction
65         occNameFS, occNameString, occNameSpace, 
66
67         isVarOcc, isTvOcc, isTcOcc, isDataOcc, isDataSymOcc, isSymOcc, isValOcc,
68         parenSymOcc, startsWithUnderscore, 
69         
70         isTcClsNameSpace, isTvNameSpace, isDataConNameSpace, isVarNameSpace, isValNameSpace,
71
72         isTupleOcc_maybe,
73
74         -- * The 'OccEnv' type
75         OccEnv, emptyOccEnv, unitOccEnv, extendOccEnv, mapOccEnv,
76         lookupOccEnv, mkOccEnv, mkOccEnv_C, extendOccEnvList, elemOccEnv,
77         occEnvElts, foldOccEnv, plusOccEnv, plusOccEnv_C, extendOccEnv_C,
78         extendOccEnv_Acc, filterOccEnv, delListFromOccEnv, delFromOccEnv,
79
80         -- * The 'OccSet' type
81         OccSet, emptyOccSet, unitOccSet, mkOccSet, extendOccSet, 
82         extendOccSetList,
83         unionOccSets, unionManyOccSets, minusOccSet, elemOccSet, occSetElts, 
84         foldOccSet, isEmptyOccSet, intersectOccSet, intersectsOccSet,
85                   
86         -- * Tidying up
87         TidyOccEnv, emptyTidyOccEnv, tidyOccName, initTidyOccEnv,
88
89         -- * Lexical characteristics of Haskell names
90         isLexCon, isLexVar, isLexId, isLexSym,
91         isLexConId, isLexConSym, isLexVarId, isLexVarSym,
92         startsVarSym, startsVarId, startsConSym, startsConId
93     ) where
94
95 #include "Typeable.h"
96
97 import Util
98 import Unique
99 import BasicTypes
100 import UniqFM
101 import UniqSet
102 import FastString
103 import Outputable
104 import Binary
105 import StaticFlags( opt_SuppressUniques )
106 import Data.Char
107 import Data.Data
108 \end{code}
109
110 %************************************************************************
111 %*                                                                      *
112 \subsection{Name space}
113 %*                                                                      *
114 %************************************************************************
115
116 \begin{code}
117 data NameSpace = VarName        -- Variables, including "real" data constructors
118                | DataName       -- "Source" data constructors 
119                | TvName         -- Type variables
120                | TcClsName      -- Type constructors and classes; Haskell has them
121                                 -- in the same name space for now.
122                deriving( Eq, Ord )
123    {-! derive: Binary !-}
124
125 -- Note [Data Constructors]  
126 -- see also: Note [Data Constructor Naming] in DataCon.lhs
127 --
128 -- $real_vs_source_data_constructors
129 -- There are two forms of data constructor:
130 --
131 --      [Source data constructors] The data constructors mentioned in Haskell source code
132 --
133 --      [Real data constructors] The data constructors of the representation type, which may not be the same as the source type
134 --
135 -- For example:
136 --
137 -- > data T = T !(Int, Int)
138 --
139 -- The source datacon has type @(Int, Int) -> T@
140 -- The real   datacon has type @Int -> Int -> T@
141 --
142 -- GHC chooses a representation based on the strictness etc.
143
144 tcName, clsName, tcClsName :: NameSpace
145 dataName, srcDataName      :: NameSpace
146 tvName, varName            :: NameSpace
147
148 -- Though type constructors and classes are in the same name space now,
149 -- the NameSpace type is abstract, so we can easily separate them later
150 tcName    = TcClsName           -- Type constructors
151 clsName   = TcClsName           -- Classes
152 tcClsName = TcClsName           -- Not sure which!
153
154 dataName    = DataName
155 srcDataName = DataName  -- Haskell-source data constructors should be
156                         -- in the Data name space
157
158 tvName      = TvName
159 varName     = VarName
160
161 isDataConNameSpace :: NameSpace -> Bool
162 isDataConNameSpace DataName = True
163 isDataConNameSpace _        = False
164
165 isTcClsNameSpace :: NameSpace -> Bool
166 isTcClsNameSpace TcClsName = True
167 isTcClsNameSpace _         = False
168
169 isTvNameSpace :: NameSpace -> Bool
170 isTvNameSpace TvName = True
171 isTvNameSpace _      = False
172
173 isVarNameSpace :: NameSpace -> Bool     -- Variables or type variables, but not constructors
174 isVarNameSpace TvName  = True
175 isVarNameSpace VarName = True
176 isVarNameSpace _       = False
177
178 isValNameSpace :: NameSpace -> Bool
179 isValNameSpace DataName = True
180 isValNameSpace VarName  = True
181 isValNameSpace _        = False
182
183 pprNameSpace :: NameSpace -> SDoc
184 pprNameSpace DataName  = ptext (sLit "data constructor")
185 pprNameSpace VarName   = ptext (sLit "variable")
186 pprNameSpace TvName    = ptext (sLit "type variable")
187 pprNameSpace TcClsName = ptext (sLit "type constructor or class")
188
189 pprNonVarNameSpace :: NameSpace -> SDoc
190 pprNonVarNameSpace VarName = empty
191 pprNonVarNameSpace ns = pprNameSpace ns
192
193 pprNameSpaceBrief :: NameSpace -> SDoc
194 pprNameSpaceBrief DataName  = char 'd'
195 pprNameSpaceBrief VarName   = char 'v'
196 pprNameSpaceBrief TvName    = ptext (sLit "tv")
197 pprNameSpaceBrief TcClsName = ptext (sLit "tc")
198 \end{code}
199
200
201 %************************************************************************
202 %*                                                                      *
203 \subsection[Name-pieces-datatypes]{The @OccName@ datatypes}
204 %*                                                                      *
205 %************************************************************************
206
207 \begin{code}
208 data OccName = OccName 
209     { occNameSpace  :: !NameSpace
210     , occNameFS     :: !FastString
211     }
212     deriving Typeable
213 \end{code}
214
215
216 \begin{code}
217 instance Eq OccName where
218     (OccName sp1 s1) == (OccName sp2 s2) = s1 == s2 && sp1 == sp2
219
220 instance Ord OccName where
221         -- Compares lexicographically, *not* by Unique of the string
222     compare (OccName sp1 s1) (OccName sp2 s2) 
223         = (s1  `compare` s2) `thenCmp` (sp1 `compare` sp2)
224
225 instance Data OccName where
226   -- don't traverse?
227   toConstr _   = abstractConstr "OccName"
228   gunfold _ _  = error "gunfold"
229   dataTypeOf _ = mkNoRepType "OccName"
230 \end{code}
231
232
233 %************************************************************************
234 %*                                                                      *
235 \subsection{Printing}
236 %*                                                                      *
237 %************************************************************************
238  
239 \begin{code}
240 instance Outputable OccName where
241     ppr = pprOccName
242
243 pprOccName :: OccName -> SDoc
244 pprOccName (OccName sp occ) 
245   = getPprStyle $ \ sty ->
246     if codeStyle sty 
247     then ftext (zEncodeFS occ)
248     else pp_occ <> pp_debug sty
249   where
250     pp_debug sty | debugStyle sty = braces (pprNameSpaceBrief sp)
251                  | otherwise      = empty
252
253     pp_occ | opt_SuppressUniques = text (strip_th_unique (unpackFS occ))
254            | otherwise           = ftext occ
255
256         -- See Note [Suppressing uniques in OccNames]
257     strip_th_unique ('[' : c : _) | isAlphaNum c = []
258     strip_th_unique (c : cs) = c : strip_th_unique cs
259     strip_th_unique []       = []
260 \end{code}
261
262 Note [Suppressing uniques in OccNames]
263 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
264 This is a hack to de-wobblify the OccNames that contain uniques from
265 Template Haskell that have been turned into a string in the OccName.
266 See Note [Unique OccNames from Template Haskell] in Convert.hs
267
268 %************************************************************************
269 %*                                                                      *
270 \subsection{Construction}
271 %*                                                                      *
272 %************************************************************************
273
274 \begin{code}
275 mkOccName :: NameSpace -> String -> OccName
276 mkOccName occ_sp str = OccName occ_sp (mkFastString str)
277
278 mkOccNameFS :: NameSpace -> FastString -> OccName
279 mkOccNameFS occ_sp fs = OccName occ_sp fs
280
281 mkVarOcc :: String -> OccName
282 mkVarOcc s = mkOccName varName s
283
284 mkVarOccFS :: FastString -> OccName
285 mkVarOccFS fs = mkOccNameFS varName fs
286
287 mkDataOcc :: String -> OccName
288 mkDataOcc = mkOccName dataName
289
290 mkDataOccFS :: FastString -> OccName
291 mkDataOccFS = mkOccNameFS dataName
292
293 mkTyVarOcc :: String -> OccName
294 mkTyVarOcc = mkOccName tvName
295
296 mkTyVarOccFS :: FastString -> OccName
297 mkTyVarOccFS fs = mkOccNameFS tvName fs
298
299 mkTcOcc :: String -> OccName
300 mkTcOcc = mkOccName tcName
301
302 mkTcOccFS :: FastString -> OccName
303 mkTcOccFS = mkOccNameFS tcName
304
305 mkClsOcc :: String -> OccName
306 mkClsOcc = mkOccName clsName
307
308 mkClsOccFS :: FastString -> OccName
309 mkClsOccFS = mkOccNameFS clsName
310 \end{code}
311
312
313 %************************************************************************
314 %*                                                                      *
315                 Environments
316 %*                                                                      *
317 %************************************************************************
318
319 OccEnvs are used mainly for the envts in ModIfaces.
320
321 Note [The Unique of an OccName]
322 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
323 They are efficient, because FastStrings have unique Int# keys.  We assume
324 this key is less than 2^24, and indeed FastStrings are allocated keys 
325 sequentially starting at 0.
326
327 So we can make a Unique using
328         mkUnique ns key  :: Unique
329 where 'ns' is a Char reprsenting the name space.  This in turn makes it
330 easy to build an OccEnv.
331
332 \begin{code}
333 instance Uniquable OccName where
334       -- See Note [The Unique of an OccName]
335   getUnique (OccName VarName   fs) = mkVarOccUnique  fs
336   getUnique (OccName DataName  fs) = mkDataOccUnique fs
337   getUnique (OccName TvName    fs) = mkTvOccUnique   fs
338   getUnique (OccName TcClsName fs) = mkTcOccUnique   fs
339
340 newtype OccEnv a = A (UniqFM a)
341
342 emptyOccEnv :: OccEnv a
343 unitOccEnv  :: OccName -> a -> OccEnv a
344 extendOccEnv :: OccEnv a -> OccName -> a -> OccEnv a
345 extendOccEnvList :: OccEnv a -> [(OccName, a)] -> OccEnv a
346 lookupOccEnv :: OccEnv a -> OccName -> Maybe a
347 mkOccEnv     :: [(OccName,a)] -> OccEnv a
348 mkOccEnv_C   :: (a -> a -> a) -> [(OccName,a)] -> OccEnv a
349 elemOccEnv   :: OccName -> OccEnv a -> Bool
350 foldOccEnv   :: (a -> b -> b) -> b -> OccEnv a -> b
351 occEnvElts   :: OccEnv a -> [a]
352 extendOccEnv_C :: (a->a->a) -> OccEnv a -> OccName -> a -> OccEnv a
353 extendOccEnv_Acc :: (a->b->b) -> (a->b) -> OccEnv b -> OccName -> a -> OccEnv b
354 plusOccEnv     :: OccEnv a -> OccEnv a -> OccEnv a
355 plusOccEnv_C   :: (a->a->a) -> OccEnv a -> OccEnv a -> OccEnv a
356 mapOccEnv      :: (a->b) -> OccEnv a -> OccEnv b
357 delFromOccEnv      :: OccEnv a -> OccName -> OccEnv a
358 delListFromOccEnv :: OccEnv a -> [OccName] -> OccEnv a
359 filterOccEnv       :: (elt -> Bool) -> OccEnv elt -> OccEnv elt
360
361 emptyOccEnv      = A emptyUFM
362 unitOccEnv x y = A $ unitUFM x y 
363 extendOccEnv (A x) y z = A $ addToUFM x y z
364 extendOccEnvList (A x) l = A $ addListToUFM x l
365 lookupOccEnv (A x) y = lookupUFM x y
366 mkOccEnv     l    = A $ listToUFM l
367 elemOccEnv x (A y)       = elemUFM x y
368 foldOccEnv a b (A c)     = foldUFM a b c 
369 occEnvElts (A x)         = eltsUFM x
370 plusOccEnv (A x) (A y)   = A $ plusUFM x y 
371 plusOccEnv_C f (A x) (A y)       = A $ plusUFM_C f x y 
372 extendOccEnv_C f (A x) y z   = A $ addToUFM_C f x y z
373 extendOccEnv_Acc f g (A x) y z   = A $ addToUFM_Acc f g x y z
374 mapOccEnv f (A x)        = A $ mapUFM f x
375 mkOccEnv_C comb l = A $ addListToUFM_C comb emptyUFM l
376 delFromOccEnv (A x) y    = A $ delFromUFM x y
377 delListFromOccEnv (A x) y  = A $ delListFromUFM x y
378 filterOccEnv x (A y)       = A $ filterUFM x y
379
380 instance Outputable a => Outputable (OccEnv a) where
381     ppr (A x) = ppr x
382
383 type OccSet = UniqSet OccName
384
385 emptyOccSet       :: OccSet
386 unitOccSet        :: OccName -> OccSet
387 mkOccSet          :: [OccName] -> OccSet
388 extendOccSet      :: OccSet -> OccName -> OccSet
389 extendOccSetList  :: OccSet -> [OccName] -> OccSet
390 unionOccSets      :: OccSet -> OccSet -> OccSet
391 unionManyOccSets  :: [OccSet] -> OccSet
392 minusOccSet       :: OccSet -> OccSet -> OccSet
393 elemOccSet        :: OccName -> OccSet -> Bool
394 occSetElts        :: OccSet -> [OccName]
395 foldOccSet        :: (OccName -> b -> b) -> b -> OccSet -> b
396 isEmptyOccSet     :: OccSet -> Bool
397 intersectOccSet   :: OccSet -> OccSet -> OccSet
398 intersectsOccSet  :: OccSet -> OccSet -> Bool
399
400 emptyOccSet       = emptyUniqSet
401 unitOccSet        = unitUniqSet
402 mkOccSet          = mkUniqSet
403 extendOccSet      = addOneToUniqSet
404 extendOccSetList  = addListToUniqSet
405 unionOccSets      = unionUniqSets
406 unionManyOccSets  = unionManyUniqSets
407 minusOccSet       = minusUniqSet
408 elemOccSet        = elementOfUniqSet
409 occSetElts        = uniqSetToList
410 foldOccSet        = foldUniqSet
411 isEmptyOccSet     = isEmptyUniqSet
412 intersectOccSet   = intersectUniqSets
413 intersectsOccSet s1 s2 = not (isEmptyOccSet (s1 `intersectOccSet` s2))
414 \end{code}
415
416
417 %************************************************************************
418 %*                                                                      *
419 \subsection{Predicates and taking them apart}
420 %*                                                                      *
421 %************************************************************************
422
423 \begin{code}
424 occNameString :: OccName -> String
425 occNameString (OccName _ s) = unpackFS s
426
427 setOccNameSpace :: NameSpace -> OccName -> OccName
428 setOccNameSpace sp (OccName _ occ) = OccName sp occ
429
430 isVarOcc, isTvOcc, isTcOcc, isDataOcc :: OccName -> Bool
431
432 isVarOcc (OccName VarName _) = True
433 isVarOcc _                   = False
434
435 isTvOcc (OccName TvName _) = True
436 isTvOcc _                  = False
437
438 isTcOcc (OccName TcClsName _) = True
439 isTcOcc _                     = False
440
441 -- | /Value/ 'OccNames's are those that are either in 
442 -- the variable or data constructor namespaces
443 isValOcc :: OccName -> Bool
444 isValOcc (OccName VarName  _) = True
445 isValOcc (OccName DataName _) = True
446 isValOcc _                    = False
447
448 isDataOcc (OccName DataName _) = True
449 isDataOcc (OccName VarName s)  
450   | isLexCon s = pprPanic "isDataOcc: check me" (ppr s)
451                 -- Jan06: I don't think this should happen
452 isDataOcc _                    = False
453
454 -- | Test if the 'OccName' is a data constructor that starts with
455 -- a symbol (e.g. @:@, or @[]@)
456 isDataSymOcc :: OccName -> Bool
457 isDataSymOcc (OccName DataName s) = isLexConSym s
458 isDataSymOcc (OccName VarName s)  
459   | isLexConSym s = pprPanic "isDataSymOcc: check me" (ppr s)
460                 -- Jan06: I don't think this should happen
461 isDataSymOcc _                    = False
462 -- Pretty inefficient!
463
464 -- | Test if the 'OccName' is that for any operator (whether 
465 -- it is a data constructor or variable or whatever)
466 isSymOcc :: OccName -> Bool
467 isSymOcc (OccName DataName s)  = isLexConSym s
468 isSymOcc (OccName TcClsName s) = isLexConSym s
469 isSymOcc (OccName VarName s)   = isLexSym s
470 isSymOcc (OccName TvName s)    = isLexSym s
471 -- Pretty inefficient!
472
473 parenSymOcc :: OccName -> SDoc -> SDoc
474 -- ^ Wrap parens around an operator
475 parenSymOcc occ doc | isSymOcc occ = parens doc
476                     | otherwise    = doc
477 \end{code}
478
479
480 \begin{code}
481 startsWithUnderscore :: OccName -> Bool
482 -- ^ Haskell 98 encourages compilers to suppress warnings about unsed
483 -- names in a pattern if they start with @_@: this implements that test
484 startsWithUnderscore occ = case occNameString occ of
485                              ('_' : _) -> True
486                              _other    -> False
487 \end{code}
488
489
490 %************************************************************************
491 %*                                                                      *
492 \subsection{Making system names}
493 %*                                                                      *
494 %************************************************************************
495
496 Here's our convention for splitting up the interface file name space:
497
498    d...         dictionary identifiers
499                 (local variables, so no name-clash worries)
500
501 All of these other OccNames contain a mixture of alphabetic
502 and symbolic characters, and hence cannot possibly clash with
503 a user-written type or function name
504
505    $f...        Dict-fun identifiers (from inst decls)
506    $dmop        Default method for 'op'
507    $pnC         n'th superclass selector for class C
508    $wf          Worker for functtoin 'f'
509    $sf..        Specialised version of f
510    T:C          Tycon for dictionary for class C
511    D:C          Data constructor for dictionary for class C
512    NTCo:T       Coercion connecting newtype T with its representation type
513    TFCo:R       Coercion connecting a data family to its respresentation type R
514
515 In encoded form these appear as Zdfxxx etc
516
517         :...            keywords (export:, letrec: etc.)
518 --- I THINK THIS IS WRONG!
519
520 This knowledge is encoded in the following functions.
521
522 @mk_deriv@ generates an @OccName@ from the prefix and a string.
523 NB: The string must already be encoded!
524
525 \begin{code}
526 mk_deriv :: NameSpace 
527          -> String              -- Distinguishes one sort of derived name from another
528          -> String
529          -> OccName
530
531 mk_deriv occ_sp sys_prefix str = mkOccName occ_sp (sys_prefix ++ str)
532
533 isDerivedOccName :: OccName -> Bool
534 isDerivedOccName occ = 
535    case occNameString occ of
536      '$':c:_ | isAlphaNum c -> True
537      ':':c:_ | isAlphaNum c -> True
538      _other                 -> False
539 \end{code}
540
541 \begin{code}
542 mkDataConWrapperOcc, mkWorkerOcc, mkDefaultMethodOcc, mkDerivedTyConOcc,
543         mkClassTyConOcc, mkClassDataConOcc, mkDictOcc, mkIPOcc, 
544         mkSpecOcc, mkForeignExportOcc, mkGenOcc1, mkGenOcc2,
545         mkDataTOcc, mkDataCOcc, mkDataConWorkerOcc, mkNewTyCoOcc,
546         mkInstTyCoOcc, mkEqPredCoOcc, mkClassOpAuxOcc,
547         mkCon2TagOcc, mkTag2ConOcc, mkMaxTagOcc,
548         mkVectOcc, mkVectTyConOcc, mkVectDataConOcc, mkVectIsoOcc,
549         mkPDataTyConOcc, mkPDataDataConOcc, mkPReprTyConOcc, mkPADFunOcc
550    :: OccName -> OccName
551
552 -- These derived variables have a prefix that no Haskell value could have
553 mkDataConWrapperOcc = mk_simple_deriv varName  "$W"
554 mkWorkerOcc         = mk_simple_deriv varName  "$w"
555 mkDefaultMethodOcc  = mk_simple_deriv varName  "$dm"
556 mkClassOpAuxOcc     = mk_simple_deriv varName  "$c"
557 mkDerivedTyConOcc   = mk_simple_deriv tcName   ":"      -- The : prefix makes sure it classifies
558 mkClassTyConOcc     = mk_simple_deriv tcName   "T:"     -- as a tycon/datacon
559 mkClassDataConOcc   = mk_simple_deriv dataName "D:"     -- We go straight to the "real" data con
560                                                         -- for datacons from classes
561 mkDictOcc           = mk_simple_deriv varName  "$d"
562 mkIPOcc             = mk_simple_deriv varName  "$i"
563 mkSpecOcc           = mk_simple_deriv varName  "$s"
564 mkForeignExportOcc  = mk_simple_deriv varName  "$f"
565 mkNewTyCoOcc        = mk_simple_deriv tcName   "NTCo:"  -- Coercion for newtypes
566 mkInstTyCoOcc       = mk_simple_deriv tcName   "TFCo:"   -- Coercion for type functions
567 mkEqPredCoOcc       = mk_simple_deriv tcName   "$co"
568
569 -- used in derived instances
570 mkCon2TagOcc        = mk_simple_deriv varName  "$con2tag_"
571 mkTag2ConOcc        = mk_simple_deriv varName  "$tag2con_"
572 mkMaxTagOcc         = mk_simple_deriv varName  "$maxtag_"
573
574 -- Generic derivable classes
575 mkGenOcc1           = mk_simple_deriv varName  "$gfrom"
576 mkGenOcc2           = mk_simple_deriv varName  "$gto" 
577
578 -- data T = MkT ... deriving( Data ) needs defintions for 
579 --      $tT   :: Data.Generics.Basics.DataType
580 --      $cMkT :: Data.Generics.Basics.Constr
581 mkDataTOcc = mk_simple_deriv varName  "$t"
582 mkDataCOcc = mk_simple_deriv varName  "$c"
583
584 -- Vectorisation
585 mkVectOcc          = mk_simple_deriv varName  "$v_"
586 mkVectTyConOcc     = mk_simple_deriv tcName   ":V_"
587 mkVectDataConOcc   = mk_simple_deriv dataName ":VD_"
588 mkVectIsoOcc       = mk_simple_deriv varName  "$VI_"
589 mkPDataTyConOcc    = mk_simple_deriv tcName   ":VP_"
590 mkPDataDataConOcc  = mk_simple_deriv dataName ":VPD_"
591 mkPReprTyConOcc    = mk_simple_deriv tcName   ":VR_"
592 mkPADFunOcc        = mk_simple_deriv varName  "$PA_"
593
594 mk_simple_deriv :: NameSpace -> String -> OccName -> OccName
595 mk_simple_deriv sp px occ = mk_deriv sp px (occNameString occ)
596
597 -- Data constructor workers are made by setting the name space
598 -- of the data constructor OccName (which should be a DataName)
599 -- to VarName
600 mkDataConWorkerOcc datacon_occ = setOccNameSpace varName datacon_occ 
601 \end{code}
602
603 \begin{code}
604 mkSuperDictSelOcc :: Int        -- ^ Index of superclass, e.g. 3
605                   -> OccName    -- ^ Class, e.g. @Ord@
606                   -> OccName    -- ^ Derived 'Occname', e.g. @$p3Ord@
607 mkSuperDictSelOcc index cls_occ
608   = mk_deriv varName "$p" (show index ++ occNameString cls_occ)
609
610 mkLocalOcc :: Unique            -- ^ Unique to combine with the 'OccName'
611            -> OccName           -- ^ Local name, e.g. @sat@
612            -> OccName           -- ^ Nice unique version, e.g. @$L23sat@
613 mkLocalOcc uniq occ
614    = mk_deriv varName ("$L" ++ show uniq) (occNameString occ)
615         -- The Unique might print with characters 
616         -- that need encoding (e.g. 'z'!)
617 \end{code}
618
619 \begin{code}
620 -- | Derive a name for the representation type constructor of a
621 -- @data@\/@newtype@ instance.
622 mkInstTyTcOcc :: String                 -- ^ Family name, e.g. @Map@
623               -> OccSet                 -- ^ avoid these Occs
624               -> OccName                -- ^ @R:Map@
625 mkInstTyTcOcc str set =
626   chooseUniqueOcc tcName ('R' : ':' : str) set
627 \end{code}
628
629 \begin{code}
630 mkDFunOcc :: String             -- ^ Typically the class and type glommed together e.g. @OrdMaybe@.
631                                 -- Only used in debug mode, for extra clarity
632           -> Bool               -- ^ Is this a hs-boot instance DFun?
633           -> OccSet             -- ^ avoid these Occs
634           -> OccName            -- ^ E.g. @$f3OrdMaybe@
635
636 -- In hs-boot files we make dict funs like $fx7ClsTy, which get bound to the real
637 -- thing when we compile the mother module. Reason: we don't know exactly
638 -- what the  mother module will call it.
639
640 mkDFunOcc info_str is_boot set
641   = chooseUniqueOcc VarName (prefix ++ info_str) set
642   where
643     prefix | is_boot   = "$fx"
644            | otherwise = "$f"
645 \end{code}
646
647 Sometimes we need to pick an OccName that has not already been used,
648 given a set of in-use OccNames.
649
650 \begin{code}
651 chooseUniqueOcc :: NameSpace -> String -> OccSet -> OccName
652 chooseUniqueOcc ns str set = loop (mkOccName ns str) (0::Int)
653   where
654   loop occ n
655    | occ `elemOccSet` set = loop (mkOccName ns (str ++ show n)) (n+1)
656    | otherwise            = occ
657 \end{code}
658
659 We used to add a '$m' to indicate a method, but that gives rise to bad
660 error messages from the type checker when we print the function name or pattern
661 of an instance-decl binding.  Why? Because the binding is zapped
662 to use the method name in place of the selector name.
663 (See TcClassDcl.tcMethodBind)
664
665 The way it is now, -ddump-xx output may look confusing, but
666 you can always say -dppr-debug to get the uniques.
667
668 However, we *do* have to zap the first character to be lower case,
669 because overloaded constructors (blarg) generate methods too.
670 And convert to VarName space
671
672 e.g. a call to constructor MkFoo where
673         data (Ord a) => Foo a = MkFoo a
674
675 If this is necessary, we do it by prefixing '$m'.  These 
676 guys never show up in error messages.  What a hack.
677
678 \begin{code}
679 mkMethodOcc :: OccName -> OccName
680 mkMethodOcc occ@(OccName VarName _) = occ
681 mkMethodOcc occ                     = mk_simple_deriv varName "$m" occ
682 \end{code}
683
684
685 %************************************************************************
686 %*                                                                      *
687 \subsection{Tidying them up}
688 %*                                                                      *
689 %************************************************************************
690
691 Before we print chunks of code we like to rename it so that
692 we don't have to print lots of silly uniques in it.  But we mustn't
693 accidentally introduce name clashes!  So the idea is that we leave the
694 OccName alone unless it accidentally clashes with one that is already
695 in scope; if so, we tack on '1' at the end and try again, then '2', and
696 so on till we find a unique one.
697
698 There's a wrinkle for operators.  Consider '>>='.  We can't use '>>=1' 
699 because that isn't a single lexeme.  So we encode it to 'lle' and *then*
700 tack on the '1', if necessary.
701
702 \begin{code}
703 type TidyOccEnv = OccEnv Int    -- The in-scope OccNames
704         -- Range gives a plausible starting point for new guesses
705
706 emptyTidyOccEnv :: TidyOccEnv
707 emptyTidyOccEnv = emptyOccEnv
708
709 initTidyOccEnv :: [OccName] -> TidyOccEnv       -- Initialise with names to avoid!
710 initTidyOccEnv = foldl (\env occ -> extendOccEnv env occ 1) emptyTidyOccEnv
711
712 tidyOccName :: TidyOccEnv -> OccName -> (TidyOccEnv, OccName)
713
714 tidyOccName in_scope occ@(OccName occ_sp fs)
715   = case lookupOccEnv in_scope occ of
716         Nothing ->      -- Not already used: make it used
717                    (extendOccEnv in_scope occ 1, occ)
718
719         Just n  ->      -- Already used: make a new guess, 
720                         -- change the guess base, and try again
721                    tidyOccName  (extendOccEnv in_scope occ (n+1))
722                                 (mkOccName occ_sp (base_occ ++ show n))
723   where
724     base_occ = reverse (dropWhile isDigit (reverse (unpackFS fs)))
725 \end{code}
726
727 %************************************************************************
728 %*                                                                      *
729                 Stuff for dealing with tuples
730 %*                                                                      *
731 %************************************************************************
732
733 \begin{code}
734 mkTupleOcc :: NameSpace -> Boxity -> Arity -> OccName
735 mkTupleOcc ns bx ar = OccName ns (mkFastString str)
736   where
737         -- no need to cache these, the caching is done in the caller
738         -- (TysWiredIn.mk_tuple)
739     str = case bx of
740                 Boxed   -> '(' : commas ++ ")"
741                 Unboxed -> '(' : '#' : commas ++ "#)"
742
743     commas = take (ar-1) (repeat ',')
744
745 isTupleOcc_maybe :: OccName -> Maybe (NameSpace, Boxity, Arity)
746 -- Tuples are special, because there are so many of them!
747 isTupleOcc_maybe (OccName ns fs)
748   = case unpackFS fs of
749         '(':'#':',':rest -> Just (ns, Unboxed, 2 + count_commas rest)
750         '(':',':rest     -> Just (ns, Boxed,   2 + count_commas rest)
751         _other           -> Nothing
752   where
753     count_commas (',':rest) = 1 + count_commas rest
754     count_commas _          = 0
755 \end{code}
756
757 %************************************************************************
758 %*                                                                      *
759 \subsection{Lexical categories}
760 %*                                                                      *
761 %************************************************************************
762
763 These functions test strings to see if they fit the lexical categories
764 defined in the Haskell report.
765
766 \begin{code}
767 isLexCon,   isLexVar,    isLexId,    isLexSym    :: FastString -> Bool
768 isLexConId, isLexConSym, isLexVarId, isLexVarSym :: FastString -> Bool
769
770 isLexCon cs = isLexConId  cs || isLexConSym cs
771 isLexVar cs = isLexVarId  cs || isLexVarSym cs
772
773 isLexId  cs = isLexConId  cs || isLexVarId  cs
774 isLexSym cs = isLexConSym cs || isLexVarSym cs
775
776 -------------
777
778 isLexConId cs                           -- Prefix type or data constructors
779   | nullFS cs          = False          --      e.g. "Foo", "[]", "(,)" 
780   | cs == (fsLit "[]") = True
781   | otherwise          = startsConId (headFS cs)
782
783 isLexVarId cs                           -- Ordinary prefix identifiers
784   | nullFS cs         = False           --      e.g. "x", "_x"
785   | otherwise         = startsVarId (headFS cs)
786
787 isLexConSym cs                          -- Infix type or data constructors
788   | nullFS cs          = False          --      e.g. ":-:", ":", "->"
789   | cs == (fsLit "->") = True
790   | otherwise          = startsConSym (headFS cs)
791
792 isLexVarSym cs                          -- Infix identifiers
793   | nullFS cs         = False           --      e.g. "+"
794   | otherwise         = startsVarSym (headFS cs)
795
796 -------------
797 startsVarSym, startsVarId, startsConSym, startsConId :: Char -> Bool
798 startsVarSym c = isSymbolASCII c || (ord c > 0x7f && isSymbol c) -- Infix Ids
799 startsConSym c = c == ':'                               -- Infix data constructors
800 startsVarId c  = isLower c || c == '_'  -- Ordinary Ids
801 startsConId c  = isUpper c || c == '('  -- Ordinary type constructors and data constructors
802
803 isSymbolASCII :: Char -> Bool
804 isSymbolASCII c = c `elem` "!#$%&*+./<=>?@\\^|~-"
805 \end{code}
806
807 %************************************************************************
808 %*                                                                      *
809                 Binary instance
810     Here rather than BinIface because OccName is abstract
811 %*                                                                      *
812 %************************************************************************
813
814 \begin{code}
815 instance Binary NameSpace where
816     put_ bh VarName = do
817             putByte bh 0
818     put_ bh DataName = do
819             putByte bh 1
820     put_ bh TvName = do
821             putByte bh 2
822     put_ bh TcClsName = do
823             putByte bh 3
824     get bh = do
825             h <- getByte bh
826             case h of
827               0 -> do return VarName
828               1 -> do return DataName
829               2 -> do return TvName
830               _ -> do return TcClsName
831
832 instance Binary OccName where
833     put_ bh (OccName aa ab) = do
834             put_ bh aa
835             put_ bh ab
836     get bh = do
837           aa <- get bh
838           ab <- get bh
839           return (OccName aa ab)
840 \end{code}