%
-% (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
+% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
\section[Name]{@Name@: to transmit name info from renamer to typechecker}
\begin{code}
-#include "HsVersions.h"
-
module Name (
- -- The Module type
- SYN_IE(Module),
- pprModule, moduleString,
-
- -- The OccName type
- OccName(..),
- pprOccName, pprSymOcc, pprNonSymOcc, occNameString, occNameFlavour,
- isTvOcc, isTCOcc, isVarOcc, prefixOccName,
- quoteInText, parenInCode,
+ -- Re-export the OccName stuff
+ module OccName,
-- The Name type
Name, -- Abstract
- mkLocalName, mkSysLocalName,
-
- mkCompoundName, mkGlobalName, mkInstDeclName,
-
- mkWiredInIdName, mkWiredInTyConName,
- maybeWiredInIdName, maybeWiredInTyConName,
- isWiredInName,
-
- nameUnique, changeUnique, setNameProvenance, setNameVisibility,
- nameOccName, nameString,
- isExportedName, nameSrcLoc,
- isLocallyDefinedName,
-
- isLocalName,
-
- pprNameProvenance,
-
- -- Sets of Names
- NameSet(..),
- emptyNameSet, unitNameSet, mkNameSet, unionNameSets, unionManyNameSets,
- minusNameSet, elemNameSet, nameSetToList, addListToNameSet, isEmptyNameSet,
-
- -- Misc
- DefnInfo(..),
- Provenance(..), pprProvenance,
- ExportFlag(..),
-
+ BuiltInSyntax(..),
+ mkInternalName, mkSystemName,
+ mkSystemVarName, mkSystemVarNameEncoded, mkSysTvName,
+ mkFCallName, mkIPName,
+ mkExternalName, mkWiredInName,
+
+ nameUnique, setNameUnique,
+ nameOccName, nameModule, nameModule_maybe,
+ setNameOcc,
+ hashName, localiseName,
+
+ nameSrcLoc, nameParent, nameParent_maybe, isImplicitName,
+
+ isSystemName, isInternalName, isExternalName,
+ isTyVarName, isWiredInName, isBuiltInSyntax,
+ wiredInNameTyThing_maybe,
+ nameIsLocalOrFrom,
+
-- Class NamedThing and overloaded friends
NamedThing(..),
- modAndOcc, isExported,
- getSrcLoc, isLocallyDefined, getOccString,
-
- pprSym, pprNonSym
+ getSrcLoc, getOccString
) where
-IMP_Ubiq()
-import TyLoop ( GenId, Id(..), TyCon ) -- Used inside Names
-import CStrings ( identToC, modnameToC, cSEP )
-import CmdLineOpts ( opt_OmitInterfacePragmas, opt_EnsureSplittableC )
-
-import Outputable ( Outputable(..) )
-import PprStyle ( PprStyle(..), codeStyle, ifaceStyle )
-import PrelMods ( gHC__ )
-import Pretty
-import Lex ( isLexSym, isLexConId )
-import SrcLoc ( noSrcLoc, SrcLoc )
-import Unique ( pprUnique, showUnique, Unique )
-import UniqSet ( UniqSet(..), emptyUniqSet, unitUniqSet, unionUniqSets, uniqSetToList, isEmptyUniqSet,
- unionManyUniqSets, minusUniqSet, mkUniqSet, elementOfUniqSet, addListToUniqSet )
-import UniqFM ( UniqFM )
-import Util ( cmpPString, panic, assertPanic {-, pprTrace ToDo:rm-} )
-\end{code}
+#include "HsVersions.h"
+
+import {-# SOURCE #-} TypeRep( TyThing )
+import OccName -- All of it
+import Module ( Module )
+import SrcLoc ( noSrcLoc, wiredInSrcLoc, SrcLoc )
+import Unique ( Unique, Uniquable(..), getKey, pprUnique )
+import Maybes ( orElse, isJust )
+import Outputable
+\end{code}
%************************************************************************
%* *
-\subsection[Name-pieces-datatypes]{The @Module@, @OccName@ datatypes}
+\subsection[Name-datatype]{The @Name@ datatype, and name construction}
%* *
%************************************************************************
-
+
\begin{code}
-type Module = FAST_STRING
+data Name = Name {
+ n_sort :: NameSort, -- What sort of name it is
+ n_occ :: !OccName, -- Its occurrence name
+ n_uniq :: Unique,
+ n_loc :: !SrcLoc -- Definition site
+ }
+
+-- NOTE: we make the n_loc field strict to eliminate some potential
+-- (and real!) space leaks, due to the fact that we don't look at
+-- the SrcLoc in a Name all that often.
+
+data NameSort
+ = External Module (Maybe Name)
+ -- (Just parent) => this Name is a subordinate name of 'parent'
+ -- e.g. data constructor of a data type, method of a class
+ -- Nothing => not a subordinate
+
+ | WiredIn Module (Maybe Name) TyThing BuiltInSyntax
+ -- A variant of External, for wired-in things
+
+ | Internal -- A user-defined Id or TyVar
+ -- defined in the module being compiled
+
+ | System -- A system-defined Id or TyVar. Typically the
+ -- OccName is very uninformative (like 's')
+
+data BuiltInSyntax = BuiltInSyntax | UserSyntax
+-- BuiltInSyntax is for things like (:), [], tuples etc,
+-- which have special syntactic forms. They aren't "in scope"
+-- as such.
+\end{code}
-data OccName = VarOcc FAST_STRING -- Variables and data constructors
- | TvOcc FAST_STRING -- Type variables
- | TCOcc FAST_STRING -- Type constructors and classes
+Notes about the NameSorts:
-moduleString :: Module -> String
-moduleString mod = _UNPK_ mod
+1. Initially, top-level Ids (including locally-defined ones) get External names,
+ and all other local Ids get Internal names
-pprModule :: PprStyle -> Module -> Pretty
-pprModule sty m = ppPStr m
+2. Things with a External name are given C static labels, so they finally
+ appear in the .o file's symbol table. They appear in the symbol table
+ in the form M.n. If originally-local things have this property they
+ must be made @External@ first.
-pprOccName :: PprStyle -> OccName -> Pretty
-pprOccName PprDebug n = ppCat [ppPStr (occNameString n), ppBracket (ppStr (occNameFlavour n))]
-pprOccName sty n = if codeStyle sty
- then identToC (occNameString n)
- else ppPStr (occNameString n)
+3. In the tidy-core phase, a External that is not visible to an importer
+ is changed to Internal, and a Internal that is visible is changed to External
-occNameString :: OccName -> FAST_STRING
-occNameString (VarOcc s) = s
-occNameString (TvOcc s) = s
-occNameString (TCOcc s) = s
+4. A System Name differs in the following ways:
+ a) has unique attached when printing dumps
+ b) unifier eliminates sys tyvars in favour of user provs where possible
-prefixOccName :: FAST_STRING -> OccName -> OccName
-prefixOccName prefix (VarOcc s) = VarOcc (prefix _APPEND_ s)
-prefixOccName prefix (TvOcc s) = TvOcc (prefix _APPEND_ s)
-prefixOccName prefix (TCOcc s) = TCOcc (prefix _APPEND_ s)
+ Before anything gets printed in interface files or output code, it's
+ fed through a 'tidy' processor, which zaps the OccNames to have
+ unique names; and converts all sys-locals to user locals
+ If any desugarer sys-locals have survived that far, they get changed to
+ "ds1", "ds2", etc.
--- occNameFlavour is used only to generate good error messages, so it doesn't matter
--- that the VarOcc case isn't mega-efficient. We could have different Occ constructors for
--- data constructors and values, but that makes everything else a bit more complicated.
-occNameFlavour :: OccName -> String
-occNameFlavour (VarOcc s) | isLexConId s = "data constructor"
- | otherwise = "value"
-occNameFlavour (TvOcc s) = "type variable"
-occNameFlavour (TCOcc s) = "type constructor or class"
+Built-in syntax => It's a syntactic form, not "in scope" (e.g. [])
-isVarOcc, isTCOcc, isTvOcc :: OccName -> Bool
-isVarOcc (VarOcc s) = True
-isVarOcc other = False
+Wired-in thing => The thing (Id, TyCon) is fully known to the compiler,
+ not read from an interface file.
+ E.g. Bool, True, Int, Float, and many others
-isTvOcc (TvOcc s) = True
-isTvOcc other = False
+All built-in syntax is for wired-in things.
-isTCOcc (TCOcc s) = True
-isTCOcc other = False
+\begin{code}
+nameUnique :: Name -> Unique
+nameOccName :: Name -> OccName
+nameModule :: Name -> Module
+nameSrcLoc :: Name -> SrcLoc
+nameUnique name = n_uniq name
+nameOccName name = n_occ name
+nameSrcLoc name = n_loc name
+\end{code}
-instance Eq OccName where
- a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False }
- a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True }
+\begin{code}
+nameIsLocalOrFrom :: Module -> Name -> Bool
+isInternalName :: Name -> Bool
+isExternalName :: Name -> Bool
+isSystemName :: Name -> Bool
+isWiredInName :: Name -> Bool
-instance Ord OccName where
- a <= b = case (a `cmp` b) of { LT_ -> True; EQ_ -> True; GT__ -> False }
- a < b = case (a `cmp` b) of { LT_ -> True; EQ_ -> False; GT__ -> False }
- a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True; GT__ -> True }
- a > b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True }
+isWiredInName (Name {n_sort = WiredIn _ _ _ _}) = True
+isWiredInName other = False
-instance Ord3 OccName where
- cmp = cmpOcc
+wiredInNameTyThing_maybe :: Name -> Maybe TyThing
+wiredInNameTyThing_maybe (Name {n_sort = WiredIn _ _ thing _}) = Just thing
+wiredInNameTyThing_maybe other = Nothing
-(VarOcc s1) `cmpOcc` (VarOcc s2) = s1 `_CMP_STRING_` s2
-(VarOcc s1) `cmpOcc` other2 = LT_
+isBuiltInSyntax (Name {n_sort = WiredIn _ _ _ BuiltInSyntax}) = True
+isBuiltInSyntax other = False
-(TvOcc s1) `cmpOcc` (VarOcc s2) = GT_
-(TvOcc s1) `cmpOcc` (TvOcc s2) = s1 `_CMP_STRING_` s2
-(TvOcc s1) `cmpOcc` other = LT_
+isExternalName (Name {n_sort = External _ _}) = True
+isExternalName (Name {n_sort = WiredIn _ _ _ _}) = True
+isExternalName other = False
-(TCOcc s1) `cmpOcc` (TCOcc s2) = s1 `_CMP_STRING_` s2
-(TCOcc s1) `cmpOcc` other = GT_
+isInternalName name = not (isExternalName name)
-instance Outputable OccName where
- ppr = pprOccName
-\end{code}
+nameParent_maybe :: Name -> Maybe Name
+nameParent_maybe (Name {n_sort = External _ p}) = p
+nameParent_maybe (Name {n_sort = WiredIn _ p _ _}) = p
+nameParent_maybe other = Nothing
+nameParent :: Name -> Name
+nameParent name = case nameParent_maybe name of
+ Just parent -> parent
+ Nothing -> name
-\begin{code}
-parenInCode, quoteInText :: OccName -> Bool
-parenInCode occ = isLexSym (occNameString occ)
+isImplicitName :: Name -> Bool
+-- An Implicit Name is one has a parent; that is, one whose definition
+-- derives from the parent thing
+isImplicitName name = isJust (nameParent_maybe name)
-quoteInText occ = not (isLexSym (occNameString occ))
+nameModule name = nameModule_maybe name `orElse` pprPanic "nameModule" (ppr name)
+nameModule_maybe (Name { n_sort = External mod _}) = Just mod
+nameModule_maybe (Name { n_sort = WiredIn mod _ _ _}) = Just mod
+nameModule_maybe name = Nothing
--- print `vars`, (op) correctly
-pprSymOcc, pprNonSymOcc :: PprStyle -> OccName -> Pretty
+nameIsLocalOrFrom from name
+ | isExternalName name = from == nameModule name
+ | otherwise = True
-pprSymOcc sty var
- = if quoteInText var
- then ppQuote (pprOccName sty var)
- else pprOccName sty var
+isTyVarName :: Name -> Bool
+isTyVarName name = isTvOcc (nameOccName name)
-pprNonSymOcc sty var
- = if parenInCode var
- then ppParens (pprOccName sty var)
- else pprOccName sty var
+isSystemName (Name {n_sort = System}) = True
+isSystemName other = False
\end{code}
+
%************************************************************************
%* *
-\subsection[Name-datatype]{The @Name@ datatype, and name construction}
+\subsection{Making names}
%* *
%************************************************************************
-
-\begin{code}
-data Name
- = Local Unique
- OccName
- SrcLoc
-
- | Global Unique
- Module -- The defining module
- OccName -- Its name in that module
- DefnInfo -- How it is defined
- Provenance -- How it was brought into scope
-\end{code}
-
-Things with a @Global@ name are given C static labels, so they finally
-appear in the .o file's symbol table. They appear in the symbol table
-in the form M.n. If originally-local things have this property they
-must be made @Global@ first.
\begin{code}
-data DefnInfo = VanillaDefn
- | WiredInTyCon TyCon -- There's a wired-in version
- | WiredInId Id -- ...ditto...
-
-data Provenance
- = LocalDef ExportFlag SrcLoc -- Locally defined
- | Imported Module SrcLoc -- Directly imported from M; gives locn of import statement
- | Implicit -- Implicitly imported
+mkInternalName :: Unique -> OccName -> SrcLoc -> Name
+mkInternalName uniq occ loc = Name { n_uniq = uniq, n_sort = Internal, n_occ = occ, n_loc = loc }
+ -- NB: You might worry that after lots of huffing and
+ -- puffing we might end up with two local names with distinct
+ -- uniques, but the same OccName. Indeed we can, but that's ok
+ -- * the insides of the compiler don't care: they use the Unique
+ -- * when printing for -ddump-xxx you can switch on -dppr-debug to get the
+ -- uniques if you get confused
+ -- * for interface files we tidyCore first, which puts the uniques
+ -- into the print name (see setNameVisibility below)
+
+mkExternalName :: Unique -> Module -> OccName -> Maybe Name -> SrcLoc -> Name
+mkExternalName uniq mod occ mb_parent loc
+ = Name { n_uniq = uniq, n_sort = External mod mb_parent,
+ n_occ = occ, n_loc = loc }
+
+mkWiredInName :: Module -> OccName -> Unique
+ -> Maybe Name -> TyThing -> BuiltInSyntax -> Name
+mkWiredInName mod occ uniq mb_parent thing built_in
+ = Name { n_uniq = uniq,
+ n_sort = WiredIn mod mb_parent thing built_in,
+ n_occ = occ, n_loc = wiredInSrcLoc }
+
+mkSystemName :: Unique -> OccName -> Name
+mkSystemName uniq occ = Name { n_uniq = uniq, n_sort = System,
+ n_occ = occ, n_loc = noSrcLoc }
+
+mkSystemVarName :: Unique -> UserFS -> Name
+mkSystemVarName uniq fs = mkSystemName uniq (mkVarOcc fs)
+
+-- Use this version when the string is already encoded. Avoids duplicating
+-- the string each time a new name is created.
+mkSystemVarNameEncoded :: Unique -> EncodedFS -> Name
+mkSystemVarNameEncoded uniq fs = mkSystemName uniq (mkSysOccFS varName fs)
+
+mkSysTvName :: Unique -> EncodedFS -> Name
+mkSysTvName uniq fs = mkSystemName uniq (mkSysOccFS tvName fs)
+
+mkFCallName :: Unique -> EncodedString -> Name
+ -- The encoded string completely describes the ccall
+mkFCallName uniq str = Name { n_uniq = uniq, n_sort = Internal,
+ n_occ = mkFCallOcc str, n_loc = noSrcLoc }
+
+mkIPName :: Unique -> OccName -> Name
+mkIPName uniq occ
+ = Name { n_uniq = uniq,
+ n_sort = Internal,
+ n_occ = occ,
+ n_loc = noSrcLoc }
\end{code}
-Something is "Exported" if it may be mentioned by another module without
-warning. The crucial thing about Exported things is that they must
-never be dropped as dead code, even if they aren't used in this module.
-Furthermore, being Exported means that we can't see all call sites of the thing.
-
-Exported things include:
- - explicitly exported Ids, including data constructors, class method selectors
- - dfuns from instance decls
-
-Being Exported is *not* the same as finally appearing in the .o file's
-symbol table. For example, a local Id may be mentioned in an Exported
-Id's unfolding in the interface file, in which case the local Id goes
-out too.
-
\begin{code}
-data ExportFlag = Exported | NotExported
-\end{code}
-
-\begin{code}
-mkLocalName :: Unique -> OccName -> SrcLoc -> Name
-mkLocalName = Local
-
-mkGlobalName :: Unique -> Module -> OccName -> DefnInfo -> Provenance -> Name
-mkGlobalName = Global
-
-mkSysLocalName :: Unique -> FAST_STRING -> SrcLoc -> Name
-mkSysLocalName uniq str loc = Local uniq (VarOcc str) loc
-
-mkWiredInIdName :: Unique -> Module -> FAST_STRING -> Id -> Name
-mkWiredInIdName uniq mod occ id
- = Global uniq mod (VarOcc occ) (WiredInId id) Implicit
-
-mkWiredInTyConName :: Unique -> Module -> FAST_STRING -> TyCon -> Name
-mkWiredInTyConName uniq mod occ tycon
- = Global uniq mod (TCOcc occ) (WiredInTyCon tycon) Implicit
-
-
-mkCompoundName :: (FAST_STRING -> FAST_STRING) -- Occurrence-name modifier
- -> Unique -- New unique
- -> Name -- Base name (must be a Global)
- -> Name -- Result is always a value name
-
-mkCompoundName str_fn uniq (Global _ mod occ defn prov)
- = Global uniq mod new_occ defn prov
- where
- new_occ = VarOcc (str_fn (occNameString occ)) -- Always a VarOcc
-
-mkCompoundName str_fn uniq (Local _ occ loc)
- = Local uniq (VarOcc (str_fn (occNameString occ))) loc
-
- -- Rather a wierd one that's used for names generated for instance decls
-mkInstDeclName :: Unique -> Module -> OccName -> SrcLoc -> Bool -> Name
-mkInstDeclName uniq mod occ loc from_here
- = Global uniq mod occ VanillaDefn prov
- where
- prov | from_here = LocalDef Exported loc
- | otherwise = Implicit
-
-
-setNameProvenance :: Name -> Provenance -> Name -- Implicit Globals only
-setNameProvenance (Global uniq mod occ def Implicit) prov = Global uniq mod occ def prov
-setNameProvenance other_name prov = other_name
-
-- When we renumber/rename things, we need to be
-- able to change a Name's Unique to match the cached
-- one in the thing it's the name of. If you know what I mean.
-changeUnique (Local _ n l) u = Local u n l
-changeUnique (Global _ mod occ def prov) u = Global u mod occ def prov
-
-setNameVisibility :: Module -> Name -> Name
--- setNameVisibility is applied to top-level names in the final program
--- The "visibility" here concerns whether the .o file's symbol table
--- mentions the thing; if so, it needs a module name in its symbol,
--- otherwise we just use its unique. The Global things are "visible"
--- and the local ones are not
-
-setNameVisibility _ (Global uniq mod occ def (LocalDef NotExported loc))
- | not all_toplev_ids_visible
- = Local uniq occ loc
+setNameUnique name uniq = name {n_uniq = uniq}
-setNameVisibility mod (Local uniq occ loc)
- | all_toplev_ids_visible
- = Global uniq mod
- (VarOcc (showUnique uniq)) -- It's local name must be unique!
- VanillaDefn (LocalDef NotExported loc)
-
-setNameVisibility mod name = name
-
-all_toplev_ids_visible = not opt_OmitInterfacePragmas || -- Pragmas can make them visible
- opt_EnsureSplittableC -- Splitting requires visiblilty
+setNameOcc :: Name -> OccName -> Name
+setNameOcc name occ = name {n_occ = occ}
+localiseName :: Name -> Name
+localiseName n = n { n_sort = Internal }
\end{code}
+
%************************************************************************
%* *
\subsection{Predicates and selectors}
%************************************************************************
\begin{code}
-nameUnique :: Name -> Unique
-nameModAndOcc :: Name -> (Module, OccName) -- Globals only
-nameOccName :: Name -> OccName
-nameString :: Name -> FAST_STRING -- A.b form
-nameSrcLoc :: Name -> SrcLoc
-isLocallyDefinedName :: Name -> Bool
-isExportedName :: Name -> Bool
-isWiredInName :: Name -> Bool
-isLocalName :: Name -> Bool
-
-
-
-nameUnique (Local u _ _) = u
-nameUnique (Global u _ _ _ _) = u
-
-nameOccName (Local _ occ _) = occ
-nameOccName (Global _ _ occ _ _) = occ
-
-nameModAndOcc (Global _ mod occ _ _) = (mod,occ)
-
-nameString (Local _ occ _) = occNameString occ
-nameString (Global _ mod occ _ _) = mod _APPEND_ SLIT(".") _APPEND_ occNameString occ
-
-isExportedName (Global _ _ _ _ (LocalDef Exported _)) = True
-isExportedName other = False
-
-nameSrcLoc (Local _ _ loc) = loc
-nameSrcLoc (Global _ _ _ _ (LocalDef _ loc)) = loc
-nameSrcLoc (Global _ _ _ _ (Imported _ loc)) = loc
-nameSrcLoc other = noSrcLoc
-
-isLocallyDefinedName (Local _ _ _) = True
-isLocallyDefinedName (Global _ _ _ _ (LocalDef _ _)) = True
-isLocallyDefinedName other = False
-
--- Things the compiler "knows about" are in some sense
--- "imported". When we are compiling the module where
--- the entities are defined, we need to be able to pick
--- them out, often in combination with isLocallyDefined.
-isWiredInName (Global _ _ _ (WiredInTyCon _) _) = True
-isWiredInName (Global _ _ _ (WiredInId _) _) = True
-isWiredInName _ = False
-
-maybeWiredInIdName :: Name -> Maybe Id
-maybeWiredInIdName (Global _ _ _ (WiredInId id) _) = Just id
-maybeWiredInIdName other = Nothing
-
-maybeWiredInTyConName :: Name -> Maybe TyCon
-maybeWiredInTyConName (Global _ _ _ (WiredInTyCon tc) _) = Just tc
-maybeWiredInTyConName other = Nothing
-
-
-isLocalName (Local _ _ _) = True
-isLocalName _ = False
+hashName :: Name -> Int
+hashName name = getKey (nameUnique name)
\end{code}
%************************************************************************
\begin{code}
-cmpName n1 n2 = c n1 n2
- where
- c (Local u1 _ _) (Local u2 _ _) = cmp u1 u2
- c (Local _ _ _) _ = LT_
- c (Global u1 _ _ _ _) (Global u2 _ _ _ _) = cmp u1 u2
- c (Global _ _ _ _ _) _ = GT_
+cmpName n1 n2 = n_uniq n1 `compare` n_uniq n2
\end{code}
\begin{code}
instance Eq Name where
- a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False }
- a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True }
+ a == b = case (a `compare` b) of { EQ -> True; _ -> False }
+ a /= b = case (a `compare` b) of { EQ -> False; _ -> True }
instance Ord Name where
- a <= b = case (a `cmp` b) of { LT_ -> True; EQ_ -> True; GT__ -> False }
- a < b = case (a `cmp` b) of { LT_ -> True; EQ_ -> False; GT__ -> False }
- a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True; GT__ -> True }
- a > b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True }
-
-instance Ord3 Name where
- cmp = cmpName
+ a <= b = case (a `compare` b) of { LT -> True; EQ -> True; GT -> False }
+ a < b = case (a `compare` b) of { LT -> True; EQ -> False; GT -> False }
+ a >= b = case (a `compare` b) of { LT -> False; EQ -> True; GT -> True }
+ a > b = case (a `compare` b) of { LT -> False; EQ -> False; GT -> True }
+ compare a b = cmpName a b
instance Uniquable Name where
- uniqueOf = nameUnique
+ getUnique = nameUnique
instance NamedThing Name where
getName n = n
\end{code}
-
%************************************************************************
%* *
\subsection{Pretty printing}
\begin{code}
instance Outputable Name where
- ppr sty (Local u n _) | codeStyle sty ||
- ifaceStyle sty = pprUnique u
- ppr PprForUser (Local _ n _) = ppPStr (occNameString n)
- ppr other_sty (Local u n _) = ppBesides [ppPStr (occNameString n), ppPStr SLIT("_"), pprUnique u]
-
- ppr sty name@(Global u m n _ _) = ppBesides [pp_name, pp_debug sty name]
- where
- pp_name | codeStyle sty = identToC qual_name
- | otherwise = ppBesides[ ppPStr m, ppChar '.', ppPStr pk_n]
- pk_n = occNameString n
- qual_name = m _APPEND_ SLIT(".") _APPEND_ pk_n
-
-pp_debug PprDebug (Global uniq m n _ prov) = ppBesides [ppStr "{-", pprUnique uniq, ppChar ',',
- pp_prov prov, ppStr "-}"]
- where
- pp_prov (LocalDef Exported _) = ppChar 'x'
- pp_prov (LocalDef NotExported _) = ppChar 'l'
- pp_prov (Imported _ _) = ppChar 'i'
- pp_prov Implicit = ppChar 'p'
-pp_debug other name = ppNil
-
--- pprNameProvenance is used in error messages to say where a name came from
-pprNameProvenance :: PprStyle -> Name -> Pretty
-pprNameProvenance sty (Local _ _ loc) = pprProvenance sty (LocalDef NotExported loc)
-pprNameProvenance sty (Global _ _ _ _ prov) = pprProvenance sty prov
-
-pprProvenance :: PprStyle -> Provenance -> Pretty
-pprProvenance sty (Imported mod loc)
- = ppSep [ppPStr SLIT("Imported from"), pprModule sty mod, ppPStr SLIT("at"), ppr sty loc]
-pprProvenance sty (LocalDef _ loc)
- = ppSep [ppPStr SLIT("Defined at"), ppr sty loc]
-pprProvenance sty Implicit
- = panic "pprNameProvenance: Implicit"
+ ppr name = pprName name
+
+instance OutputableBndr Name where
+ pprBndr _ name = pprName name
+
+pprName (Name {n_sort = sort, n_uniq = uniq, n_occ = occ})
+ = getPprStyle $ \ sty ->
+ case sort of
+ WiredIn mod _ _ builtin -> pprExternal sty uniq mod occ True builtin
+ External mod _ -> pprExternal sty uniq mod occ False UserSyntax
+ System -> pprSystem sty uniq occ
+ Internal -> pprInternal sty uniq occ
+
+pprExternal sty uniq mod occ is_wired is_builtin
+ | codeStyle sty = ppr mod <> char '_' <> ppr_occ_name occ
+ -- In code style, always qualify
+ -- ToDo: maybe we could print all wired-in things unqualified
+ -- in code style, to reduce symbol table bloat?
+ | debugStyle sty = ppr mod <> dot <> ppr_occ_name occ
+ <> braces (hsep [if is_wired then ptext SLIT("(w)") else empty,
+ text (briefOccNameFlavour occ),
+ pprUnique uniq])
+ | BuiltInSyntax <- is_builtin = ppr_occ_name occ
+ -- never qualify builtin syntax
+ | unqualStyle sty mod occ = ppr_occ_name occ
+ | otherwise = ppr mod <> dot <> ppr_occ_name occ
+
+pprInternal sty uniq occ
+ | codeStyle sty = pprUnique uniq
+ | debugStyle sty = ppr_occ_name occ <> braces (hsep [text (briefOccNameFlavour occ),
+ pprUnique uniq])
+ | dumpStyle sty = ppr_occ_name occ <> char '_' <> pprUnique uniq
+ -- For debug dumps, we're not necessarily dumping
+ -- tidied code, so we need to print the uniques.
+ | otherwise = ppr_occ_name occ -- User style
+
+-- Like Internal, except that we only omit the unique in Iface style
+pprSystem sty uniq occ
+ | codeStyle sty = pprUnique uniq
+ | debugStyle sty = ppr_occ_name occ <> char '_' <> pprUnique uniq
+ <> braces (text (briefOccNameFlavour occ))
+ | otherwise = ppr_occ_name occ <> char '_' <> pprUnique uniq
+ -- If the tidy phase hasn't run, the OccName
+ -- is unlikely to be informative (like 's'),
+ -- so print the unique
+
+ppr_occ_name occ = pprEncodedFS (occNameFS occ)
+ -- Don't use pprOccName; instead, just print the string of the OccName;
+ -- we print the namespace in the debug stuff above
\end{code}
-
-%************************************************************************
-%* *
-\subsection[Sets of names}
-%* *
-%************************************************************************
-
-\begin{code}
-type NameSet = UniqSet Name
-emptyNameSet :: NameSet
-unitNameSet :: Name -> NameSet
-addListToNameSet :: NameSet -> [Name] -> NameSet
-mkNameSet :: [Name] -> NameSet
-unionNameSets :: NameSet -> NameSet -> NameSet
-unionManyNameSets :: [NameSet] -> NameSet
-minusNameSet :: NameSet -> NameSet -> NameSet
-elemNameSet :: Name -> NameSet -> Bool
-nameSetToList :: NameSet -> [Name]
-isEmptyNameSet :: NameSet -> Bool
-
-isEmptyNameSet = isEmptyUniqSet
-emptyNameSet = emptyUniqSet
-unitNameSet = unitUniqSet
-mkNameSet = mkUniqSet
-addListToNameSet = addListToUniqSet
-unionNameSets = unionUniqSets
-unionManyNameSets = unionManyUniqSets
-minusNameSet = minusUniqSet
-elemNameSet = elementOfUniqSet
-nameSetToList = uniqSetToList
-\end{code}
-
-
-
%************************************************************************
%* *
\subsection{Overloaded functions related to Names}
\begin{code}
class NamedThing a where
- getOccName :: a -> OccName -- Even RdrNames can do this!
+ getOccName :: a -> OccName
getName :: a -> Name
getOccName n = nameOccName (getName n) -- Default method
\end{code}
\begin{code}
-modAndOcc :: NamedThing a => a -> (Module, OccName)
getSrcLoc :: NamedThing a => a -> SrcLoc
-isLocallyDefined :: NamedThing a => a -> Bool
-isExported :: NamedThing a => a -> Bool
getOccString :: NamedThing a => a -> String
-modAndOcc = nameModAndOcc . getName
-isExported = isExportedName . getName
getSrcLoc = nameSrcLoc . getName
-isLocallyDefined = isLocallyDefinedName . getName
-pprSym sty = pprSymOcc sty . getOccName
-pprNonSym sty = pprNonSymOcc sty . getOccName
-getOccString x = _UNPK_ (occNameString (getOccName x))
+getOccString = occNameString . getOccName
\end{code}
-\begin{code}
-{-# SPECIALIZE isLocallyDefined
- :: Name -> Bool
- #-}
-\end{code}