2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[Name]{@Name@: to transmit name info from renamer to typechecker}
7 #include "HsVersions.h"
15 isRdrLexCon, isRdrLexConOrSpecial,
22 mkLocalName, isLocalName,
23 mkTopLevName, mkImportedName,
24 mkImplicitName, isImplicitName,
25 mkBuiltinName, mkCompoundName, mkCompoundName2,
27 mkFunTyConName, mkTupleDataConName, mkTupleTyConName,
30 NamedThing(..), -- class
32 isExported{-overloaded-}, exportFlagOn{-not-},
34 nameUnique, changeUnique,
44 origName, moduleOf, nameOf, moduleNamePair,
45 getOccName, getExportFlag,
46 getSrcLoc, getImpLocs,
47 isLocallyDefined, isPreludeDefined,
48 getLocalName, ltLexical,
50 isSymLexeme, pprSym, pprNonSym,
51 isLexCon, isLexVar, isLexId, isLexSym, isLexSpecialSym,
52 isLexConId, isLexConSym, isLexVarId, isLexVarSym
57 import CStrings ( identToC, cSEP )
58 import Outputable ( Outputable(..) )
59 import PprStyle ( PprStyle(..), codeStyle )
60 import PrelMods ( pRELUDE, pRELUDE_BUILTIN, fromPrelude )
62 import SrcLoc ( mkBuiltinSrcLoc, mkUnknownSrcLoc )
63 import Unique ( funTyConKey, mkTupleDataConUnique, mkTupleTyConUnique,
66 import Util ( thenCmp, _CMP_STRING_, nOfThem, panic, assertPanic )
69 %************************************************************************
71 \subsection[RdrName]{The @RdrName@ datatype; names read from files}
73 %************************************************************************
76 type Module = FAST_STRING
80 | Qual Module FAST_STRING
82 isUnqual (Unqual _) = True
83 isUnqual (Qual _ _) = False
85 isQual (Unqual _) = False
86 isQual (Qual _ _) = True
88 isRdrLexCon (Unqual n) = isLexCon n
89 isRdrLexCon (Qual m n) = isLexCon n
91 isRdrLexConOrSpecial (Unqual n) = isLexCon n || isLexSpecialSym n
92 isRdrLexConOrSpecial (Qual m n) = isLexCon n || isLexSpecialSym n
94 appendRdr (Unqual n) str = Unqual (n _APPEND_ str)
95 appendRdr (Qual m n) str = ASSERT(not (fromPrelude m))
96 Qual m (n _APPEND_ str)
98 cmpRdr (Unqual n1) (Unqual n2) = _CMP_STRING_ n1 n2
99 cmpRdr (Unqual n1) (Qual m2 n2) = LT_
100 cmpRdr (Qual m1 n1) (Unqual n2) = GT_
101 cmpRdr (Qual m1 n1) (Qual m2 n2) = _CMP_STRING_ m1 m2 `thenCmp` _CMP_STRING_ n1 n2
103 instance Eq RdrName where
104 a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False }
105 a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True }
107 instance Ord RdrName where
108 a <= b = case (a `cmp` b) of { LT_ -> True; EQ_ -> True; GT__ -> False }
109 a < b = case (a `cmp` b) of { LT_ -> True; EQ_ -> False; GT__ -> False }
110 a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True; GT__ -> True }
111 a > b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True }
113 instance Ord3 RdrName where
116 instance NamedThing RdrName where
117 -- We're sorta faking it here
119 = Global u rdr_name prov ex [rdr_name]
121 u = panic "NamedThing.RdrName:Unique"
122 prov = panic "NamedThing.RdrName:Provenance"
123 ex = panic "NamedThing.RdrName:ExportFlag"
125 instance Outputable RdrName where
126 ppr sty (Unqual n) = pp_name sty n
127 ppr sty (Qual m n) = ppBeside (pp_mod sty m) (pp_name sty n)
129 pp_mod PprForC m = ppBesides [identToC m, ppPStr cSEP]
130 pp_mod (PprForAsm False _) m = ppBesides [identToC m, ppPStr cSEP]
131 pp_mod (PprForAsm True _) m = ppBesides [ppPStr cSEP, identToC m, ppPStr cSEP]
132 pp_mod _ m = ppBesides [ppPStr m, ppChar '.']
134 pp_name sty n | codeStyle sty = identToC n
135 | otherwise = ppPStr n
137 showRdr sty rdr = ppShow 100 (ppr sty rdr)
140 %************************************************************************
142 \subsection[Name-datatype]{The @Name@ datatype}
144 %************************************************************************
150 Bool -- True <=> emphasize Unique when
151 -- printing; this is just an esthetic thing...
155 RdrName -- original name; Unqual => prelude
156 Provenance -- where it came from
157 ExportFlag -- is it exported?
158 [RdrName] -- ordered occurrence names (usually just one);
159 -- first may be *un*qual.
162 = LocalDef SrcLoc -- locally defined; give its source location
164 | Imported ExportFlag -- how it was imported
165 SrcLoc -- *original* source location
166 [SrcLoc] -- any import source location(s)
175 mkTopLevName u orig locn exp occs = Global u orig (LocalDef locn) exp occs
176 mkImportedName u orig imp locn imp_locs exp occs = Global u orig (Imported imp locn imp_locs) exp occs
178 mkImplicitName :: Unique -> RdrName -> Name
179 mkImplicitName u o = Global u o Implicit NotExported []
181 mkBuiltinName :: Unique -> Module -> FAST_STRING -> Name
183 = Global u (if fromPrelude m then Unqual n else Qual m n) Builtin NotExported []
185 mkCompoundName :: Unique
186 -> FAST_STRING -- indicates what kind of compound thing it is (e.g., "sdsel")
187 -> [RdrName] -- "dot" these names together
188 -> Name -- from which we get provenance, etc....
191 mkCompoundName u str ns (Local _ _ _ _) = panic "mkCompoundName:Local?"
192 mkCompoundName u str ns (Global _ _ prov exp _)
193 = Global u (Unqual{-???-} (_CONCAT_ (glue ns [str]))) prov exp []
195 glue [] acc = reverse acc
196 glue (Unqual n:ns) acc = glue ns (_CONS_ '.' n : acc)
197 glue (Qual m n:ns) acc = glue ns (_CONS_ '.' n : _CONS_ '.' m : acc)
199 -- this ugly one is used for instance-y things
200 mkCompoundName2 :: Unique
201 -> FAST_STRING -- indicates what kind of compound thing it is (e.g., "sdsel")
202 -> [RdrName] -- "dot" these names together
203 -> [FAST_STRING] -- type-name strings
204 -> Bool -- True <=> defined in this module
208 mkCompoundName2 u str ns ty_strs from_here locn
209 = Global u (Unqual{-???-} ((_CONCAT_ (glue ns [str])) _APPEND_ (_CONS_ '.' (_CONCAT_ ty_strs))))
210 (if from_here then LocalDef locn else Imported ExportAll locn [])
211 ExportAll{-instances-}
215 = mkBuiltinName funTyConKey pRELUDE_BUILTIN SLIT("->")
216 mkTupleDataConName arity
217 = mkBuiltinName (mkTupleDataConUnique arity) pRELUDE_BUILTIN (mkTupNameStr arity)
218 mkTupleTyConName arity
219 = mkBuiltinName (mkTupleTyConUnique arity) pRELUDE_BUILTIN (mkTupNameStr arity)
221 mkTupNameStr 0 = SLIT("()")
222 mkTupNameStr 1 = panic "Name.mkTupNameStr: 1 ???"
223 mkTupNameStr 2 = SLIT("(,)") -- not strictly necessary
224 mkTupNameStr 3 = SLIT("(,,)") -- ditto
225 mkTupNameStr 4 = SLIT("(,,,)") -- ditto
227 = _PK_ ("(" ++ nOfThem (n-1) ',' ++ ")")
229 -- ToDo: what about module ???
230 -- ToDo: exported when compiling builtin ???
232 isLocalName (Local _ _ _ _) = True
233 isLocalName _ = False
235 isImplicitName (Global _ _ Implicit _ _) = True
236 isImplicitName _ = False
238 isBuiltinName (Global _ _ Builtin _ _) = True
239 isBuiltinName _ = False
244 %************************************************************************
246 \subsection[Name-instances]{Instance declarations}
248 %************************************************************************
251 cmpName n1 n2 = c n1 n2
253 c (Local u1 _ _ _) (Local u2 _ _ _) = cmp u1 u2
254 c (Global u1 _ _ _ _) (Global u2 _ _ _ _) = cmp u1 u2
256 c other_1 other_2 -- the tags *must* be different
257 = let tag1 = tag_Name n1
260 if tag1 _LT_ tag2 then LT_ else GT_
262 tag_Name (Local _ _ _ _) = (ILIT(1) :: FAST_INT)
263 tag_Name (Global _ _ _ _ _) = ILIT(2)
267 instance Eq Name where
268 a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False }
269 a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True }
271 instance Ord Name where
272 a <= b = case (a `cmp` b) of { LT_ -> True; EQ_ -> True; GT__ -> False }
273 a < b = case (a `cmp` b) of { LT_ -> True; EQ_ -> False; GT__ -> False }
274 a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True; GT__ -> True }
275 a > b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True }
277 instance Ord3 Name where
280 instance Uniquable Name where
281 uniqueOf = nameUnique
283 instance NamedThing Name where
288 nameUnique (Local u _ _ _) = u
289 nameUnique (Global u _ _ _ _) = u
291 -- when we renumber/rename things, we need to be
292 -- able to change a Name's Unique to match the cached
293 -- one in the thing it's the name of. If you know what I mean.
294 changeUnique (Local _ n b l) u = Local u n b l
295 changeUnique n@(Global _ o p e os) u = ASSERT(not (isBuiltinName n))
298 nameOrigName (Local _ n _ _) = Unqual n
299 nameOrigName (Global _ orig _ _ _) = orig
301 nameModuleNamePair (Local _ n _ _) = (panic "nameModuleNamePair", n)
302 nameModuleNamePair (Global _ (Unqual n) _ _ _) = (pRELUDE, n)
303 nameModuleNamePair (Global _ (Qual m n) _ _ _) = (m, n)
305 nameOccName (Local _ n _ _) = Unqual n
306 nameOccName (Global _ orig _ _ [] ) = orig
307 nameOccName (Global _ orig _ _ occs) = head occs
309 nameExportFlag (Local _ _ _ _) = NotExported
310 nameExportFlag (Global _ _ _ exp _) = exp
312 nameSrcLoc (Local _ _ _ loc) = loc
313 nameSrcLoc (Global _ _ (LocalDef loc) _ _) = loc
314 nameSrcLoc (Global _ _ (Imported _ loc _) _ _) = loc
315 nameSrcLoc (Global _ _ Implicit _ _) = mkUnknownSrcLoc
316 nameSrcLoc (Global _ _ Builtin _ _) = mkBuiltinSrcLoc
318 nameImpLocs (Global _ _ (Imported _ _ locs) _ _) = locs
321 nameImportFlag (Local _ _ _ _) = NotExported
322 nameImportFlag (Global _ _ (LocalDef _) _ _) = ExportAll
323 nameImportFlag (Global _ _ (Imported exp _ _) _ _) = exp
324 nameImportFlag (Global _ _ Implicit _ _) = ExportAll
325 nameImportFlag (Global _ _ Builtin _ _) = ExportAll
327 isLocallyDefinedName (Local _ _ _ _) = True
328 isLocallyDefinedName (Global _ _ (LocalDef _) _ _) = True
329 isLocallyDefinedName (Global _ _ (Imported _ _ _) _ _) = False
330 isLocallyDefinedName (Global _ _ Implicit _ _) = False
331 isLocallyDefinedName (Global _ _ Builtin _ _) = False
333 isPreludeDefinedName (Local _ n _ _) = False
334 isPreludeDefinedName (Global _ orig _ _ _) = isUnqual orig
338 instance Outputable Name where
339 ppr sty (Local u n emph_uniq _)
340 | codeStyle sty = pprUnique u
341 | emph_uniq = ppBesides [pprUnique u, ppStr "{-", ppPStr n, ppStr "-}"]
342 | otherwise = ppBesides [ppPStr n, ppStr "{-", pprUnique u, ppStr "-}"]
344 ppr PprDebug (Global u o _ _ _) = ppBesides [ppr PprDebug o, ppStr "{-", pprUnique u, ppStr "-}"]
345 ppr PprForUser (Global u o _ _ [] ) = ppr PprForUser o
346 ppr PprForUser (Global u o _ _ occs) = ppr PprForUser (head occs)
347 ppr PprShowAll (Global u o prov exp occs) = pp_all o prov exp occs
348 ppr sty (Global u o _ _ _) = ppr sty o
350 pp_all orig prov exp occs
351 = ppBesides [ppr PprShowAll orig, ppr PprShowAll occs, pp_prov prov, pp_exp exp]
353 pp_exp NotExported = ppNil
354 pp_exp ExportAll = ppPStr SLIT("/EXP(..)")
355 pp_exp ExportAbs = ppPStr SLIT("/EXP")
357 pp_prov Implicit = ppPStr SLIT("/IMPLICIT")
358 pp_prov Builtin = ppPStr SLIT("/BUILTIN")
362 %************************************************************************
364 \subsection[ExportFlag-datatype]{The @ExportFlag@ datatype}
366 %************************************************************************
368 The export flag @ExportAll@ means `export all there is', so there are
369 times when it is attached to a class or data type which has no
370 ops/constructors (if the class/type was imported abstractly). In
371 fact, @ExportAll@ is attached to everything except to classes/types
372 which are being {\em exported} abstractly, regardless of how they were
377 = ExportAll -- export with all constructors/methods
378 | ExportAbs -- export abstractly (tycons/classes only)
381 exportFlagOn NotExported = False
382 exportFlagOn _ = True
384 isExported a = exportFlagOn (getExportFlag a)
387 %************************************************************************
389 \subsection{Overloaded functions related to Names}
391 %************************************************************************
394 class NamedThing a where
399 origName :: NamedThing a => a -> RdrName
400 moduleOf :: RdrName -> Module
401 nameOf :: RdrName -> FAST_STRING
402 moduleNamePair :: NamedThing a => a -> (Module, FAST_STRING)
404 getOccName :: NamedThing a => a -> RdrName
405 getLocalName :: NamedThing a => a -> FAST_STRING
406 getExportFlag :: NamedThing a => a -> ExportFlag
407 getSrcLoc :: NamedThing a => a -> SrcLoc
408 getImpLocs :: NamedThing a => a -> [SrcLoc]
409 isLocallyDefined :: NamedThing a => a -> Bool
410 isPreludeDefined :: NamedThing a => a -> Bool
412 -- ToDo: specialise for RdrNames?
413 origName = nameOrigName . getName
414 moduleNamePair = nameModuleNamePair . getName
416 moduleOf (Unqual n) = pRELUDE
417 moduleOf (Qual m n) = m
419 nameOf (Unqual n) = n
420 nameOf (Qual m n) = n
422 getLocalName = nameOf . origName
424 getOccName = nameOccName . getName
425 getExportFlag = nameExportFlag . getName
426 getSrcLoc = nameSrcLoc . getName
427 getImpLocs = nameImpLocs . getName
428 isLocallyDefined = isLocallyDefinedName . getName
429 isPreludeDefined = isPreludeDefinedName . getName
432 @ltLexical@ is used for sorting things into lexicographical order, so
433 as to canonicalize interfaces. [Regular @(<)@ should be used for fast
437 a `ltLexical` b = origName a < origName b
440 These functions test strings to see if they fit the lexical categories
441 defined in the Haskell report. Normally applied as in e.g. @isCon
445 isLexCon, isLexVar, isLexId, isLexSym, isLexConId, isLexConSym,
446 isLexVarId, isLexVarSym, isLexSpecialSym :: FAST_STRING -> Bool
448 isLexCon cs = isLexConId cs || isLexConSym cs
449 isLexVar cs = isLexVarId cs || isLexVarSym cs
451 isLexId cs = isLexConId cs || isLexVarId cs
452 isLexSym cs = isLexConSym cs || isLexVarSym cs
458 | c == '_' = isLexConId (_TAIL_ cs) -- allow for leading _'s
459 | otherwise = isUpper c || isUpperISO c
465 | c == '_' = isLexVarId (_TAIL_ cs) -- allow for leading _'s
466 | otherwise = isLower c || isLowerISO c
472 | otherwise = c == ':'
473 -- || c == '(' -- (), (,), (,,), ...
475 -- || cs == SLIT("[]")
481 | otherwise = isSymbolASCII c
483 -- || c == '(' -- (), (,), (,,), ...
484 -- || cs == SLIT("[]")
490 | otherwise = c == '(' -- (), (,), (,,), ...
496 isSymbolASCII c = c `elem` "!#$%&*+./<=>?@\\^|~-"
497 isSymbolISO c = ord c `elem` (0xd7 : 0xf7 : [0xa1 .. 0xbf])
498 isUpperISO c = 0xc0 <= oc && oc <= 0xde && oc /= 0xd7 where oc = ord c
499 isLowerISO c = 0xdf <= oc && oc <= 0xff && oc /= 0xf7 where oc = ord c
502 And one ``higher-level'' interface to those:
505 isSymLexeme :: NamedThing a => a -> Bool
508 = let str = nameOf (origName v) in isLexSym str
510 -- print `vars`, (op) correctly
511 pprSym, pprNonSym :: (NamedThing name, Outputable name) => PprStyle -> name -> Pretty
515 str = nameOf (origName var)
517 if isLexSym str && not (isLexSpecialSym str)
519 else ppBesides [ppChar '`', ppr sty var, ppChar '`']
523 then ppParens (ppr sty var)