2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
5 \section[OccName]{@OccName@}
9 -- The NameSpace type; abstact
10 NameSpace, tcName, clsName, tcClsName, dataName, varName,
11 tvName, nameSpaceString,
14 OccName, -- Abstract, instance of Outputable
17 mkOccFS, mkSysOcc, mkSysOccFS, mkFCallOcc, mkVarOcc, mkKindOccFS,
18 mkSuperDictSelOcc, mkDFunOcc, mkForeignExportOcc,
19 mkDictOcc, mkIPOcc, mkWorkerOcc, mkMethodOcc, mkDefaultMethodOcc,
20 mkDerivedTyConOcc, mkClassTyConOcc, mkClassDataConOcc, mkSpecOcc,
23 isTvOcc, isDataOcc, isDataSymOcc, isSymOcc, isValOcc,
25 occNameFS, occNameString, occNameUserString, occNameSpace, occNameFlavour,
29 TidyOccEnv, emptyTidyOccEnv, tidyOccName, initTidyOccEnv,
32 EncodedString, EncodedFS, UserString, UserFS, encode, encodeFS, decode, pprEncodedFS,
34 -- The basic form of names
35 isLexCon, isLexVar, isLexId, isLexSym,
36 isLexConId, isLexConSym, isLexVarId, isLexVarSym,
37 isLowerISO, isUpperISO
41 #include "HsVersions.h"
43 import Char ( isDigit, isUpper, isLower, ISALPHANUM, ord, chr, digitToInt )
44 import Util ( thenCmp )
45 import FiniteMap ( FiniteMap, emptyFM, lookupFM, addToFM, elemFM )
50 We hold both module names and identifier names in a 'Z-encoded' form
51 that makes them acceptable both as a C identifier and as a Haskell
54 They can always be decoded again when printing error messages
55 or anything else for the user, but it does make sense for it
56 to be represented here in encoded form, so that when generating
57 code the encoding operation is not performed on each occurrence.
59 These type synonyms help documentation.
62 type UserFS = FAST_STRING -- As the user typed it
63 type EncodedFS = FAST_STRING -- Encoded form
65 type UserString = String -- As the user typed it
66 type EncodedString = String -- Encoded form
69 pprEncodedFS :: EncodedFS -> SDoc
71 = getPprStyle $ \ sty ->
73 -- ptext (decodeFS fs) would needlessly pack the string again
74 then text (decode (_UNPK_ fs))
78 %************************************************************************
80 \subsection{Name space}
82 %************************************************************************
85 data NameSpace = VarName -- Variables
86 | DataName -- Data constructors
87 | TvName -- Type variables
88 | TcClsName -- Type constructors and classes; Haskell has them
89 -- in the same name space for now.
92 -- Though type constructors and classes are in the same name space now,
93 -- the NameSpace type is abstract, so we can easily separate them later
94 tcName = TcClsName -- Type constructors
95 clsName = TcClsName -- Classes
96 tcClsName = TcClsName -- Not sure which!
103 nameSpaceString :: NameSpace -> String
104 nameSpaceString DataName = "Data constructor"
105 nameSpaceString VarName = "Variable"
106 nameSpaceString TvName = "Type variable"
107 nameSpaceString TcClsName = "Type constructor or class"
111 %************************************************************************
113 \subsection[Name-pieces-datatypes]{The @OccName@ datatypes}
115 %************************************************************************
118 data OccName = OccName
125 instance Eq OccName where
126 (OccName sp1 s1) == (OccName sp2 s2) = s1 == s2 && sp1 == sp2
128 instance Ord OccName where
129 compare (OccName sp1 s1) (OccName sp2 s2) = (s1 `compare` s2) `thenCmp`
134 %************************************************************************
136 \subsection{Printing}
138 %************************************************************************
141 instance Outputable OccName where
144 pprOccName :: OccName -> SDoc
145 pprOccName (OccName sp occ) = pprEncodedFS occ
149 %************************************************************************
151 \subsection{Construction}
153 %************************************************************************
155 *Sys* things do no encoding; the caller should ensure that the thing is
159 mkSysOcc :: NameSpace -> EncodedString -> OccName
160 mkSysOcc occ_sp str = ASSERT2( alreadyEncoded str, text str )
161 OccName occ_sp (_PK_ str)
163 mkSysOccFS :: NameSpace -> EncodedFS -> OccName
164 mkSysOccFS occ_sp fs = ASSERT2( alreadyEncodedFS fs, ppr fs )
167 mkFCallOcc :: EncodedString -> OccName
168 -- This version of mkSysOcc doesn't check that the string is already encoded,
169 -- because it will be something like "{__ccall f dyn Int# -> Int#}"
170 -- This encodes a lot into something that then parses like an Id.
171 -- But then alreadyEncoded complains about the braces!
172 mkFCallOcc str = OccName varName (_PK_ str)
174 -- Kind constructors get a special function. Uniquely, they are not encoded,
175 -- so that they have names like '*'. This means that *even in interface files*
176 -- we'll get kinds like (* -> (* -> *)). We can't use mkSysOcc because it
177 -- has an ASSERT that doesn't hold.
178 mkKindOccFS :: NameSpace -> EncodedFS -> OccName
179 mkKindOccFS occ_sp fs = OccName occ_sp fs
182 *Source-code* things are encoded.
185 mkOccFS :: NameSpace -> UserFS -> OccName
186 mkOccFS occ_sp fs = mkSysOccFS occ_sp (encodeFS fs)
188 mkVarOcc :: UserFS -> OccName
189 mkVarOcc fs = mkSysOccFS varName (encodeFS fs)
194 %************************************************************************
196 \subsection{Predicates and taking them apart}
198 %************************************************************************
201 occNameFS :: OccName -> EncodedFS
202 occNameFS (OccName _ s) = s
204 occNameString :: OccName -> EncodedString
205 occNameString (OccName _ s) = _UNPK_ s
207 occNameUserString :: OccName -> UserString
208 occNameUserString occ = decode (occNameString occ)
210 occNameSpace :: OccName -> NameSpace
211 occNameSpace (OccName sp _) = sp
213 setOccNameSpace :: OccName -> NameSpace -> OccName
214 setOccNameSpace (OccName _ occ) sp = OccName sp occ
216 -- occNameFlavour is used only to generate good error messages
217 occNameFlavour :: OccName -> String
218 occNameFlavour (OccName sp _) = nameSpaceString sp
222 isTvOcc, isDataSymOcc, isSymOcc :: OccName -> Bool
224 isTvOcc (OccName TvName _) = True
225 isTvOcc other = False
227 isValOcc (OccName VarName _) = True
228 isValOcc (OccName DataName _) = True
229 isValOcc other = False
231 -- Data constructor operator (starts with ':', or '[]')
232 -- Pretty inefficient!
233 isDataSymOcc (OccName DataName s) = isLexConSym (decodeFS s)
234 isDataSymOcc other = False
236 isDataOcc (OccName DataName _) = True
237 isDataOcc other = False
239 -- Any operator (data constructor or variable)
240 -- Pretty inefficient!
241 isSymOcc (OccName DataName s) = isLexConSym (decodeFS s)
242 isSymOcc (OccName VarName s) = isLexSym (decodeFS s)
246 %************************************************************************
248 \subsection{Making system names}
250 %************************************************************************
252 Here's our convention for splitting up the interface file name space:
254 d... dictionary identifiers
255 (local variables, so no name-clash worries)
257 $f... dict-fun identifiers (from inst decls)
258 $dm... default methods
259 $p... superclass selectors
261 :T... compiler-generated tycons for dictionaries
262 :D... ...ditto data cons
263 $sf.. specialised version of f
265 in encoded form these appear as Zdfxxx etc
267 :... keywords (export:, letrec: etc.)
268 --- I THINK THIS IS WRONG!
270 This knowledge is encoded in the following functions.
273 @mk_deriv@ generates an @OccName@ from the prefix and a string.
274 NB: The string must already be encoded!
277 mk_deriv :: NameSpace
278 -> String -- Distinguishes one sort of derived name from another
279 -> EncodedString -- Must be already encoded!! We don't want to encode it a
280 -- second time because encoding isn't itempotent
283 mk_deriv occ_sp sys_prefix str = mkSysOcc occ_sp (encode sys_prefix ++ str)
287 mkDictOcc, mkIPOcc, mkWorkerOcc, mkDefaultMethodOcc,
288 mkClassTyConOcc, mkClassDataConOcc, mkSpecOcc
289 :: OccName -> OccName
291 -- These derived variables have a prefix that no Haskell value could have
292 mkWorkerOcc = mk_simple_deriv varName "$w"
293 mkDefaultMethodOcc = mk_simple_deriv varName "$dm"
294 mkDerivedTyConOcc = mk_simple_deriv tcName ":" -- The : prefix makes sure it classifies
295 mkClassTyConOcc = mk_simple_deriv tcName ":T" -- as a tycon/datacon
296 mkClassDataConOcc = mk_simple_deriv dataName ":D" --
297 mkDictOcc = mk_simple_deriv varName "$d"
298 mkIPOcc = mk_simple_deriv varName "$i"
299 mkSpecOcc = mk_simple_deriv varName "$s"
300 mkForeignExportOcc = mk_simple_deriv varName "$f"
301 mkGenOcc1 = mk_simple_deriv varName "$gfrom" -- Generics
302 mkGenOcc2 = mk_simple_deriv varName "$gto" -- Generics
303 mk_simple_deriv sp px occ = mk_deriv sp px (occNameString occ)
307 mkSuperDictSelOcc :: Int -- Index of superclass, eg 3
308 -> OccName -- Class, eg "Ord"
309 -> OccName -- eg "p3Ord"
310 mkSuperDictSelOcc index cls_occ
311 = mk_deriv varName "$p" (show index ++ occNameString cls_occ)
316 mkDFunOcc :: EncodedString -- Typically the class and type glommed together e.g. "OrdMaybe"
317 -> OccName -- "$fOrdMaybe"
319 mkDFunOcc string = mk_deriv VarName "$f" string
322 We used to add a '$m' to indicate a method, but that gives rise to bad
323 error messages from the type checker when we print the function name or pattern
324 of an instance-decl binding. Why? Because the binding is zapped
325 to use the method name in place of the selector name.
326 (See TcClassDcl.tcMethodBind)
328 The way it is now, -ddump-xx output may look confusing, but
329 you can always say -dppr-debug to get the uniques.
331 However, we *do* have to zap the first character to be lower case,
332 because overloaded constructors (blarg) generate methods too.
333 And convert to VarName space
335 e.g. a call to constructor MkFoo where
336 data (Ord a) => Foo a = MkFoo a
338 If this is necessary, we do it by prefixing '$m'. These
339 guys never show up in error messages. What a hack.
342 mkMethodOcc :: OccName -> OccName
343 mkMethodOcc occ@(OccName VarName fs) = occ
344 mkMethodOcc occ = mk_simple_deriv varName "$m" occ
348 %************************************************************************
350 \subsection{Tidying them up}
352 %************************************************************************
354 Before we print chunks of code we like to rename it so that
355 we don't have to print lots of silly uniques in it. But we mustn't
356 accidentally introduce name clashes! So the idea is that we leave the
357 OccName alone unless it accidentally clashes with one that is already
358 in scope; if so, we tack on '1' at the end and try again, then '2', and
359 so on till we find a unique one.
361 There's a wrinkle for operators. Consider '>>='. We can't use '>>=1'
362 because that isn't a single lexeme. So we encode it to 'lle' and *then*
363 tack on the '1', if necessary.
366 type TidyOccEnv = FiniteMap FAST_STRING Int -- The in-scope OccNames
367 emptyTidyOccEnv = emptyFM
369 initTidyOccEnv :: [OccName] -> TidyOccEnv -- Initialise with names to avoid!
370 initTidyOccEnv = foldl (\env (OccName _ fs) -> addToFM env fs 1) emptyTidyOccEnv
372 tidyOccName :: TidyOccEnv -> OccName -> (TidyOccEnv, OccName)
374 tidyOccName in_scope occ@(OccName occ_sp fs)
375 | not (fs `elemFM` in_scope)
376 = (addToFM in_scope fs 1, occ) -- First occurrence
378 | otherwise -- Already occurs
379 = go in_scope (_UNPK_ fs)
382 go in_scope str = case lookupFM in_scope pk_str of
383 Just n -> go (addToFM in_scope pk_str (n+1)) (str ++ show n)
384 -- Need to go round again, just in case "t3" (say)
385 -- clashes with a "t3" that's already in scope
387 Nothing -> (addToFM in_scope pk_str 1, mkSysOccFS occ_sp pk_str)
394 %************************************************************************
396 \subsection{The 'Z' encoding}
398 %************************************************************************
400 This is the main name-encoding and decoding function. It encodes any
401 string into a string that is acceptable as a C name. This is the name
402 by which things are known right through the compiler.
404 The basic encoding scheme is this.
406 * Tuples (,,,) are coded as Z3T
408 * Alphabetic characters (upper and lower) and digits
409 all translate to themselves;
410 except 'Z', which translates to 'ZZ'
411 and 'z', which translates to 'zz'
412 We need both so that we can preserve the variable/tycon distinction
414 * Most other printable characters translate to 'zx' or 'Zx' for some
415 alphabetic character x
417 * The others translate as 'znnnU' where 'nnn' is the decimal number
421 --------------------------
433 (# #) Z1H unboxed 1-tuple (note the space)
434 (#,,,,#) Z5H unboxed 5-tuple
435 (NB: There is no Z1T nor Z0H.)
438 -- alreadyEncoded is used in ASSERTs to check for encoded
439 -- strings. It isn't fail-safe, of course, because, say 'zh' might
440 -- be encoded or not.
441 alreadyEncoded :: String -> Bool
442 alreadyEncoded s = all ok s
445 -- This is a bit of a lie; if we really wanted spaces
446 -- in names we'd have to encode them. But we do put
447 -- spaces in ccall "occurrences", and we don't want to
449 ok ch = ISALPHANUM ch
451 alreadyEncodedFS :: FAST_STRING -> Bool
452 alreadyEncodedFS fs = alreadyEncoded (_UNPK_ fs)
454 encode :: UserString -> EncodedString
455 encode cs = case maybe_tuple cs of
456 Just n -> n -- Tuples go to Z2T etc
460 go (c:cs) = encode_ch c ++ go cs
462 maybe_tuple "(# #)" = Just("Z1H")
463 maybe_tuple ('(' : '#' : cs) = case count_commas (0::Int) cs of
464 (n, '#' : ')' : cs) -> Just ('Z' : shows (n+1) "H")
466 maybe_tuple "()" = Just("Z0T")
467 maybe_tuple ('(' : cs) = case count_commas (0::Int) cs of
468 (n, ')' : cs) -> Just ('Z' : shows (n+1) "T")
470 maybe_tuple other = Nothing
472 count_commas :: Int -> String -> (Int, String)
473 count_commas n (',' : cs) = count_commas (n+1) cs
474 count_commas n cs = (n,cs)
476 encodeFS :: UserFS -> EncodedFS
477 encodeFS fast_str | all unencodedChar str = fast_str
478 | otherwise = _PK_ (encode str)
480 str = _UNPK_ fast_str
482 unencodedChar :: Char -> Bool -- True for chars that don't need encoding
483 unencodedChar 'Z' = False
484 unencodedChar 'z' = False
485 unencodedChar c = c >= 'a' && c <= 'z'
486 || c >= 'A' && c <= 'Z'
487 || c >= '0' && c <= '9'
489 encode_ch :: Char -> EncodedString
490 encode_ch c | unencodedChar c = [c] -- Common case first
493 encode_ch '(' = "ZL" -- Needed for things like (,), and (->)
494 encode_ch ')' = "ZR" -- For symmetry with (
514 encode_ch '\'' = "zq"
515 encode_ch '\\' = "zr"
520 encode_ch c = 'z' : shows (ord c) "U"
523 Decode is used for user printing.
526 decodeFS :: FAST_STRING -> FAST_STRING
527 decodeFS fs = _PK_ (decode (_UNPK_ fs))
529 decode :: EncodedString -> UserString
531 decode ('Z' : rest) = decode_escape rest
532 decode ('z' : rest) = decode_escape rest
533 decode (c : rest) = c : decode rest
535 decode_escape :: EncodedString -> UserString
537 decode_escape ('L' : rest) = '(' : decode rest
538 decode_escape ('R' : rest) = ')' : decode rest
539 decode_escape ('M' : rest) = '[' : decode rest
540 decode_escape ('N' : rest) = ']' : decode rest
541 decode_escape ('C' : rest) = ':' : decode rest
542 decode_escape ('Z' : rest) = 'Z' : decode rest
544 decode_escape ('z' : rest) = 'z' : decode rest
545 decode_escape ('a' : rest) = '&' : decode rest
546 decode_escape ('b' : rest) = '|' : decode rest
547 decode_escape ('c' : rest) = '^' : decode rest
548 decode_escape ('d' : rest) = '$' : decode rest
549 decode_escape ('e' : rest) = '=' : decode rest
550 decode_escape ('g' : rest) = '>' : decode rest
551 decode_escape ('h' : rest) = '#' : decode rest
552 decode_escape ('i' : rest) = '.' : decode rest
553 decode_escape ('l' : rest) = '<' : decode rest
554 decode_escape ('m' : rest) = '-' : decode rest
555 decode_escape ('n' : rest) = '!' : decode rest
556 decode_escape ('p' : rest) = '+' : decode rest
557 decode_escape ('q' : rest) = '\'' : decode rest
558 decode_escape ('r' : rest) = '\\' : decode rest
559 decode_escape ('s' : rest) = '/' : decode rest
560 decode_escape ('t' : rest) = '*' : decode rest
561 decode_escape ('u' : rest) = '_' : decode rest
562 decode_escape ('v' : rest) = '%' : decode rest
564 -- Tuples are coded as Z23T
565 -- Characters not having a specific code are coded as z224U
566 decode_escape (c : rest)
567 | isDigit c = go (digitToInt c) rest
569 go n (c : rest) | isDigit c = go (10*n + digitToInt c) rest
570 go 0 ('T' : rest) = "()" ++ (decode rest)
571 go n ('T' : rest) = '(' : replicate (n-1) ',' ++ ')' : decode rest
572 go 1 ('H' : rest) = "(# #)" ++ (decode rest)
573 go n ('H' : rest) = '(' : '#' : replicate (n-1) ',' ++ '#' : ')' : decode rest
574 go n ('U' : rest) = chr n : decode rest
575 go n other = pprPanic "decode_escape" (ppr n <+> text (c:rest))
577 decode_escape (c : rest) = pprTrace "decode_escape" (char c) (decode rest)
581 %************************************************************************
583 \subsection{Lexical categories}
585 %************************************************************************
587 These functions test strings to see if they fit the lexical categories
588 defined in the Haskell report.
591 isLexCon, isLexVar, isLexId, isLexSym :: FAST_STRING -> Bool
592 isLexConId, isLexConSym, isLexVarId, isLexVarSym :: FAST_STRING -> Bool
594 isLexCon cs = isLexConId cs || isLexConSym cs
595 isLexVar cs = isLexVarId cs || isLexVarSym cs
597 isLexId cs = isLexConId cs || isLexVarId cs
598 isLexSym cs = isLexConSym cs || isLexVarSym cs
602 isLexConId cs -- Prefix type or data constructors
603 | _NULL_ cs = False -- e.g. "Foo", "[]", "(,)"
604 | cs == SLIT("[]") = True
605 | otherwise = startsConId (_HEAD_ cs)
607 isLexVarId cs -- Ordinary prefix identifiers
608 | _NULL_ cs = False -- e.g. "x", "_x"
609 | otherwise = startsVarId (_HEAD_ cs)
611 isLexConSym cs -- Infix type or data constructors
612 | _NULL_ cs = False -- e.g. ":-:", ":", "->"
613 | cs == SLIT("->") = True
614 | otherwise = startsConSym (_HEAD_ cs)
616 isLexVarSym cs -- Infix identifiers
617 | _NULL_ cs = False -- e.g. "+"
618 | otherwise = startsVarSym (_HEAD_ cs)
621 startsVarSym, startsVarId, startsConSym, startsConId :: Char -> Bool
622 startsVarSym c = isSymbolASCII c || isSymbolISO c -- Infix Ids
623 startsConSym c = c == ':' -- Infix data constructors
624 startsVarId c = isLower c || isLowerISO c || c == '_' -- Ordinary Ids
625 startsConId c = isUpper c || isUpperISO c || c == '(' -- Ordinary type constructors and data constructors
628 isSymbolASCII c = c `elem` "!#$%&*+./<=>?@\\^|~-"
629 isSymbolISO c = ord c `elem` (0xd7 : 0xf7 : [0xa1 .. 0xbf])
630 isUpperISO (C# c#) = c# `geChar#` '\xc0'# && c# `leChar#` '\xde'# && c# `neChar#` '\xd7'#
631 --0xc0 <= oc && oc <= 0xde && oc /= 0xd7 where oc = ord c
632 isLowerISO (C# c#) = c# `geChar#` '\xdf'# && c# `leChar#` '\xff'# && c# `neChar#` '\xf7'#
633 --0xdf <= oc && oc <= 0xff && oc /= 0xf7 where oc = ord c