%
-% (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}
module Name (
- -- Re-export the Module type
- Module,
- pprModule, moduleString,
-
- -- The OccName type
- OccName(..),
- pprOccName, occNameString, occNameFlavour,
- isTvOcc, isTCOcc, isVarOcc, prefixOccName,
- uniqToOccName,
+ -- Re-export the OccName stuff
+ module OccName,
-- The Name type
Name, -- Abstract
- mkLocalName, mkSysLocalName,
-
- mkCompoundName, mkGlobalName,
-
- mkWiredInIdName, mkWiredInTyConName,
- maybeWiredInIdName, maybeWiredInTyConName,
- isWiredInName,
-
- nameUnique, changeUnique, setNameProvenance, getNameProvenance,
- setNameVisibility,
- nameOccName, nameString, nameModule,
-
- isExportedName, nameSrcLoc,
- isLocallyDefinedName,
-
- isLocalName,
-
- pprNameProvenance,
-
- -- Sets of Names
- NameSet,
- emptyNameSet, unitNameSet, mkNameSet, unionNameSets, unionManyNameSets,
- minusNameSet, elemNameSet, nameSetToList, addOneToNameSet, addListToNameSet, isEmptyNameSet,
-
- -- Misc
- Provenance(..), pprProvenance,
- ExportFlag(..),
- PrintUnqualified,
-
+ BuiltInSyntax(..),
+ mkInternalName, mkSystemName,
+ mkSystemNameEncoded, mkSysTvName,
+ mkFCallName, mkIPName,
+ mkExternalName, mkWiredInName,
+
+ nameUnique, setNameUnique,
+ nameOccName, nameModule, nameModule_maybe, nameModuleName,
+ setNameOcc,
+ hashName, localiseName,
+
+ nameSrcLoc, nameParent, nameParent_maybe,
+
+ isSystemName, isInternalName, isExternalName,
+ isTyVarName, isDllName, isWiredInName, isBuiltInSyntax,
+ wiredInNameTyThing_maybe,
+ nameIsLocalOrFrom, isHomePackageName,
+
-- Class NamedThing and overloaded friends
NamedThing(..),
- modAndOcc, isExported,
- getSrcLoc, isLocallyDefined, getOccString
+ getSrcLoc, getOccString
) where
#include "HsVersions.h"
-import {-# SOURCE #-} Id ( Id )
-import {-# SOURCE #-} TyCon ( TyCon )
-
-import CStrings ( identToC, modnameToC, cSEP )
-import CmdLineOpts ( opt_PprStyle_All, opt_OmitInterfacePragmas, opt_EnsureSplittableC )
-import BasicTypes ( Module, IfaceFlavour(..), moduleString, pprModule )
-
-import PrelMods ( gHC__ )
-import Lex ( isLexSym, isLexConId )
-import SrcLoc ( noSrcLoc, mkBuiltinSrcLoc, SrcLoc )
-import Unique ( pprUnique, showUnique, Unique, Uniquable(..) )
-import UniqSet ( UniqSet(..), emptyUniqSet, unitUniqSet, unionUniqSets, uniqSetToList,
- isEmptyUniqSet, unionManyUniqSets, minusUniqSet, mkUniqSet,
- elementOfUniqSet, addListToUniqSet, addOneToUniqSet
- )
-import UniqFM ( UniqFM )
+import {-# SOURCE #-} TypeRep( TyThing )
+
+import OccName -- All of it
+import Module ( Module, ModuleName, moduleName, isHomeModule )
+import CmdLineOpts ( opt_Static )
+import SrcLoc ( noSrcLoc, wiredInSrcLoc, SrcLoc )
+import Unique ( Unique, Uniquable(..), getKey, pprUnique )
+import Maybes ( orElse )
import Outputable
\end{code}
-
%************************************************************************
%* *
-\subsection[Name-pieces-datatypes]{The @OccName@ datatypes}
+\subsection[Name-datatype]{The @Name@ datatype, and name construction}
%* *
%************************************************************************
-
+
\begin{code}
-data OccName = VarOcc FAST_STRING -- Variables and data constructors
- | TvOcc FAST_STRING -- Type variables
- | TCOcc FAST_STRING -- Type constructors and classes
-
-pprOccName :: OccName -> SDoc
-pprOccName n = getPprStyle $ \ sty ->
- if codeStyle sty
- then identToC (occNameString n)
- else ptext (occNameString n)
-
-occNameString :: OccName -> FAST_STRING
-occNameString (VarOcc s) = s
-occNameString (TvOcc s) = s
-occNameString (TCOcc s) = s
-
-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)
-
--- 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"
-
-isVarOcc, isTCOcc, isTvOcc :: OccName -> Bool
-isVarOcc (VarOcc s) = True
-isVarOcc other = False
-
-isTvOcc (TvOcc s) = True
-isTvOcc other = False
-
-isTCOcc (TCOcc s) = True
-isTCOcc other = False
-
-instance Eq OccName where
- a == b = case (a `compare` b) of { EQ -> True; _ -> False }
- a /= b = case (a `compare` b) of { EQ -> False; _ -> True }
-
-instance Ord OccName where
- 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 = cmpOcc a b
-
-(VarOcc s1) `cmpOcc` (VarOcc s2) = s1 `compare` s2
-(VarOcc s1) `cmpOcc` other2 = LT
+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
-(TvOcc s1) `cmpOcc` (VarOcc s2) = GT
-(TvOcc s1) `cmpOcc` (TvOcc s2) = s1 `compare` s2
-(TvOcc s1) `cmpOcc` other = LT
+ | Internal -- A user-defined Id or TyVar
+ -- defined in the module being compiled
-(TCOcc s1) `cmpOcc` (TCOcc s2) = s1 `compare` s2
-(TCOcc s1) `cmpOcc` other = GT
+ | System -- A system-defined Id or TyVar. Typically the
+ -- OccName is very uninformative (like 's')
-instance Outputable OccName where
- ppr = pprOccName
+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}
+Notes about the NameSorts:
-%************************************************************************
-%* *
-\subsection[Name-datatype]{The @Name@ datatype, and name construction}
-%* *
-%************************************************************************
-
-\begin{code}
-data Name
- = Local Unique
- OccName
- SrcLoc
-
- | Global Unique
- Module -- The defining module
- OccName -- Its name in that module
- Provenance -- How it was defined
-\end{code}
+1. Initially, top-level Ids (including locally-defined ones) get External names,
+ and all other local Ids get Internal names
-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.
+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.
-\begin{code}
-data Provenance
- = NoProvenance
+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
- | LocalDef -- Defined locally
- SrcLoc -- Defn site
- ExportFlag -- Whether it's exported
+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
- | NonLocalDef -- Defined non-locally
- SrcLoc -- Defined non-locally; src-loc gives defn site
- IfaceFlavour -- Whether the defn site is an .hi-boot file or not
- PrintUnqualified
+ 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.
- | WiredInTyCon TyCon -- There's a wired-in version
- | WiredInId Id -- ...ditto...
+Built-in syntax => It's a syntactic form, not "in scope" (e.g. [])
-type PrintUnqualified = Bool -- True <=> the unqualified name of this thing is
- -- in scope in this module, so print it unqualified
- -- in error messages
-\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
+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
-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.
+All built-in syntax is for wired-in things.
\begin{code}
-data ExportFlag = Exported | NotExported
+nameUnique :: Name -> Unique
+nameOccName :: Name -> OccName
+nameModule :: Name -> Module
+nameModuleName :: Name -> ModuleName
+nameSrcLoc :: Name -> SrcLoc
+
+nameUnique name = n_uniq name
+nameOccName name = n_occ name
+nameSrcLoc name = n_loc name
\end{code}
\begin{code}
-mkLocalName :: Unique -> OccName -> SrcLoc -> Name
-mkLocalName = Local
-
-mkGlobalName :: Unique -> Module -> OccName -> 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)
-
-mkWiredInTyConName :: Unique -> Module -> FAST_STRING -> TyCon -> Name
-mkWiredInTyConName uniq mod occ tycon
- = Global uniq mod (TCOcc occ) (WiredInTyCon tycon)
+nameIsLocalOrFrom :: Module -> Name -> Bool
+isInternalName :: Name -> Bool
+isExternalName :: Name -> Bool
+isSystemName :: Name -> Bool
+isHomePackageName :: Name -> Bool
+isWiredInName :: Name -> Bool
+isWiredInName (Name {n_sort = WiredIn _ _ _ _}) = True
+isWiredInName other = False
-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
+wiredInNameTyThing_maybe :: Name -> Maybe TyThing
+wiredInNameTyThing_maybe (Name {n_sort = WiredIn _ _ thing _}) = Just thing
+wiredInNameTyThing_maybe other = Nothing
-mkCompoundName str_fn uniq (Global _ mod occ prov)
- = Global uniq mod new_occ prov
- where
- new_occ = VarOcc (str_fn (occNameString occ)) -- Always a VarOcc
+isBuiltInSyntax (Name {n_sort = WiredIn _ _ _ BuiltInSyntax}) = True
+isBuiltInSyntax other = False
-mkCompoundName str_fn uniq (Local _ occ loc)
- = Local uniq (VarOcc (str_fn (occNameString occ))) loc
+isExternalName (Name {n_sort = External _ _}) = True
+isExternalName (Name {n_sort = WiredIn _ _ _ _}) = True
+isExternalName other = False
+isInternalName name = not (isExternalName name)
-setNameProvenance :: Name -> Provenance -> Name
- -- setNameProvenance used to only change the provenance of Implicit-provenance things,
- -- but that gives bad error messages for names defined twice in the same
- -- module, so I changed it to set the provenance of *any* global (SLPJ Jun 97)
-setNameProvenance (Global uniq mod occ _) prov = Global uniq mod occ prov
-setNameProvenance other_name prov = other_name
+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
-getNameProvenance :: Name -> Provenance
-getNameProvenance (Global uniq mod occ prov) = prov
-getNameProvenance (Local uniq occ locn) = LocalDef locn NotExported
+nameParent :: Name -> Name
+nameParent name = case nameParent_maybe name of
+ Just parent -> parent
+ Nothing -> 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 prov) u = Global u mod occ prov
-\end{code}
-
-setNameVisibility is applied to names in the final program
+nameModule name = nameModule_maybe name `orElse` pprPanic "nameModule" (ppr name)
+nameModuleName name = moduleName (nameModule name)
-The Maybe Module argument is (Just mod) for top-level values,
-and Nothing for all others (local values and type variables)
+nameModule_maybe (Name { n_sort = External mod _}) = Just mod
+nameModule_maybe (Name { n_sort = WiredIn mod _ _ _}) = Just mod
+nameModule_maybe name = Nothing
-For top-level things, it globalises Local names
- (if all top-level things should be visible)
- and localises non-exported Global names
- (if only exported things should be visible)
+nameIsLocalOrFrom from name
+ | isExternalName name = from == nameModule name
+ | otherwise = True
-For nested things it localises Global names.
+isHomePackageName name
+ | isExternalName name = isHomeModule (nameModule name)
+ | otherwise = True -- Internal and system names
-In all cases except an exported global, it gives it a new occurrence name.
+isDllName :: Name -> Bool -- Does this name refer to something in a different DLL?
+isDllName nm = not opt_Static && not (isHomePackageName nm)
-The "visibility" here concerns whether the .o file's symbol table
-mentions the thing; if so, it needs a module name in its symbol.
-The Global things are "visible" and the Local ones are not
+isTyVarName :: Name -> Bool
+isTyVarName name = isTvOcc (nameOccName name)
-Why should things be "visible"? Certainly they must be if they
-are exported. But also:
+isSystemName (Name {n_sort = System}) = True
+isSystemName other = False
+\end{code}
-(a) In certain (prelude only) modules we split up the .hc file into
- lots of separate little files, which are separately compiled by the C
- compiler. That gives lots of little .o files. The idea is that if
- you happen to mention one of them you don't necessarily pull them all
- in. (Pulling in a piece you don't need can be v bad, because it may
- mention other pieces you don't need either, and so on.)
-
- Sadly, splitting up .hc files means that local names (like s234) are
- now globally visible, which can lead to clashes between two .hc
- files. So unlocaliseWhatnot goes through making all the local things
- into global things, essentially by giving them full names so when they
- are printed they'll have their module name too. Pretty revolting
- really.
-(b) When optimisation is on we want to make all the internal
- top-level defns externally visible
+%************************************************************************
+%* *
+\subsection{Making names}
+%* *
+%************************************************************************
\begin{code}
-setNameVisibility :: Maybe Module -> Unique -> Name -> Name
-
-setNameVisibility maybe_mod occ_uniq name@(Global uniq mod occ (LocalDef loc NotExported))
- | not all_toplev_ids_visible || not_top_level maybe_mod
- = Local uniq (uniqToOccName occ_uniq) loc -- Localise Global name
-
-setNameVisibility maybe_mod occ_uniq name@(Global _ _ _ _)
- = name -- Otherwise don't fiddle with Global
-
-setNameVisibility (Just mod) occ_uniq (Local uniq occ loc)
- | all_toplev_ids_visible
- = Global uniq mod -- Globalise Local name
- (uniqToOccName occ_uniq)
- (LocalDef loc NotExported)
-
-setNameVisibility maybe_mod occ_uniq (Local uniq occ loc)
- = Local uniq (uniqToOccName occ_uniq) loc -- New OccName for Local
+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 -> UserFS -> Name
+mkSystemName uniq fs = Name { n_uniq = uniq, n_sort = System,
+ n_occ = mkVarOcc fs, n_loc = noSrcLoc }
+
+-- Use this version when the string is already encoded. Avoids duplicating
+-- the string each time a new name is created.
+mkSystemNameEncoded :: Unique -> EncodedFS -> Name
+mkSystemNameEncoded uniq fs = Name { n_uniq = uniq, n_sort = System,
+ n_occ = mkSysOccFS varName fs,
+ n_loc = noSrcLoc }
+
+mkSysTvName :: Unique -> EncodedFS -> Name
+mkSysTvName uniq fs = Name { n_uniq = uniq, n_sort = System,
+ n_occ = mkSysOccFS tvName fs,
+ n_loc = noSrcLoc }
+
+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}
-uniqToOccName uniq = VarOcc (_PK_ ('$':showUnique uniq))
- -- The "$" is to make sure that this OccName is distinct from all user-defined ones
+\begin{code}
+-- 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.
+setNameUnique name uniq = name {n_uniq = uniq}
-not_top_level (Just m) = False
-not_top_level Nothing = True
+setNameOcc :: Name -> OccName -> Name
+setNameOcc name occ = name {n_occ = occ}
-all_toplev_ids_visible = not opt_OmitInterfacePragmas || -- Pragmas can make them visible
- opt_EnsureSplittableC -- Splitting requires visiblilty
+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
-nameModule :: Name -> Module
-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
-
-nameModule (Global _ mod occ _) = mod
-
-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 _ _ _ (NonLocalDef loc _ _)) = loc
-nameSrcLoc (Global _ _ _ (WiredInTyCon _)) = mkBuiltinSrcLoc
-nameSrcLoc (Global _ _ _ (WiredInId _)) = mkBuiltinSrcLoc
-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 _ _) = compare u1 u2
- c (Local _ _ _) _ = LT
- c (Global u1 _ _ _) (Global u2 _ _ _) = compare u1 u2
- c (Global _ _ _ _) _ = GT
+cmpName n1 n2 = n_uniq n1 `compare` n_uniq n2
\end{code}
\begin{code}
a /= b = case (a `compare` b) of { EQ -> False; _ -> True }
instance Ord Name where
- 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 -> 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
- -- When printing interfaces, all Locals have been given nice print-names
+ -- When printing interfaces, all Internals have been given nice print-names
ppr name = pprName name
-pprName name
- = getPprStyle $ \ sty ->
- let
- ppr (Local u n _)
- | userStyle sty
- || ifaceStyle sty = ptext (occNameString n)
- | codeStyle sty = pprUnique u
- | otherwise = hcat [ptext (occNameString n), ptext SLIT("_"), pprUnique u]
-
- ppr name@(Global u m n prov)
- | codeStyle sty
- = identToC (m _APPEND_ SLIT(".") _APPEND_ occNameString n)
-
- | otherwise
- = hcat [pp_mod_dot, ptext (occNameString n), pp_debug sty name]
- where
- pp_mod_dot
- = case prov of -- Omit home module qualifier if its in scope
- LocalDef _ _ -> pp_qual dot (user_sty || iface_sty)
- NonLocalDef _ hif omit -> pp_qual (pp_hif hif) (omit && user_sty)
- WiredInTyCon _ -> pp_qual dot user_sty -- Hack: omit qualifers on wired in things
- WiredInId _ -> pp_qual dot user_sty -- in user style only
- NoProvenance -> pp_qual dot False
-
- pp_qual sep omit_qual
- | omit_qual = empty
- | otherwise = pprModule m <> sep
-
- dot = text "."
- pp_hif HiFile = dot -- Vanilla case
- pp_hif HiBootFile = text "!" -- M!t indicates a name imported from a .hi-boot interface
-
- user_sty = userStyle sty
- iface_sty = ifaceStyle sty
- in
- ppr name
-
-
-pp_debug sty (Global uniq m n prov)
- | debugStyle sty = hcat [text "{-", pprUnique uniq, prov_p, text "-}"]
- | otherwise = empty
- where
- prov_p | opt_PprStyle_All = comma <> pp_prov prov
- | otherwise = empty
-
-pp_prov (LocalDef _ Exported) = char 'x'
-pp_prov (LocalDef _ NotExported) = char 'l'
-pp_prov (NonLocalDef _ _ _) = char 'n'
-pp_prov (WiredInTyCon _) = char 'W'
-pp_prov (WiredInId _) = char 'w'
-pp_prov NoProvenance = char '?'
-
--- pprNameProvenance is used in error messages to say where a name came from
-pprNameProvenance :: Name -> SDoc
-pprNameProvenance (Local _ _ loc) = pprProvenance (LocalDef loc NotExported)
-pprNameProvenance (Global _ _ _ prov) = pprProvenance prov
-
-pprProvenance :: Provenance -> SDoc
-pprProvenance (LocalDef loc _) = ptext SLIT("Locally defined at") <+> ppr loc
-pprProvenance (NonLocalDef loc _ _) = ptext SLIT("Non-locally defined at") <+> ppr loc
-pprProvenance (WiredInTyCon tc) = ptext SLIT("Wired-in tycon")
-pprProvenance (WiredInId id) = ptext SLIT("Wired-in id")
-pprProvenance NoProvenance = ptext SLIT("No provenance")
-\end{code}
-
+instance OutputableBndr Name where
+ pprBndr _ name = pprName name
-%************************************************************************
-%* *
-\subsection[Sets of names}
-%* *
-%************************************************************************
-
-\begin{code}
-type NameSet = UniqSet Name
-emptyNameSet :: NameSet
-unitNameSet :: Name -> NameSet
-addListToNameSet :: NameSet -> [Name] -> NameSet
-addOneToNameSet :: 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
-addOneToNameSet = addOneToUniqSet
-unionNameSets = unionUniqSets
-unionManyNameSets = unionManyUniqSets
-minusNameSet = minusUniqSet
-elemNameSet = elementOfUniqSet
-nameSetToList = uniqSetToList
+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_name <> char '_' <> pprOccName 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 = sep [ppr mod_name <> dot <> pprOccName occ,
+ hsep [text "{-"
+ , if is_wired then ptext SLIT("(w)") else empty
+ , pprUnique uniq
+-- (overkill) , case mb_p of
+-- Nothing -> empty
+-- Just n -> brackets (ppr n)
+ , text "-}"]]
+ | BuiltInSyntax <- is_builtin = pprOccName occ
+ -- never qualify builtin syntax
+ | unqualStyle sty mod_name occ = pprOccName occ
+ | otherwise = ppr mod_name <> dot <> pprOccName occ
+ where
+ mod_name = moduleName mod
+
+pprInternal sty uniq occ
+ | codeStyle sty = pprUnique uniq
+ | debugStyle sty = pprOccName occ <> text "{-" <> pprUnique uniq <> text "-}"
+ | otherwise = pprOccName occ -- User style
+
+-- Like Internal, except that we only omit the unique in Iface style
+pprSystem sty uniq occ
+ | codeStyle sty = pprUnique uniq
+ | otherwise = pprOccName occ <> char '_' <> pprUnique uniq
+ -- If the tidy phase hasn't run, the OccName
+ -- is unlikely to be informative (like 's'),
+ -- so print the unique
\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)
-getModule :: NamedThing a => a -> Module
getSrcLoc :: NamedThing a => a -> SrcLoc
-isLocallyDefined :: NamedThing a => a -> Bool
-isExported :: NamedThing a => a -> Bool
getOccString :: NamedThing a => a -> String
-modAndOcc = nameModAndOcc . getName
-getModule = nameModule . getName
-isExported = isExportedName . getName
getSrcLoc = nameSrcLoc . getName
-isLocallyDefined = isLocallyDefinedName . getName
-getOccString x = _UNPK_ (occNameString (getOccName x))
+getOccString = occNameString . getOccName
\end{code}
-\begin{code}
-{-# SPECIALIZE isLocallyDefined
- :: Name -> Bool
- #-}
-\end{code}