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"
22 mkLocalName, isLocalName,
23 mkTopLevName, mkImportedName,
24 mkImplicitName, isImplicitName,
25 mkBuiltinName, mkCompoundName,
27 mkFunTyConName, mkTupleDataConName, mkTupleTyConName,
30 NamedThing(..), -- class
32 isExported{-overloaded-}, exportFlagOn{-not-},
43 origName, moduleOf, nameOf, moduleNamePair,
44 getOccName, getExportFlag,
45 getSrcLoc, isLocallyDefined, isPreludeDefined,
46 getLocalName, ltLexical,
48 isSymLexeme, pprSym, pprNonSym,
49 isLexCon, isLexVar, isLexId, isLexSym,
50 isLexConId, isLexConSym, isLexVarId, isLexVarSym
55 import CStrings ( identToC, cSEP )
56 import Outputable ( Outputable(..) )
57 import PprStyle ( PprStyle(..), codeStyle )
58 import PrelMods ( pRELUDE, pRELUDE_BUILTIN, fromPrelude )
60 import SrcLoc ( mkBuiltinSrcLoc, mkUnknownSrcLoc )
61 import Unique ( funTyConKey, mkTupleDataConUnique, mkTupleTyConUnique,
64 import Util ( thenCmp, _CMP_STRING_, nOfThem, panic, assertPanic )
67 %************************************************************************
69 \subsection[RdrName]{The @RdrName@ datatype; names read from files}
71 %************************************************************************
74 type Module = FAST_STRING
78 | Qual Module FAST_STRING
80 isUnqual (Unqual _) = True
81 isUnqual (Qual _ _) = False
83 isQual (Unqual _) = False
84 isQual (Qual _ _) = True
86 isRdrLexCon (Unqual n) = isLexCon n
87 isRdrLexCon (Qual m n) = isLexCon n
89 appendRdr (Unqual n) str = Unqual (n _APPEND_ str)
90 appendRdr (Qual m n) str = ASSERT(not (fromPrelude m))
91 Qual m (n _APPEND_ str)
93 cmpRdr (Unqual n1) (Unqual n2) = _CMP_STRING_ n1 n2
94 cmpRdr (Unqual n1) (Qual m2 n2) = LT_
95 cmpRdr (Qual m1 n1) (Unqual n2) = GT_
96 cmpRdr (Qual m1 n1) (Qual m2 n2) = thenCmp (_CMP_STRING_ m1 m2) (_CMP_STRING_ n1 n2)
98 instance Eq RdrName where
99 a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False }
100 a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True }
102 instance Ord RdrName where
103 a <= b = case (a `cmp` b) of { LT_ -> True; EQ_ -> True; GT__ -> False }
104 a < b = case (a `cmp` b) of { LT_ -> True; EQ_ -> False; GT__ -> False }
105 a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True; GT__ -> True }
106 a > b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True }
108 instance Ord3 RdrName where
111 instance NamedThing RdrName where
112 -- We're sorta faking it here
114 = Global u rdr_name prov ex [rdr_name]
116 u = panic "NamedThing.RdrName:Unique"
117 prov = panic "NamedThing.RdrName:Provenance"
118 ex = panic "NamedThing.RdrName:ExportFlag"
120 instance Outputable RdrName where
121 ppr sty (Unqual n) = pp_name sty n
122 ppr sty (Qual m n) = ppBeside (pp_mod sty m) (pp_name sty n)
124 pp_mod PprInterface m = ppNil
125 pp_mod PprForC m = ppBesides [identToC m, ppPStr cSEP]
126 pp_mod (PprForAsm False _) m = ppBesides [identToC m, ppPStr cSEP]
127 pp_mod (PprForAsm True _) m = ppBesides [ppPStr cSEP, identToC m, ppPStr cSEP]
128 pp_mod _ m = ppBesides [ppPStr m, ppChar '.']
130 pp_name sty n | codeStyle sty = identToC n
131 | otherwise = ppPStr n
133 showRdr sty rdr = ppShow 100 (ppr sty rdr)
136 %************************************************************************
138 \subsection[Name-datatype]{The @Name@ datatype}
140 %************************************************************************
149 RdrName -- original name; Unqual => prelude
150 Provenance -- where it came from
151 ExportFlag -- is it exported?
152 [RdrName] -- ordered occurrence names (usually just one);
153 -- first may be *un*qual.
156 = LocalDef SrcLoc -- locally defined; give its source location
158 | Imported ExportFlag -- how it was imported
159 SrcLoc -- *original* source location
160 -- [SrcLoc] -- any import source location(s)
169 mkTopLevName u orig locn exp occs = Global u orig (LocalDef locn) exp occs
170 mkImportedName u orig imp locn exp occs = Global u orig (Imported imp locn) exp occs
172 mkImplicitName :: Unique -> RdrName -> Name
173 mkImplicitName u o = Global u o Implicit NotExported []
175 mkBuiltinName :: Unique -> Module -> FAST_STRING -> Name
176 mkBuiltinName u m n = Global u (Unqual n) Builtin NotExported []
178 mkCompoundName :: Unique -> [FAST_STRING] -> Name
180 = Global u (Unqual{-???-} (_CONCAT_ (dotify ns))) Builtin{--} NotExported []
184 dotify (n:ns) = n : (map (_CONS_ '.') ns)
187 = mkBuiltinName funTyConKey pRELUDE_BUILTIN SLIT("->")
188 mkTupleDataConName arity
189 = mkBuiltinName (mkTupleDataConUnique arity) pRELUDE_BUILTIN (mkTupNameStr arity)
190 mkTupleTyConName arity
191 = mkBuiltinName (mkTupleTyConUnique arity) pRELUDE_BUILTIN (mkTupNameStr arity)
193 mkTupNameStr 0 = SLIT("()")
194 mkTupNameStr 1 = panic "Name.mkTupNameStr: 1 ???"
195 mkTupNameStr 2 = SLIT("(,)") -- not strictly necessary
196 mkTupNameStr 3 = SLIT("(,,)") -- ditto
197 mkTupNameStr 4 = SLIT("(,,,)") -- ditto
199 = _PK_ ("(" ++ nOfThem (n-1) ',' ++ ")")
201 -- ToDo: what about module ???
202 -- ToDo: exported when compiling builtin ???
204 isLocalName (Local _ _ _) = True
205 isLocalName _ = False
207 isImplicitName (Global _ _ Implicit _ _) = True
208 isImplicitName _ = False
210 isBuiltinName (Global _ _ Builtin _ _) = True
211 isBuiltinName _ = False
216 %************************************************************************
218 \subsection[Name-instances]{Instance declarations}
220 %************************************************************************
223 cmpName n1 n2 = c n1 n2
225 c (Local u1 _ _) (Local u2 _ _) = cmp u1 u2
226 c (Global u1 _ _ _ _) (Global u2 _ _ _ _) = cmp u1 u2
228 c other_1 other_2 -- the tags *must* be different
229 = let tag1 = tag_Name n1
232 if tag1 _LT_ tag2 then LT_ else GT_
234 tag_Name (Local _ _ _) = (ILIT(1) :: FAST_INT)
235 tag_Name (Global _ _ _ _ _) = ILIT(2)
239 instance Eq Name where
240 a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False }
241 a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True }
243 instance Ord Name where
244 a <= b = case (a `cmp` b) of { LT_ -> True; EQ_ -> True; GT__ -> False }
245 a < b = case (a `cmp` b) of { LT_ -> True; EQ_ -> False; GT__ -> False }
246 a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True; GT__ -> True }
247 a > b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True }
249 instance Ord3 Name where
252 instance Uniquable Name where
253 uniqueOf = nameUnique
255 instance NamedThing Name where
260 nameUnique (Local u _ _) = u
261 nameUnique (Global u _ _ _ _) = u
263 nameOrigName (Local _ n _) = Unqual n
264 nameOrigName (Global _ orig _ _ _) = orig
266 nameModuleNamePair (Local _ n _) = (panic "nameModuleNamePair", n)
267 nameModuleNamePair (Global _ (Unqual n) _ _ _) = (pRELUDE, n)
268 nameModuleNamePair (Global _ (Qual m n) _ _ _) = (m, n)
270 nameOccName (Local _ n _) = Unqual n
271 nameOccName (Global _ orig _ _ [] ) = orig
272 nameOccName (Global _ orig _ _ occs) = head occs
274 nameExportFlag (Local _ _ _) = NotExported
275 nameExportFlag (Global _ _ _ exp _) = exp
277 nameSrcLoc (Local _ _ loc) = loc
278 nameSrcLoc (Global _ _ (LocalDef loc) _ _) = loc
279 nameSrcLoc (Global _ _ (Imported _ loc) _ _) = loc
280 nameSrcLoc (Global _ _ Implicit _ _) = mkUnknownSrcLoc
281 nameSrcLoc (Global _ _ Builtin _ _) = mkBuiltinSrcLoc
283 nameImportFlag (Local _ _ _) = NotExported
284 nameImportFlag (Global _ _ (LocalDef _) _ _) = ExportAll
285 nameImportFlag (Global _ _ (Imported exp _) _ _) = exp
286 nameImportFlag (Global _ _ Implicit _ _) = ExportAll
287 nameImportFlag (Global _ _ Builtin _ _) = ExportAll
289 isLocallyDefinedName (Local _ _ _) = True
290 isLocallyDefinedName (Global _ _ (LocalDef _) _ _) = True
291 isLocallyDefinedName (Global _ _ (Imported _ _) _ _) = False
292 isLocallyDefinedName (Global _ _ Implicit _ _) = False
293 isLocallyDefinedName (Global _ _ Builtin _ _) = False
295 isPreludeDefinedName (Local _ n _) = False
296 isPreludeDefinedName (Global _ orig _ _ _) = isUnqual orig
300 instance Outputable Name where
302 ppr PprDebug (Local u n _) = pp_debug u (ppPStr n)
303 ppr PprDebug (Global u o _ _ _) = pp_debug u (ppr PprDebug o)
305 ppr sty (Local u n _) = pp_name sty n
306 ppr PprForUser (Global u o _ _ [] ) = ppr PprForUser o
307 ppr PprForUser (Global u o _ _ occs) = ppr PprForUser (head occs)
308 ppr PprShowAll (Global u o prov exp occs) = pp_all o prov exp occs
309 ppr sty (Global u o _ _ _) = ppr sty o
312 = ppBesides [thing, ppStr "{-", pprUnique uniq, ppStr "-}" ]
314 pp_all orig prov exp occs
315 = ppBesides [ppr PprShowAll orig, ppr PprShowAll occs, pp_prov prov, pp_exp exp]
317 pp_exp NotExported = ppNil
318 pp_exp ExportAll = ppPStr SLIT("/EXP(..)")
319 pp_exp ExportAbs = ppPStr SLIT("/EXP")
321 pp_prov Implicit = ppPStr SLIT("/IMPLICIT")
322 pp_prov Builtin = ppPStr SLIT("/BUILTIN")
326 %************************************************************************
328 \subsection[ExportFlag-datatype]{The @ExportFlag@ datatype}
330 %************************************************************************
332 The export flag @ExportAll@ means `export all there is', so there are
333 times when it is attached to a class or data type which has no
334 ops/constructors (if the class/type was imported abstractly). In
335 fact, @ExportAll@ is attached to everything except to classes/types
336 which are being {\em exported} abstractly, regardless of how they were
341 = ExportAll -- export with all constructors/methods
342 | ExportAbs -- export abstractly (tycons/classes only)
345 exportFlagOn NotExported = False
346 exportFlagOn _ = True
348 isExported a = exportFlagOn (getExportFlag a)
350 #ifdef USE_ATTACK_PRAGMAS
351 {-# SPECIALIZE isExported :: Class -> Bool #-}
352 {-# SPECIALIZE isExported :: Id -> Bool #-}
353 {-# SPECIALIZE isExported :: TyCon -> Bool #-}
357 %************************************************************************
359 \subsection{Overloaded functions related to Names}
361 %************************************************************************
364 class NamedThing a where
369 origName :: NamedThing a => a -> RdrName
370 moduleOf :: RdrName -> Module
371 nameOf :: RdrName -> FAST_STRING
372 moduleNamePair :: NamedThing a => a -> (Module, FAST_STRING)
374 getOccName :: NamedThing a => a -> RdrName
375 getLocalName :: NamedThing a => a -> FAST_STRING
376 getExportFlag :: NamedThing a => a -> ExportFlag
377 getSrcLoc :: NamedThing a => a -> SrcLoc
378 isLocallyDefined :: NamedThing a => a -> Bool
379 isPreludeDefined :: NamedThing a => a -> Bool
381 -- ToDo: specialise for RdrNames?
382 origName = nameOrigName . getName
383 moduleNamePair = nameModuleNamePair . getName
385 moduleOf (Unqual n) = pRELUDE
386 moduleOf (Qual m n) = m
388 nameOf (Unqual n) = n
389 nameOf (Qual m n) = n
391 getLocalName = nameOf . origName
393 getOccName = nameOccName . getName
394 getExportFlag = nameExportFlag . getName
395 getSrcLoc = nameSrcLoc . getName
396 isLocallyDefined = isLocallyDefinedName . getName
397 isPreludeDefined = isPreludeDefinedName . getName
400 @ltLexical@ is used for sorting things into lexicographical order, so
401 as to canonicalize interfaces. [Regular @(<)@ should be used for fast
405 a `ltLexical` b = origName a < origName b
407 #ifdef USE_ATTACK_PRAGMAS
408 {-# SPECIALIZE ltLexical :: Class -> Class -> Bool #-}
409 {-# SPECIALIZE ltLexical :: Id -> Id -> Bool #-}
410 {-# SPECIALIZE ltLexical :: TyCon -> TyCon -> Bool #-}
414 These functions test strings to see if they fit the lexical categories
415 defined in the Haskell report. Normally applied as in e.g. @isCon
419 isLexCon, isLexVar, isLexId, isLexSym, isLexConId, isLexConSym, isLexVarId, isLexVarSym :: FAST_STRING -> Bool
421 isLexCon cs = isLexConId cs || isLexConSym cs
422 isLexVar cs = isLexVarId cs || isLexVarSym cs
424 isLexId cs = isLexConId cs || isLexVarId cs
425 isLexSym cs = isLexConSym cs || isLexVarSym cs
431 | c == '_' = isLexConId (_TAIL_ cs) -- allow for leading _'s
432 | otherwise = isUpper c || isUpperISO c
438 | c == '_' = isLexVarId (_TAIL_ cs) -- allow for leading _'s
439 | otherwise = isLower c || isLowerISO c
445 | otherwise = c == ':'
446 || c == '(' -- (), (,), (,,), ...
454 | otherwise = isSymbolASCII c
456 || c == '(' -- (), (,), (,,), ...
462 isSymbolASCII c = c `elem` "!#$%&*+./<=>?@\\^|~-"
463 isSymbolISO c = ord c `elem` (0xd7 : 0xf7 : [0xa1 .. 0xbf])
464 isUpperISO c = 0xc0 <= oc && oc <= 0xde && oc /= 0xd7 where oc = ord c
465 isLowerISO c = 0xdf <= oc && oc <= 0xff && oc /= 0xf7 where oc = ord c
468 And one ``higher-level'' interface to those:
471 isSymLexeme :: NamedThing a => a -> Bool
474 = let str = nameOf (origName v) in isLexSym str
476 -- print `vars`, (op) correctly
477 pprSym, pprNonSym :: (NamedThing name, Outputable name) => PprStyle -> name -> Pretty
482 else ppBesides [ppChar '`', ppr sty var, ppChar '`']
486 then ppBesides [ppLparen, ppr sty var, ppRparen]
489 #ifdef USE_ATTACK_PRAGMAS
490 {-# SPECIALIZE isSymLexeme :: Id -> Bool #-}
491 {-# SPECIALIZE pprNonSym :: PprStyle -> Id -> Pretty #-}
492 {-# SPECIALIZE pprNonSym :: PprStyle -> TyCon -> Pretty #-}
493 {-# SPECIALIZE pprSym :: PprStyle -> Id -> Pretty #-}