X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FName.lhs;h=a508c74132a3f287137f12e6a260a20c80a0b761;hb=a8a2fc9c81ec4e8991a9a9f75f26c19d7f88d560;hp=7304c35e1a28d8735ac42d836835f4384e060d3e;hpb=dcef38bab91d45b56f7cf3ceeec96303d93728bb;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Name.lhs b/ghc/compiler/basicTypes/Name.lhs index 7304c35..a508c74 100644 --- a/ghc/compiler/basicTypes/Name.lhs +++ b/ghc/compiler/basicTypes/Name.lhs @@ -1,301 +1,253 @@ % -% (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, 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, getNameProvenance, - setNameVisibility, - nameOccName, nameString, nameModule, - - isExportedName, nameSrcLoc, - isLocallyDefinedName, - - isLocalName, - - pprNameProvenance, - - -- Sets of Names - SYN_IE(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, + + isSystemName, isInternalName, isExternalName, + isTyVarName, isWiredInName, isBuiltInSyntax, + wiredInNameTyThing_maybe, + nameIsLocalOrFrom, + -- Class NamedThing and overloaded friends NamedThing(..), - modAndOcc, isExported, - getSrcLoc, isLocallyDefined, getOccString + 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 Usage ( SYN_IE(UVar), SYN_IE(Usage) ) -import Unique ( pprUnique, showUnique, Unique ) -import UniqSet ( UniqSet(..), emptyUniqSet, unitUniqSet, unionUniqSets, uniqSetToList, isEmptyUniqSet, - unionManyUniqSets, minusUniqSet, mkUniqSet, elementOfUniqSet, addListToUniqSet ) -import UniqFM ( UniqFM, SYN_IE(Uniquable) ) -import Util --( cmpPString, panic, assertPanic {-, pprTrace ToDo:rm-} ) +#include "HsVersions.h" -\end{code} +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 ) +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 OccName = VarOcc FAST_STRING -- Variables and data constructors - | TvOcc FAST_STRING -- Type variables - | TCOcc FAST_STRING -- Type constructors and classes - -moduleString :: Module -> String -moduleString mod = _UNPK_ mod - -pprModule :: PprStyle -> Module -> Doc -pprModule sty m = ptext m - -pprOccName :: PprStyle -> OccName -> Doc -pprOccName sty n = 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" +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 -isVarOcc, isTCOcc, isTvOcc :: OccName -> Bool -isVarOcc (VarOcc s) = True -isVarOcc other = False + | Internal -- A user-defined Id or TyVar + -- defined in the module being compiled -isTvOcc (TvOcc s) = True -isTvOcc other = False + | System -- A system-defined Id or TyVar. Typically the + -- OccName is very uninformative (like 's') -isTCOcc (TCOcc s) = True -isTCOcc other = False +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: -instance Eq OccName where - a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False } - a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True } +1. Initially, top-level Ids (including locally-defined ones) get External names, + and all other local Ids get Internal names -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 } +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. -instance Ord3 OccName where - cmp = cmpOcc +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 -(VarOcc s1) `cmpOcc` (VarOcc s2) = s1 `_CMP_STRING_` s2 -(VarOcc s1) `cmpOcc` other2 = LT_ +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 -(TvOcc s1) `cmpOcc` (VarOcc s2) = GT_ -(TvOcc s1) `cmpOcc` (TvOcc s2) = s1 `_CMP_STRING_` s2 -(TvOcc s1) `cmpOcc` other = LT_ + 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. -(TCOcc s1) `cmpOcc` (TCOcc s2) = s1 `_CMP_STRING_` s2 -(TCOcc s1) `cmpOcc` other = GT_ +Built-in syntax => It's a syntactic form, not "in scope" (e.g. []) -instance Outputable OccName where - ppr = pprOccName -\end{code} +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 +All built-in syntax is for wired-in things. \begin{code} -parenInCode, quoteInText :: OccName -> Bool -parenInCode occ = isLexSym (occNameString occ) - -quoteInText occ = not (isLexSym (occNameString occ)) -\end{code} +nameUnique :: Name -> Unique +nameOccName :: Name -> OccName +nameModule :: Name -> Module +nameSrcLoc :: Name -> SrcLoc -%************************************************************************ -%* * -\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 - DefnInfo -- How it is defined - Provenance -- How it was brought into scope +nameUnique name = n_uniq name +nameOccName name = n_occ name +nameSrcLoc name = n_loc name \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 -\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 +nameIsLocalOrFrom :: Module -> Name -> Bool +isInternalName :: Name -> Bool +isExternalName :: Name -> Bool +isSystemName :: Name -> Bool +isWiredInName :: Name -> Bool -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. +isWiredInName (Name {n_sort = WiredIn _ _ _ _}) = True +isWiredInName other = False -\begin{code} -data ExportFlag = Exported | NotExported -\end{code} +wiredInNameTyThing_maybe :: Name -> Maybe TyThing +wiredInNameTyThing_maybe (Name {n_sort = WiredIn _ _ thing _}) = Just thing +wiredInNameTyThing_maybe other = Nothing -\begin{code} -mkLocalName :: Unique -> OccName -> SrcLoc -> Name -mkLocalName = Local +isBuiltInSyntax (Name {n_sort = WiredIn _ _ _ BuiltInSyntax}) = True +isBuiltInSyntax other = False -mkGlobalName :: Unique -> Module -> OccName -> DefnInfo -> Provenance -> Name -mkGlobalName = Global +isExternalName (Name {n_sort = External _ _}) = True +isExternalName (Name {n_sort = WiredIn _ _ _ _}) = True +isExternalName other = False -mkSysLocalName :: Unique -> FAST_STRING -> SrcLoc -> Name -mkSysLocalName uniq str loc = Local uniq (VarOcc str) loc +isInternalName name = not (isExternalName name) -mkWiredInIdName :: Unique -> Module -> FAST_STRING -> Id -> Name -mkWiredInIdName uniq mod occ id - = Global uniq mod (VarOcc occ) (WiredInId id) Implicit +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 -mkWiredInTyConName :: Unique -> Module -> FAST_STRING -> TyCon -> Name -mkWiredInTyConName uniq mod occ tycon - = Global uniq mod (TCOcc occ) (WiredInTyCon tycon) Implicit +nameParent :: Name -> Name +nameParent name = case nameParent_maybe name of + Just parent -> parent + Nothing -> name +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 -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 +nameIsLocalOrFrom from name + | isExternalName name = from == nameModule name + | otherwise = True -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 +isTyVarName :: Name -> Bool +isTyVarName name = isTvOcc (nameOccName name) -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 +isSystemName (Name {n_sort = System}) = True +isSystemName other = False +\end{code} -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 +%************************************************************************ +%* * +\subsection{Making names} +%* * +%************************************************************************ -getNameProvenance :: Name -> Provenance -getNameProvenance (Global uniq mod occ def prov) = prov -getNameProvenance (Local uniq occ locn) = LocalDef NotExported locn +\begin{code} +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} +\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. -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 - -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) +setNameUnique name uniq = name {n_uniq = uniq} -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} @@ -303,63 +255,8 @@ all_toplev_ids_visible = not opt_OmitInterfacePragmas || -- Pragmas can make th %************************************************************************ \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 _ _ _ _ (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} @@ -370,37 +267,29 @@ isLocalName _ = False %************************************************************************ \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} @@ -409,85 +298,57 @@ instance NamedThing Name where \begin{code} instance Outputable Name where - ppr PprQuote name@(Local _ _ _) = quotes (ppr PprForUser name) - ppr PprForUser (Local _ n _) = ptext (occNameString n) - - ppr sty (Local u n _) | codeStyle sty || - ifaceStyle sty = pprUnique u - - ppr sty (Local u n _) = hcat [ptext (occNameString n), ptext SLIT("_"), pprUnique u] - - ppr PprQuote name@(Global _ _ _ _ _) = quotes (ppr PprForUser name) - - ppr sty name@(Global u m n _ _) - | codeStyle sty - = identToC (m _APPEND_ SLIT(".") _APPEND_ occNameString n) - - ppr sty name@(Global u m n _ prov) - = hcat [pp_mod, ptext (occNameString n), pp_debug sty name] - where - pp_mod = case prov of --- Omit home module qualifier - LocalDef _ _ -> empty - other -> pprModule PprForUser m <> char '.' - - -pp_debug PprDebug (Global uniq m n _ prov) = hcat [text "{-", pprUnique uniq, char ',', - pp_prov prov, text "-}"] - where - pp_prov (LocalDef Exported _) = char 'x' - pp_prov (LocalDef NotExported _) = char 'l' - pp_prov (Imported _ _) = char 'i' - pp_prov Implicit = char 'p' -pp_debug other name = empty - --- pprNameProvenance is used in error messages to say where a name came from -pprNameProvenance :: PprStyle -> Name -> Doc -pprNameProvenance sty (Local _ _ loc) = pprProvenance sty (LocalDef NotExported loc) -pprNameProvenance sty (Global _ _ _ _ prov) = pprProvenance sty prov - -pprProvenance :: PprStyle -> Provenance -> Doc -pprProvenance sty (Imported mod loc) - = sep [ptext SLIT("Imported from"), pprModule sty mod, ptext SLIT("at"), ppr sty loc] -pprProvenance sty (LocalDef _ loc) - = sep [ptext 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} @@ -496,30 +357,17 @@ nameSetToList = uniqSetToList \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}