X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FName.lhs;h=7ff32cb45f6c0fc5560f22d71bfb012d7b6b4fd8;hb=801c9549052461a51db94cc9618816c5862800c9;hp=a84e626f98820c157a1534cbc5319c440d1fe62f;hpb=7e602b0a11e567fcb035d1afd34015aebcf9a577;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Name.lhs b/ghc/compiler/basicTypes/Name.lhs index a84e626..7ff32cb 100644 --- a/ghc/compiler/basicTypes/Name.lhs +++ b/ghc/compiler/basicTypes/Name.lhs @@ -10,49 +10,40 @@ module Name ( -- The Name type Name, -- Abstract - mkLocalName, mkSysLocalName, mkTopName, - mkDerivedName, mkGlobalName, - mkWiredInIdName, mkWiredInTyConName, - maybeWiredInIdName, maybeWiredInTyConName, - isWiredInName, - - nameUnique, setNameUnique, setNameProvenance, getNameProvenance, - tidyTopName, mkNameVisible, - nameOccName, nameModule, setNameOcc, - - isExportedName, nameSrcLoc, - isLocallyDefinedName, - - isSysLocalName, isLocalName, isGlobalName, isExternallyVisibleName, - - pprNameProvenance, - - -- Misc - Provenance(..), ImportReason(..), pprProvenance, - ExportFlag(..), PrintUnqualified, - + mkInternalName, mkSystemName, mkFCallName, + mkIPName, + mkExternalName, mkKnownKeyExternalName, mkWiredInName, + + nameUnique, setNameUnique, + nameOccName, nameModule, nameModule_maybe, + setNameOcc, nameRdrName, setNameModuleAndLoc, + toRdrName, hashName, + externaliseName, localiseName, + + nameSrcLoc, + + isSystemName, isInternalName, isExternalName, + isTyVarName, isDllName, + nameIsLocalOrFrom, isHomePackageName, + -- Class NamedThing and overloaded friends NamedThing(..), - modAndOcc, isExported, - getSrcLoc, isLocallyDefined, getOccString + getSrcLoc, getOccString, toRdrName ) where #include "HsVersions.h" -import {-# SOURCE #-} Var ( Id ) -import {-# SOURCE #-} TyCon ( TyCon ) - import OccName -- All of it -import CmdLineOpts ( opt_PprStyle_NoPrags, opt_OmitInterfacePragmas, opt_EnsureSplittableC ) -import BasicTypes ( IfaceFlavour(..) ) - -import SrcLoc ( noSrcLoc, mkBuiltinSrcLoc, SrcLoc ) -import Unique ( pprUnique, Unique, Uniquable(..) ) +import Module ( Module, moduleName, mkVanillaModule, isHomeModule ) +import RdrName ( RdrName, mkRdrOrig, mkRdrUnqual, rdrNameOcc, rdrNameModule ) +import CmdLineOpts ( opt_Static ) +import SrcLoc ( builtinSrcLoc, noSrcLoc, SrcLoc ) +import Unique ( Unique, Uniquable(..), u2i, pprUnique ) +import FastTypes +import Binary import Outputable -import GlaExts \end{code} - %************************************************************************ %* * \subsection[Name-datatype]{The @Name@ datatype, and name construction} @@ -60,260 +51,166 @@ import GlaExts %************************************************************************ \begin{code} -data Name - = Local Unique - OccName -- How to print it - Bool -- True <=> this is a "sys-local" - -- see notes just below +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 -- (a) TyCon, Class, their derived Ids, dfun Id + -- (b) Imported Id + -- (c) Top-level Id in the original source, even if + -- locally defined + + | 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') +\end{code} +Notes about the NameSorts: - | 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 -Sys-locals are only used internally. When the compiler generates (say) -a fresh desguar variable it always calls it "ds", and of course it gets -a fresh unique. But when printing -ddump-xx dumps, we must print it with -its unique, because there'll be a lot of "ds" variables. That debug -printing issue is the ONLY way in which sys-locals are different. I think. +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. -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 ordinary locals -If any desugarer sys-locals have survived that far, they get changed to -"ds1", "ds2", etc. +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 -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. +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 + 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. \begin{code} -mkLocalName :: Unique -> OccName -> Name -mkLocalName uniq occ = Local uniq occ False - -- 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) +nameUnique :: Name -> Unique +nameOccName :: Name -> OccName +nameModule :: Name -> Module +nameSrcLoc :: Name -> SrcLoc -mkGlobalName :: Unique -> Module -> OccName -> Provenance -> Name -mkGlobalName = Global - -mkSysLocalName :: Unique -> FAST_STRING -> Name -mkSysLocalName uniq fs = Local uniq (varOcc fs) True - -mkTopName :: Unique -> Module -> FAST_STRING -> Name - -- Make a top-level name; make it Global if top-level - -- things should be externally visible; Local otherwise - -- This chap is only used *after* the tidyCore phase - -- Notably, it is used during STG lambda lifting - -- - -- We have to make sure that the name is globally unique - -- and we don't have tidyCore to help us. So we append - -- the unique. Hack! Hack! -mkTopName uniq mod fs - | all_toplev_ids_visible = Global uniq mod occ (LocalDef noSrcLoc NotExported) - | otherwise = Local uniq occ False - where - occ = varOcc (_PK_ ((_UNPK_ fs) ++ show uniq)) - -mkWiredInIdName :: Unique -> Module -> OccName -> Id -> Name -mkWiredInIdName uniq mod occ id = Global uniq mod occ (WiredInId id) - --- mkWiredInTyConName takes a FAST_STRING instead of --- an OccName, which is a bit yukky but that's what the --- clients find easiest. -mkWiredInTyConName :: Unique -> Module -> FAST_STRING -> TyCon -> Name -mkWiredInTyConName uniq mod occ tycon - = Global uniq mod (tcOcc occ) (WiredInTyCon tycon) - -mkDerivedName :: (OccName -> OccName) - -> Name -- Base name - -> Unique -- New unique - -> Name -- Result is always a value name - -mkDerivedName f (Global _ mod occ prov) uniq = Global uniq mod (f occ) prov -mkDerivedName f (Local _ occ sys) uniq = Local uniq (f occ) sys +nameUnique name = n_uniq name +nameOccName name = n_occ name +nameSrcLoc name = n_loc 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. -setNameUnique (Local _ occ sys) u = Local u occ sys -setNameUnique (Global _ mod occ prov) u = Global u mod occ prov +nameModule (Name { n_sort = External mod }) = mod +nameModule name = pprPanic "nameModule" (ppr name) -setNameOcc :: Name -> OccName -> Name - -- Give the thing a new OccName, *and* - -- record that it's no longer a sys-local - -- This is used by the tidy-up pass -setNameOcc (Global uniq mod _ prov) occ = Global uniq mod occ prov -setNameOcc (Local uniq _ sys) occ = Local uniq occ False +nameModule_maybe (Name { n_sort = External mod }) = Just mod +nameModule_maybe name = Nothing \end{code} +\begin{code} +nameIsLocalOrFrom :: Module -> Name -> Bool +isInternalName :: Name -> Bool +isExternalName :: Name -> Bool +isSystemName :: Name -> Bool +isHomePackageName :: Name -> Bool -%************************************************************************ -%* * -\subsection{Setting provenance and visibility -%* * -%************************************************************************ - -tidyTopName is applied to top-level names in the final program - -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) - -In all cases except an exported global, it gives it a new occurrence name. +isExternalName (Name {n_sort = External _}) = True +isExternalName other = False -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 +isInternalName name = not (isExternalName name) -Why should things be "visible"? Certainly they must be if they -are exported. But also: +nameIsLocalOrFrom from (Name {n_sort = External mod}) = mod == from +nameIsLocalOrFrom from other = True -(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. +isHomePackageName (Name {n_sort = External mod}) = isHomeModule mod +isHomePackageName other = True -- Internal and system names -(b) When optimisation is on we want to make all the internal - top-level defns externally visible +isDllName :: Name -> Bool -- Does this name refer to something in a different DLL? +isDllName nm = not opt_Static && not (isHomePackageName nm) -\begin{code} -tidyTopName :: Module -> TidyOccEnv -> Name -> (TidyOccEnv, Name) -tidyTopName mod env name - | isExported name = (env, name) -- Don't fiddle with an exported name - -- It should be in the TidyOccEnv already - | otherwise = (env', name') - where - prov = getNameProvenance name - uniq = nameUnique name - (env', occ') = tidyOccName env (nameOccName name) - - name' | all_toplev_ids_visible = Global uniq mod occ' prov - | otherwise = Local uniq occ' False - -all_toplev_ids_visible = - not opt_OmitInterfacePragmas || -- Pragmas can make them visible - opt_EnsureSplittableC -- Splitting requires visiblilty -\end{code} +isTyVarName :: Name -> Bool +isTyVarName name = isTvOcc (nameOccName name) -\begin{code} -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 - -getNameProvenance :: Name -> Provenance -getNameProvenance (Global uniq mod occ prov) = prov -getNameProvenance (Local _ _ _) = LocalDef noSrcLoc NotExported -\end{code} - -\begin{code} --- make the Name globally visible regardless. -mkNameVisible :: Module -> Unique -> Name -> Name -mkNameVisible mod occ_uniq nm@(Global _ _ _ _) = nm -mkNameVisible mod occ_uniq nm@(Local uniq occ _) - = Global uniq mod occ (LocalDef noSrcLoc Exported) +isSystemName (Name {n_sort = System}) = True +isSystemName other = False \end{code} %************************************************************************ %* * -\subsection{Provenance and export info} +\subsection{Making names} %* * %************************************************************************ \begin{code} -data Provenance - = NoProvenance - - | LocalDef -- Defined locally - SrcLoc -- Defn site - ExportFlag -- Whether it's exported - - | NonLocalDef -- Defined non-locally - ImportReason - IfaceFlavour -- Whether the defn site is an .hi-boot file - PrintUnqualified - - | WiredInTyCon TyCon -- There's a wired-in version - | WiredInId Id -- ...ditto... - -data ImportReason - = UserImport Module SrcLoc Bool -- Imported from module M on line L - -- Note the M may well not be the defining module - -- for this thing! - -- The Bool is true iff the thing was named *explicitly* in the import spec, - -- rather than being imported as part of a group; e.g. - -- import B - -- import C( T(..) ) - -- Here, everything imported by B, and the constructors of T - -- are not named explicitly; only T is named explicitly. - -- This info is used when warning of unused names. - - | ImplicitImport -- Imported implicitly for some other reason - - -type PrintUnqualified = Bool -- True <=> the unqualified name of this thing is - -- in scope in this module, so print it - -- unqualified in error messages - -data ExportFlag = Exported | NotExported -\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. +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 -> SrcLoc -> Name +mkExternalName uniq mod occ loc = Name { n_uniq = uniq, n_sort = External mod, + n_occ = occ, n_loc = loc } + +mkKnownKeyExternalName :: RdrName -> Unique -> Name +mkKnownKeyExternalName rdr_name uniq + = mkExternalName uniq (mkVanillaModule (rdrNameModule rdr_name)) + (rdrNameOcc rdr_name) + builtinSrcLoc + +mkWiredInName :: Module -> OccName -> Unique -> Name +mkWiredInName mod occ uniq = mkExternalName uniq mod occ builtinSrcLoc + +mkSystemName :: Unique -> EncodedFS -> Name +mkSystemName uniq fs = Name { n_uniq = uniq, n_sort = System, + n_occ = mkVarOcc 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} \begin{code} --- pprNameProvenance is used in error messages to say where a name came from -pprNameProvenance :: Name -> SDoc -pprNameProvenance name = pprProvenance (getNameProvenance name) - -pprProvenance :: Provenance -> SDoc -pprProvenance NoProvenance = ptext SLIT("No provenance") -pprProvenance (LocalDef loc _) = ptext SLIT("defined at") <+> ppr loc -pprProvenance (WiredInTyCon tc) = ptext SLIT("Wired-in tycon") -pprProvenance (WiredInId id) = ptext SLIT("Wired-in id") -pprProvenance (NonLocalDef ImplicitImport _ _) - = ptext SLIT("implicitly imported") -pprProvenance (NonLocalDef (UserImport mod loc _) _ _) - = ptext SLIT("imported from") <+> ppr mod <+> ptext SLIT("at") <+> ppr loc +-- 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} + +setNameOcc :: Name -> OccName -> Name +setNameOcc name occ = name {n_occ = occ} + +externaliseName :: Name -> Module -> Name +externaliseName n mod = n { n_sort = External mod } + +localiseName :: Name -> Name +localiseName n = n { n_sort = Internal } + +setNameModuleAndLoc :: Name -> Module -> SrcLoc -> Name +setNameModuleAndLoc name mod loc = name {n_sort = set (n_sort name), n_loc = loc} + where + set (External _) = External mod \end{code} @@ -324,73 +221,15 @@ pprProvenance (NonLocalDef (UserImport mod loc _) _ _) %************************************************************************ \begin{code} -nameUnique :: Name -> Unique -nameModAndOcc :: Name -> (Module, OccName) -- Globals only -nameOccName :: Name -> OccName -nameModule :: Name -> Module -nameSrcLoc :: Name -> SrcLoc -isLocallyDefinedName :: Name -> Bool -isExportedName :: Name -> Bool -isWiredInName :: Name -> Bool -isLocalName :: Name -> Bool -isGlobalName :: Name -> Bool -isExternallyVisibleName :: Name -> Bool - - - -nameUnique (Local u _ _) = u -nameUnique (Global u _ _ _) = u +hashName :: Name -> Int +hashName name = iBox (u2i (nameUnique name)) -nameOccName (Local _ occ _) = occ -nameOccName (Global _ _ occ _) = occ -nameModule (Global _ mod occ _) = mod - -nameModAndOcc (Global _ mod occ _) = (mod,occ) - -isExportedName (Global _ _ _ (LocalDef _ Exported)) = True -isExportedName other = False - -nameSrcLoc (Global _ _ _ (LocalDef loc _)) = loc -nameSrcLoc (Global _ _ _ (NonLocalDef (UserImport _ 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 - -isSysLocalName (Local _ _ sys) = sys -isSysLocalName other = False - -isGlobalName (Global _ _ _ _) = True -isGlobalName other = False - --- Global names are by definition those that are visible --- outside the module, *as seen by the linker*. Externally visible --- does not mean visible at the source level (that's isExported). -isExternallyVisibleName name = isGlobalName name +nameRdrName :: Name -> RdrName +-- Makes a qualified name for top-level (External) names, +-- whether locally defined or not and an unqualified name just for Internals +nameRdrName (Name { n_occ = occ, n_sort = External mod }) = mkRdrOrig (moduleName mod) occ +nameRdrName (Name { n_occ = occ }) = mkRdrUnqual occ \end{code} @@ -401,12 +240,7 @@ isExternallyVisibleName name = isGlobalName name %************************************************************************ \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} @@ -415,8 +249,8 @@ instance Eq Name where 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 @@ -428,6 +262,26 @@ instance NamedThing Name where getName n = n \end{code} +%************************************************************************ +%* * +\subsection{Binary output} +%* * +%************************************************************************ + +\begin{code} +instance Binary Name where + -- we must print these as RdrNames, because that's how they will be read in + put_ bh Name {n_sort = sort, n_uniq = uniq, n_occ = occ} = + case sort of + External mod + | this_mod == mod -> put_ bh (mkRdrUnqual occ) + | otherwise -> put_ bh (mkRdrOrig (moduleName mod) occ) + where (this_mod,_,_,_) = getUserData bh + _ -> do + put_ bh (mkRdrUnqual occ) + + get bh = error "can't Binary.get a Name" +\end{code} %************************************************************************ %* * @@ -437,68 +291,40 @@ instance NamedThing Name where \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 (Local uniq occ sys_local) - = getPprStyle $ \ sty -> - if codeStyle sty then - pprUnique uniq -- When printing in code we required all names to - -- be globally unique; for example, we use this identifier - -- for the closure name. So we just print the unique alone. - else - pprOccName occ <> pp_local_extra sty uniq - where - pp_local_extra sty uniq - | sys_local = underscore <> pprUnique uniq -- Must print uniques for sys_locals - | debugStyle sty = text "{-" <> pprUnique uniq <> text "-}" - | otherwise = empty - - -pprName (Global uniq mod occ prov) +pprName name@(Name {n_sort = sort, n_uniq = uniq, n_occ = occ}) = getPprStyle $ \ sty -> - if codeStyle sty then - ppr mod <> underscore <> ppr occ - else - pp_mod_dot sty <> ppr occ <> pp_global_debug sty uniq prov - where - pp_mod_dot sty - = case prov of -- Omit home module qualifier if in scope - LocalDef _ _ -> pp_qual dot (user_sty || iface_sty) - NonLocalDef _ hif omit -> pp_qual (pp_hif hif) (omit && user_sty) - -- Hack: omit qualifers on wired in things - -- in user style only - WiredInTyCon _ -> pp_qual dot user_sty - WiredInId _ -> pp_qual dot user_sty - NoProvenance -> pp_qual dot False - where - user_sty = userStyle sty - iface_sty = ifaceStyle sty - - pp_qual sep omit_qual - | omit_qual = empty - | otherwise = pprModule mod <> sep - - pp_hif HiFile = dot -- Vanilla case - pp_hif HiBootFile = text "!" -- M!t indicates a name imported from a .hi-boot interface - - pp_global_debug sty uniq prov - | debugStyle sty = hcat [text "{-", pprUnique uniq, prov_p prov, text "-}"] - | otherwise = empty - - prov_p prov | opt_PprStyle_NoPrags = empty - | otherwise = comma <> pp_prov prov - -pp_prov (LocalDef _ Exported) = char 'x' -pp_prov (LocalDef _ NotExported) = char 'l' -pp_prov (NonLocalDef ImplicitImport _ _) = char 'i' -pp_prov (NonLocalDef explicitimport _ _) = char 'I' -pp_prov (WiredInTyCon _) = char 'W' -pp_prov (WiredInId _) = char 'w' -pp_prov NoProvenance = char '?' + case sort of + External mod -> pprExternal sty name uniq mod occ + System -> pprSystem sty uniq occ + Internal -> pprInternal sty uniq occ + +pprExternal sty name uniq mod occ + | codeStyle sty = ppr (moduleName mod) <> char '_' <> pprOccName occ + + | debugStyle sty = ppr (moduleName mod) <> dot <> pprOccName occ <> + text "{-" <> pprUnique uniq <> text "-}" + + | unqualStyle sty name = pprOccName occ + | otherwise = ppr (moduleName mod) <> dot <> pprOccName occ + +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} @@ -507,26 +333,19 @@ pp_prov NoProvenance = char '?' \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 +toRdrName :: NamedThing a => a -> RdrName -modAndOcc = nameModAndOcc . getName -isExported = isExportedName . getName getSrcLoc = nameSrcLoc . getName -isLocallyDefined = isLocallyDefinedName . getName -getOccString x = occNameString (getOccName x) +getOccString = occNameString . getOccName +toRdrName = nameRdrName . getName \end{code} -\begin{code} -{-# SPECIALIZE isLocallyDefined :: Name -> Bool #-} -\end{code}