X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FName.lhs;h=1e1fb31f846afd7ed2bbf709d9ecc7192ed99d17;hb=ac10f8408520a30e8437496d320b8b86afda2e8f;hp=20b38e918bbdd8d155f270b167f7f04afdd7f7c8;hpb=18976e614fd90a8d81ced2c3e9cd8e38d72a1f40;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Name.lhs b/ghc/compiler/basicTypes/Name.lhs index 20b38e9..1e1fb31 100644 --- a/ghc/compiler/basicTypes/Name.lhs +++ b/ghc/compiler/basicTypes/Name.lhs @@ -10,49 +10,42 @@ module Name ( -- The Name type Name, -- Abstract - mkLocalName, mkSysLocalName, mkTopName, - mkDerivedName, mkGlobalName, - mkWiredInIdName, mkWiredInTyConName, - maybeWiredInIdName, maybeWiredInTyConName, - isWiredInName, - - nameUnique, setNameUnique, setNameProvenance, getNameProvenance, setNameImportReason, - tidyTopName, - nameOccName, nameModule, setNameOcc, nameRdrName, setNameModule, - - isExportedName, nameSrcLoc, - isLocallyDefinedName, - - isSystemName, isLocalName, isGlobalName, isExternallyVisibleName, - - - -- Provenance - Provenance(..), ImportReason(..), pprProvenance, - ExportFlag(..), PrintUnqualified, - pprNameProvenance, systemProvenance, - + BuiltInSyntax(..), + mkInternalName, mkSystemName, + mkSystemVarName, mkSysTvName, + mkFCallName, mkIPName, + mkExternalName, mkWiredInName, + + nameUnique, setNameUnique, + nameOccName, nameModule, nameModule_maybe, + tidyNameOcc, + hashName, localiseName, + + nameSrcLoc, nameParent, nameParent_maybe, isImplicitName, + + isSystemName, isInternalName, isExternalName, + isTyVarName, isWiredInName, isBuiltInSyntax, + wiredInNameTyThing_maybe, + nameIsLocalOrFrom, + -- Class NamedThing and overloaded friends NamedThing(..), - isExported, - getSrcLoc, isLocallyDefined, getOccString + getSrcLoc, getOccString ) where #include "HsVersions.h" -import {-# SOURCE #-} Var ( Id, setIdName ) -import {-# SOURCE #-} TyCon ( TyCon, setTyConName ) +import {-# SOURCE #-} TypeRep( TyThing ) import OccName -- All of it -import RdrName ( RdrName, mkRdrQual, mkRdrUnqual ) -import CmdLineOpts ( opt_PprStyle_NoPrags, opt_OmitInterfacePragmas, opt_EnsureSplittableC ) - -import SrcLoc ( noSrcLoc, mkBuiltinSrcLoc, SrcLoc ) -import Unique ( pprUnique, Unique, Uniquable(..) ) +import Module ( Module, moduleFS ) +import SrcLoc ( noSrcLoc, wiredInSrcLoc, SrcLoc ) +import Unique ( Unique, Uniquable(..), getKey, pprUnique ) +import Maybes ( orElse, isJust ) +import FastString ( FastString, zEncodeFS ) import Outputable -import GlaExts \end{code} - %************************************************************************ %* * \subsection[Name-datatype]{The @Name@ datatype, and name construction} @@ -62,381 +55,213 @@ import GlaExts \begin{code} data Name = Name { n_sort :: NameSort, -- What sort of name it is + n_occ :: !OccName, -- Its occurrence name n_uniq :: Unique, - n_occ :: OccName, -- Its occurrence name - n_prov :: Provenance -- How it was made + n_loc :: !SrcLoc -- Definition site } -data NameSort - = Local - | Global Module - | WiredInId Module Id - | WiredInTyCon Module TyCon -\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. +-- 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. -\begin{code} -mkLocalName :: Unique -> OccName -> SrcLoc -> Name -mkLocalName uniq occ loc = Name { n_uniq = uniq, n_sort = Local, n_occ = occ, - n_prov = LocalDef loc NotExported } - -- 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) +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 -mkGlobalName :: Unique -> Module -> OccName -> Provenance -> Name -mkGlobalName uniq mod occ prov = Name { n_uniq = uniq, n_sort = Global mod, - n_occ = occ, n_prov = prov } - - -mkSysLocalName :: Unique -> FAST_STRING -> Name -mkSysLocalName uniq fs = Name { n_uniq = uniq, n_sort = Local, - n_occ = mkSrcVarOcc fs, n_prov = SystemProv } - -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 - = Name { n_uniq = uniq, - n_sort = mk_top_sort mod, - n_occ = mkSrcVarOcc (_PK_ ((_UNPK_ fs) ++ show uniq)), - n_prov = LocalDef noSrcLoc NotExported } - -------------------------- Wired in names ------------------------- - -mkWiredInIdName :: Unique -> Module -> OccName -> Id -> Name -mkWiredInIdName uniq mod occ id = Name { n_uniq = uniq, n_sort = WiredInId mod id, - n_occ = occ, n_prov = SystemProv } - --- 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 fs tycon - = Name { n_uniq = uniq, n_sort = WiredInTyCon mod tycon, - n_occ = mkSrcOccFS tcName fs, n_prov = SystemProv } - -fixupSystemName :: Name -> Module -> Provenance -> Name - -- Give the SystemProv name an appropriate provenance, and - -- perhaps change the Moulde too (so that its HiFlag is right) - -- There is a painful hack in that we want to push this - -- better name into an WiredInId/TyCon so that it prints - -- nicely in error messages -fixupSystemName name@(Name {n_sort = Global _}) mod' prov' - = name {n_sort = Global mod', n_prov = prov'} - -fixupSystemName name@(Name {n_sort = WiredInId _ id}) mod' prov' - = name' - where - name' = name {n_sort = WiredInId mod' id', n_prov = prov'} - id' = setIdName id name' - -fixupSystemName name@(Name {n_sort = WiredInTyCon _ tc}) mod' prov' - = name' - where - name' = name {n_sort = WiredInTyCon mod' tc', n_prov = prov'} - tc' = setTyConName tc name' - ---------------------------------------------------------------------- -mkDerivedName :: (OccName -> OccName) - -> Name -- Base name - -> Unique -- New unique - -> Name -- Result is always a value name - -mkDerivedName f name uniq = name {n_uniq = uniq, n_occ = f (n_occ name)} + | Internal -- A user-defined Id or TyVar + -- defined in the module being compiled --- 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} + | System -- A system-defined Id or TyVar. Typically the + -- OccName is very uninformative (like 's') -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 name occ = name {n_occ = occ} - -setNameModule :: Name -> Module -> Name -setNameModule name mod = name {n_sort = set (n_sort name)} - where - set (Global _) = Global mod - set (WiredInId _ id) = WiredInId mod id - set (WiredInTyCon _ tycon) = WiredInTyCon mod tycon +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{Setting provenance and visibility -%* * -%************************************************************************ +1. Initially, top-level Ids (including locally-defined ones) get External names, + and all other local Ids get Internal names -tidyTopName is applied to top-level names in the final program +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. -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) +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 -In all cases except an exported global, it gives it a new occurrence name. +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 -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 + 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. -Why should things be "visible"? Certainly they must be if they -are exported. But also: +Built-in syntax => It's a syntactic form, not "in scope" (e.g. []) -(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. +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 -(b) When optimisation is on we want to make all the internal - top-level defns externally visible +All built-in syntax is for wired-in things. \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 - (env', occ') = tidyOccName env (n_occ name) - - name' = Name { n_uniq = n_uniq name, n_sort = mk_top_sort mod, - n_occ = occ', n_prov = LocalDef noSrcLoc NotExported } - -mk_top_sort mod | all_toplev_ids_visible = Global mod - | otherwise = Local - -all_toplev_ids_visible = - not opt_OmitInterfacePragmas || -- Pragmas can make them visible - opt_EnsureSplittableC -- Splitting requires visiblilty -\end{code} +nameUnique :: Name -> Unique +nameOccName :: Name -> OccName +nameModule :: Name -> Module +nameSrcLoc :: Name -> SrcLoc -\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 name prov = name {n_prov = prov} - -getNameProvenance :: Name -> Provenance -getNameProvenance name = n_prov name - -setNameImportReason :: Name -> ImportReason -> Name -setNameImportReason name reason - = name { n_prov = new_prov } - where - -- It's important that we don't do the pattern matching - -- in the top-level clause, else we get a black hole in - -- the renamer. Rather a yukky constraint. There's only - -- one call, in RnNames - old_prov = n_prov name - new_prov = case old_prov of - NonLocalDef _ omit -> NonLocalDef reason omit - other -> old_prov +nameUnique name = n_uniq name +nameOccName name = n_occ name +nameSrcLoc name = n_loc name \end{code} - -%************************************************************************ -%* * -\subsection{Provenance and export info} -%* * -%************************************************************************ - \begin{code} -data Provenance - = LocalDef -- Defined locally - SrcLoc -- Defn site - ExportFlag -- Whether it's exported - - | NonLocalDef -- Defined non-locally - ImportReason - PrintUnqualified - - | SystemProv -- Either (a) a system-generated local with - -- a v short name OccName - -- or (b) a known-key global which should have a proper - -- provenance attached by the renamer -\end{code} +nameIsLocalOrFrom :: Module -> Name -> Bool +isInternalName :: Name -> Bool +isExternalName :: Name -> Bool +isSystemName :: Name -> Bool +isWiredInName :: Name -> Bool -Sys-provs 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. +isWiredInName (Name {n_sort = WiredIn _ _ _ _}) = True +isWiredInName other = False -Names with SystemProv differ in the following ways: - a) locals have unique attached when printing dumps - b) unifier eliminates sys tyvars in favour of user provs where possible - c) renamer replaces SystemProv with a better one +wiredInNameTyThing_maybe :: Name -> Maybe TyThing +wiredInNameTyThing_maybe (Name {n_sort = WiredIn _ _ thing _}) = Just thing +wiredInNameTyThing_maybe other = Nothing -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. +isBuiltInSyntax (Name {n_sort = WiredIn _ _ _ BuiltInSyntax}) = True +isBuiltInSyntax other = False -\begin{code} -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} +isExternalName (Name {n_sort = External _ _}) = True +isExternalName (Name {n_sort = WiredIn _ _ _ _}) = True +isExternalName other = False -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. +isInternalName name = not (isExternalName name) -Exported things include: +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 - - explicitly exported Ids, including data constructors, - class method selectors +nameParent :: Name -> Name +nameParent name = case nameParent_maybe name of + Just parent -> parent + Nothing -> name - - dfuns from instance decls +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) -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. +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 +nameIsLocalOrFrom from name + | isExternalName name = from == nameModule name + | otherwise = True -\begin{code} -systemProvenance :: Provenance -systemProvenance = SystemProv - --- 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 SystemProv = ptext SLIT("System") -pprProvenance (LocalDef loc _) = ptext SLIT("defined at") <+> ppr loc -pprProvenance (NonLocalDef ImplicitImport _) - = ptext SLIT("implicitly imported") -pprProvenance (NonLocalDef (UserImport mod loc _) _) - = ptext SLIT("imported from") <+> ppr mod <+> ptext SLIT("at") <+> ppr loc +isTyVarName :: Name -> Bool +isTyVarName name = isTvOcc (nameOccName name) + +isSystemName (Name {n_sort = System}) = True +isSystemName other = False \end{code} %************************************************************************ %* * -\subsection{Predicates and selectors} +\subsection{Making names} %* * %************************************************************************ \begin{code} -nameUnique :: Name -> Unique -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 name = n_uniq name -nameOccName name = n_occ name - -nameModule name = nameSortModule (n_sort name) - -nameSortModule (Global mod) = mod -nameSortModule (WiredInId mod _) = mod -nameSortModule (WiredInTyCon mod _) = mod - -nameRdrName :: Name -> RdrName -nameRdrName (Name { n_sort = Local, n_occ = occ }) = mkRdrUnqual occ -nameRdrName (Name { n_sort = sort, n_occ = occ }) = mkRdrQual (nameSortModule sort) occ - -isExportedName (Name { n_prov = LocalDef _ Exported }) = True -isExportedName other = False - -nameSrcLoc name = provSrcLoc (n_prov name) - -provSrcLoc (LocalDef loc _) = loc -provSrcLoc (NonLocalDef (UserImport _ loc _) _) = loc -provSrcLoc SystemProv = noSrcLoc - -isLocallyDefinedName (Name {n_sort = Local}) = True -- Local (might have SystemProv) -isLocallyDefinedName (Name {n_prov = LocalDef _ _}) = True -- Global, but defined here -isLocallyDefinedName other = False -- Other - --- 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 (Name {n_sort = WiredInTyCon _ _}) = True -isWiredInName (Name {n_sort = WiredInId _ _}) = True -isWiredInName _ = False +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) -maybeWiredInIdName :: Name -> Maybe Id -maybeWiredInIdName (Name {n_sort = WiredInId _ id}) = Just id -maybeWiredInIdName other = Nothing +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 -> FastString -> Name +mkSystemVarName uniq fs = mkSystemName uniq (mkVarOccFS fs) + +mkSysTvName :: Unique -> FastString -> Name +mkSysTvName uniq fs = mkSystemName uniq (mkOccNameFS tvName fs) + +mkFCallName :: Unique -> String -> Name + -- The encoded string completely describes the ccall +mkFCallName uniq str = Name { n_uniq = uniq, n_sort = Internal, + n_occ = mkVarOcc 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} -maybeWiredInTyConName :: Name -> Maybe TyCon -maybeWiredInTyConName (Name {n_sort = WiredInTyCon _ tc}) = Just tc -maybeWiredInTyConName other = Nothing +\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} +tidyNameOcc :: Name -> OccName -> Name +-- We set the OccName of a Name when tidying +-- In doing so, we change System --> Internal, so that when we print +-- it we don't get the unique by default. It's tidy now! +tidyNameOcc name@(Name { n_sort = System }) occ = name { n_occ = occ, n_sort = Internal} +tidyNameOcc name occ = name { n_occ = occ } -isLocalName (Name {n_sort = Local}) = True -isLocalName _ = False +localiseName :: Name -> Name +localiseName n = n { n_sort = Internal } +\end{code} -isGlobalName (Name {n_sort = Local}) = False -isGlobalName other = True --- 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 +%************************************************************************ +%* * +\subsection{Predicates and selectors} +%* * +%************************************************************************ -isSystemName (Name {n_prov = SystemProv}) = True -isSystemName other = False +\begin{code} +hashName :: Name -> Int +hashName name = getKey (nameUnique name) \end{code} @@ -456,8 +281,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 @@ -478,81 +303,62 @@ instance NamedThing Name where \begin{code} instance Outputable Name where - -- When printing interfaces, all Locals have been given nice print-names ppr name = pprName name -pprName (Name {n_sort = Local, n_uniq = uniq, n_occ = occ, n_prov = prov}) - -- Locals - = 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 - sys_local = case prov of - SystemProv -> True - other -> False - - 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 (Name {n_sort = sort, n_uniq = uniq, n_occ = occ, n_prov = prov}) - -- Globals, and wired in things +instance OutputableBndr Name where + pprBndr _ name = pprName name + +pprName (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 - mod = nameSortModule sort - - pp_mod_dot sty - = case prov of - SystemProv -> pp_qual mod dot user_sty - -- Hack alert! Omit the qualifier on SystemProv things, which I claim - -- will also be WiredIn things. We can't get the omit flag right - -- on wired in tycons etc (sigh) so we just leave it out in user style, - -- and hope that leaving it out isn't too consfusing. - -- (e.g. if the programmer hides Bool and redefines it. If so, use -dppr-debug.) - - LocalDef _ _ -> pp_qual mod dot (user_sty || iface_sty) - - NonLocalDef (UserImport imp_mod _ _) omit - | user_sty -> pp_qual imp_mod pp_sep omit - | otherwise -> pp_qual mod pp_sep False - NonLocalDef ImplicitImport omit -> pp_qual mod pp_sep (user_sty && omit) - where - user_sty = userStyle sty - iface_sty = ifaceStyle sty - - pp_qual mod sep omit_qual - | omit_qual = empty - | otherwise = pprModule mod <> sep - - pp_sep | bootFlavour (moduleIfaceFlavour mod) = text "!" -- M!t indicates a name imported - -- from a .hi-boot interface - | otherwise = dot -- Vanilla case - - 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 'j' -pp_prov (NonLocalDef (UserImport _ _ True ) _) = char 'I' -- Imported by name -pp_prov (NonLocalDef (UserImport _ _ False) _) = char 'i' -- Imported by .. -pp_prov SystemProv = char 's' -\end{code} + 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_z_module mod <> char '_' <> ppr_z_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, + pprNameSpaceBrief (occNameSpace 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 [pprNameSpaceBrief (occNameSpace 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 (pprNameSpaceBrief (occNameSpace 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 = ftext (occNameFS occ) + -- Don't use pprOccName; instead, just print the string of the OccName; + -- we print the namespace in the debug stuff above + +-- In code style, we Z-encode the strings. The results of Z-encoding each FastString are +-- cached behind the scenes in the FastString implementation. +ppr_z_occ_name occ = ftext (zEncodeFS (occNameFS occ)) +ppr_z_module mod = ftext (zEncodeFS (moduleFS mod)) +\end{code} %************************************************************************ %* * @@ -570,16 +376,9 @@ class NamedThing a where \begin{code} getSrcLoc :: NamedThing a => a -> SrcLoc -isLocallyDefined :: NamedThing a => a -> Bool -isExported :: NamedThing a => a -> Bool getOccString :: NamedThing a => a -> String -isExported = isExportedName . getName getSrcLoc = nameSrcLoc . getName -isLocallyDefined = isLocallyDefinedName . getName -getOccString x = occNameString (getOccName x) +getOccString = occNameString . getOccName \end{code} -\begin{code} -{-# SPECIALIZE isLocallyDefined :: Name -> Bool #-} -\end{code}