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"
23 mkLocalName, isLocalName,
24 mkTopLevName, mkImportedName,
25 mkImplicitName, isImplicitName,
28 mkFunTyConName, mkTupleDataConName, mkTupleTyConName,
30 NamedThing(..), -- class
31 ExportFlag(..), isExported,
41 getOrigName, getOccName, getExportFlag,
42 getSrcLoc, isLocallyDefined, isPreludeDefined,
43 getLocalName, getOrigNameRdr, ltLexical,
45 isOpLexeme, pprOp, pprNonOp,
46 isConop, isAconop, isAvarid, isAvarop
51 import CStrings ( identToC, cSEP )
52 import Outputable ( Outputable(..) )
53 import PprStyle ( PprStyle(..), codeStyle )
54 import PrelMods ( pRELUDE, pRELUDE_BUILTIN )
56 import SrcLoc ( mkBuiltinSrcLoc, mkUnknownSrcLoc )
57 import Unique ( funTyConKey, mkTupleDataConUnique, mkTupleTyConUnique,
60 import Util ( thenCmp, _CMP_STRING_, nOfThem, panic )
63 %************************************************************************
65 \subsection[RdrName]{The @RdrName@ datatype; names read from files}
67 %************************************************************************
70 type Module = FAST_STRING
72 data RdrName = Unqual FAST_STRING
73 | Qual Module FAST_STRING
75 isUnqual (Unqual _) = True
76 isUnqual (Qual _ _) = False
78 isQual (Unqual _) = False
79 isQual (Qual _ _) = True
81 isConopRdr (Unqual n) = isConop n
82 isConopRdr (Qual m n) = isConop n
84 appendRdr (Unqual n) str = Unqual (n _APPEND_ str)
85 appendRdr (Qual m n) str = Qual m (n _APPEND_ str)
87 rdrToOrig (Unqual n) = (pRELUDE, n)
88 rdrToOrig (Qual m n) = (m, n)
90 cmpRdr (Unqual n1) (Unqual n2) = _CMP_STRING_ n1 n2
91 cmpRdr (Unqual n1) (Qual m2 n2) = LT_
92 cmpRdr (Qual m1 n1) (Unqual n2) = GT_
93 cmpRdr (Qual m1 n1) (Qual m2 n2) = thenCmp (_CMP_STRING_ m1 m2) (_CMP_STRING_ n1 n2)
95 instance Eq RdrName where
96 a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False }
97 a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True }
99 instance Ord RdrName where
100 a <= b = case (a `cmp` b) of { LT_ -> True; EQ_ -> True; GT__ -> False }
101 a < b = case (a `cmp` b) of { LT_ -> True; EQ_ -> False; GT__ -> False }
102 a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True; GT__ -> True }
103 a > b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True }
105 instance Ord3 RdrName where
108 instance NamedThing RdrName where
109 -- We're sorta faking it here
111 = Global u rdr_name prov ex [rdr_name]
113 u = panic "NamedThing.RdrName:Unique"
114 prov = panic "NamedThing.RdrName:Provenance"
115 ex = panic "NamedThing.RdrName:ExportFlag"
117 instance Outputable RdrName where
118 ppr sty (Unqual n) = pp_name sty n
119 ppr sty (Qual m n) = ppBeside (pp_mod sty m) (pp_name sty n)
121 pp_mod PprInterface m = ppNil
122 pp_mod PprForC m = ppBesides [identToC m, ppPStr cSEP]
123 pp_mod (PprForAsm False _) m = ppBesides [identToC m, ppPStr cSEP]
124 pp_mod (PprForAsm True _) m = ppBesides [ppPStr cSEP, identToC m, ppPStr cSEP]
125 pp_mod _ m = ppBesides [ppPStr m, ppChar '.']
127 pp_name sty n | codeStyle sty = identToC n
128 | otherwise = ppPStr n
130 showRdr sty rdr = ppShow 100 (ppr sty rdr)
133 %************************************************************************
135 \subsection[Name-datatype]{The @Name@ datatype}
137 %************************************************************************
146 RdrName -- original name; Unqual => prelude
147 Provenance -- where it came from
148 ExportFlag -- is it exported?
149 [RdrName] -- ordered occurrence names (usually just one);
150 -- first may be *un*qual.
153 = LocalDef SrcLoc -- locally defined; give its source location
155 | Imported SrcLoc -- imported; give the *original* source location
156 -- [SrcLoc] -- any import source location(s)
165 mkTopLevName u orig locn exp occs = Global u orig (LocalDef locn) exp occs
166 mkImportedName u orig locn exp occs = Global u orig (Imported locn) exp occs
168 mkImplicitName :: Unique -> RdrName -> Name
169 mkImplicitName u o = Global u o Implicit NotExported []
171 mkBuiltinName :: Unique -> Module -> FAST_STRING -> Name
172 mkBuiltinName u m n = Global u (Unqual n) Builtin NotExported []
175 = mkBuiltinName funTyConKey pRELUDE_BUILTIN SLIT("->")
176 mkTupleDataConName arity
177 = mkBuiltinName (mkTupleDataConUnique arity) pRELUDE_BUILTIN (mk_tup_name arity)
178 mkTupleTyConName arity
179 = mkBuiltinName (mkTupleTyConUnique arity) pRELUDE_BUILTIN (mk_tup_name arity)
181 mk_tup_name 0 = SLIT("()")
182 mk_tup_name 1 = panic "Name.mk_tup_name: 1 ???"
183 mk_tup_name 2 = SLIT("(,)") -- not strictly necessary
184 mk_tup_name 3 = SLIT("(,,)") -- ditto
185 mk_tup_name 4 = SLIT("(,,,)") -- ditto
187 = _PK_ ("(" ++ nOfThem (n-1) ',' ++ ")")
189 -- ToDo: what about module ???
190 -- ToDo: exported when compiling builtin ???
192 isLocalName (Local _ _ _) = True
193 isLocalName _ = False
195 isImplicitName (Global _ _ Implicit _ _) = True
196 isImplicitName _ = False
198 isBuiltinName (Global _ _ Builtin _ _) = True
199 isBuiltinName _ = False
204 %************************************************************************
206 \subsection[Name-instances]{Instance declarations}
208 %************************************************************************
211 cmpName n1 n2 = c n1 n2
213 c (Local u1 _ _) (Local u2 _ _) = cmp u1 u2
214 c (Global u1 _ _ _ _) (Global u2 _ _ _ _) = cmp u1 u2
216 c other_1 other_2 -- the tags *must* be different
217 = let tag1 = tag_Name n1
220 if tag1 _LT_ tag2 then LT_ else GT_
222 tag_Name (Local _ _ _) = (ILIT(1) :: FAST_INT)
223 tag_Name (Global _ _ _ _ _) = ILIT(2)
227 instance Eq Name where
228 a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False }
229 a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True }
231 instance Ord Name where
232 a <= b = case (a `cmp` b) of { LT_ -> True; EQ_ -> True; GT__ -> False }
233 a < b = case (a `cmp` b) of { LT_ -> True; EQ_ -> False; GT__ -> False }
234 a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True; GT__ -> True }
235 a > b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True }
237 instance Ord3 Name where
240 instance Uniquable Name where
241 uniqueOf = nameUnique
243 instance NamedThing Name where
248 nameUnique (Local u _ _) = u
249 nameUnique (Global u _ _ _ _) = u
251 nameOrigName (Local _ n _) = (panic "NamedThing.Local.nameOrigName", n)
252 nameOrigName (Global _ orig _ _ _) = rdrToOrig orig
254 nameOccName (Local _ n _) = Unqual n
255 nameOccName (Global _ orig _ _ [] ) = orig
256 nameOccName (Global _ orig _ _ occs) = head occs
258 nameExportFlag (Local _ _ _) = NotExported
259 nameExportFlag (Global _ _ _ exp _) = exp
261 nameSrcLoc (Local _ _ loc) = loc
262 nameSrcLoc (Global _ _ (LocalDef loc) _ _) = loc
263 nameSrcLoc (Global _ _ (Imported loc) _ _) = loc
264 nameSrcLoc (Global _ _ Implicit _ _) = mkUnknownSrcLoc
265 nameSrcLoc (Global _ _ Builtin _ _) = mkBuiltinSrcLoc
267 isLocallyDefinedName (Local _ _ _) = True
268 isLocallyDefinedName (Global _ _ (LocalDef _) _ _) = True
269 isLocallyDefinedName (Global _ _ (Imported _) _ _) = False
270 isLocallyDefinedName (Global _ _ Implicit _ _) = False
271 isLocallyDefinedName (Global _ _ Builtin _ _) = False
273 isPreludeDefinedName (Local _ n _) = False
274 isPreludeDefinedName (Global _ orig _ _ _) = isUnqual orig
278 instance Outputable Name where
280 ppr PprDebug (Local u n _) = pp_debug u (ppPStr n)
281 ppr PprDebug (Global u o _ _ _) = pp_debug u (ppr PprDebug o)
283 ppr sty (Local u n _) = pp_name sty n
284 ppr PprForUser (Global u o _ _ [] ) = ppr PprForUser o
285 ppr PprForUser (Global u o _ _ occs) = ppr PprForUser (head occs)
286 ppr PprShowAll (Global u o prov exp occs) = pp_all o prov exp occs
287 ppr sty (Global u o _ _ _) = ppr sty o
290 = ppBesides [thing, ppStr "{-", pprUnique uniq, ppStr "-}" ]
292 pp_all orig prov exp occs
293 = ppBesides [ppr PprShowAll orig, ppr PprShowAll occs, pp_prov prov, pp_exp exp]
295 pp_exp NotExported = ppNil
296 pp_exp ExportAll = ppPStr SLIT("/EXP(..)")
297 pp_exp ExportAbs = ppPStr SLIT("/EXP")
299 pp_prov Implicit = ppPStr SLIT("/IMPLICIT")
300 pp_prov Builtin = ppPStr SLIT("/BUILTIN")
304 %************************************************************************
306 \subsection[ExportFlag-datatype]{The @ExportFlag@ datatype}
308 %************************************************************************
310 The export flag @ExportAll@ means `export all there is', so there are
311 times when it is attached to a class or data type which has no
312 ops/constructors (if the class/type was imported abstractly). In
313 fact, @ExportAll@ is attached to everything except to classes/types
314 which are being {\em exported} abstractly, regardless of how they were
319 = ExportAll -- export with all constructors/methods
320 | ExportAbs -- export abstractly
324 = case (getExportFlag a) of
328 #ifdef USE_ATTACK_PRAGMAS
329 {-# SPECIALIZE isExported :: Class -> Bool #-}
330 {-# SPECIALIZE isExported :: Id -> Bool #-}
331 {-# SPECIALIZE isExported :: TyCon -> Bool #-}
335 %************************************************************************
337 \subsection{Overloaded functions related to Names}
339 %************************************************************************
342 class NamedThing a where
347 getOrigName :: NamedThing a => a -> (Module, FAST_STRING)
348 getOccName :: NamedThing a => a -> RdrName
349 getExportFlag :: NamedThing a => a -> ExportFlag
350 getSrcLoc :: NamedThing a => a -> SrcLoc
351 isLocallyDefined :: NamedThing a => a -> Bool
352 isPreludeDefined :: NamedThing a => a -> Bool
354 getOrigName = nameOrigName . getName
355 getOccName = nameOccName . getName
356 getExportFlag = nameExportFlag . getName
357 getSrcLoc = nameSrcLoc . getName
358 isLocallyDefined = isLocallyDefinedName . getName
359 isPreludeDefined = isPreludeDefinedName . getName
361 getLocalName :: (NamedThing a) => a -> FAST_STRING
362 getLocalName = snd . getOrigName
364 getOrigNameRdr :: (NamedThing a) => a -> RdrName
365 getOrigNameRdr n | isPreludeDefined n = Unqual str
366 | otherwise = Qual mod str
368 (mod,str) = getOrigName n
371 @ltLexical@ is used for sorting things into lexicographical order, so
372 as to canonicalize interfaces. [Regular @(<)@ should be used for fast
377 = BIND isLocallyDefined a _TO_ a_local ->
378 BIND isLocallyDefined b _TO_ b_local ->
379 BIND getOrigName a _TO_ (a_mod, a_name) ->
380 BIND getOrigName b _TO_ (b_mod, b_name) ->
381 if a_local || b_local then
382 a_name < b_name -- can't compare module names
384 case _CMP_STRING_ a_mod b_mod of
386 EQ_ -> a_name < b_name
390 #ifdef USE_ATTACK_PRAGMAS
391 {-# SPECIALIZE ltLexical :: Class -> Class -> Bool #-}
392 {-# SPECIALIZE ltLexical :: Id -> Id -> Bool #-}
393 {-# SPECIALIZE ltLexical :: TyCon -> TyCon -> Bool #-}
397 These functions test strings to see if they fit the lexical categories
398 defined in the Haskell report. Normally applied as in e.g. @isConop
402 isConop, isAconop, isAvarid, isAvarop :: FAST_STRING -> Bool
406 | c == '_' = isConop (_TAIL_ cs) -- allow for leading _'s
407 | otherwise = isUpper c || c == ':'
408 || c == '[' || c == '(' -- [] () and (,,) come is as Conop strings !!!
415 | otherwise = c == ':'
421 | c == '_' = isAvarid (_TAIL_ cs) -- allow for leading _'s
423 | isLowerISO c = True
432 | c `elem` "!#$%&*+./<=>?@\\^|~-" = True
433 | isSymbolISO c = True
438 isSymbolISO c = ord c `elem` (0xd7 : 0xf7 : [0xa1 .. 0xbf])
439 isUpperISO c = 0xc0 <= oc && oc <= 0xde && oc /= 0xd7 where oc = ord c
440 isLowerISO c = 0xdf <= oc && oc <= 0xff && oc /= 0xf7 where oc = ord c
443 And one ``higher-level'' interface to those:
446 isOpLexeme :: NamedThing a => a -> Bool
449 = let str = snd (getOrigName v) in isAvarop str || isAconop str
451 -- print `vars`, (op) correctly
452 pprOp, pprNonOp :: (NamedThing name, Outputable name) => PprStyle -> name -> Pretty
457 else ppBesides [ppChar '`', ppr sty var, ppChar '`']
461 then ppBesides [ppLparen, ppr sty var, ppRparen]
464 #ifdef USE_ATTACK_PRAGMAS
465 {-# SPECIALIZE isOpLexeme :: Id -> Bool #-}
466 {-# SPECIALIZE pprNonOp :: PprStyle -> Id -> Pretty #-}
467 {-# SPECIALIZE pprNonOp :: PprStyle -> TyCon -> Pretty #-}
468 {-# SPECIALIZE pprOp :: PprStyle -> Id -> Pretty #-}