X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FName.lhs;h=dcf672e5d4445383e06556a25d5523b53ea8d96c;hb=f23ba2b294429ccbdeb80f0344ec08f6abf61bb7;hp=593d61bb53060691ef680834838951ba8797e8bd;hpb=f6c3618186068097765dca11414e3383f2b71ba5;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Name.lhs b/ghc/compiler/basicTypes/Name.lhs index 593d61b..dcf672e 100644 --- a/ghc/compiler/basicTypes/Name.lhs +++ b/ghc/compiler/basicTypes/Name.lhs @@ -1,356 +1,372 @@ % -% (c) The GRASP/AQUA Project, Glasgow University, 1992-1996 +% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % \section[Name]{@Name@: to transmit name info from renamer to typechecker} \begin{code} -#include "HsVersions.h" - module Name ( - -- The Module type - SYN_IE(Module), - pprModule, moduleString, - - -- The OccName type - OccName(..), - pprOccName, pprSymOcc, pprNonSymOcc, occNameString, occNameFlavour, isTvOcc, - quoteInText, parenInCode, + -- Re-export the OccName stuff + module OccName, -- The Name type Name, -- Abstract - mkLocalName, mkSysLocalName, - - mkCompoundName, mkGlobalName, mkInstDeclName, - - mkWiredInIdName, mkWiredInTyConName, - maybeWiredInIdName, maybeWiredInTyConName, - isWiredInName, + mkLocalName, mkImportedLocalName, mkSysLocalName, mkCCallName, + mkTopName, mkIPName, + mkDerivedName, mkGlobalName, mkKnownKeyGlobal, mkWiredInName, + + nameUnique, setNameUnique, setLocalNameSort, + tidyTopName, + nameOccName, nameModule, nameModule_maybe, + setNameOcc, nameRdrName, setNameModuleAndLoc, + toRdrName, hashName, + + isUserExportedName, + nameSrcLoc, nameIsLocallyDefined, isDllName, nameIsFrom, nameIsLocalOrFrom, + + isSystemName, isLocalName, isGlobalName, isExternallyVisibleName, + isTyVarName, + + -- Environment + NameEnv, mkNameEnv, + emptyNameEnv, unitNameEnv, nameEnvElts, + extendNameEnv_C, extendNameEnv, foldNameEnv, + plusNameEnv, plusNameEnv_C, extendNameEnv, extendNameEnvList, + lookupNameEnv, lookupNameEnv_NF, delFromNameEnv, elemNameEnv, - nameUnique, changeUnique, setNameProvenance, setNameVisibility, - nameOccName, nameString, - isExportedName, nameSrcLoc, - isLocallyDefinedName, - - isLocalName, - - pprNameProvenance, - - -- Sets of Names - NameSet(..), - emptyNameSet, unitNameSet, mkNameSet, unionNameSets, unionManyNameSets, - minusNameSet, elemNameSet, nameSetToList, addListToNameSet, - - -- Misc - DefnInfo(..), - Provenance(..), pprProvenance, - ExportFlag(..), -- Class NamedThing and overloaded friends NamedThing(..), - modAndOcc, isExported, - getSrcLoc, isLocallyDefined, getOccString, - - pprSym, pprNonSym + getSrcLoc, isLocallyDefined, getOccString, toRdrName, + isFrom, isLocalOrFrom ) where -IMP_Ubiq() -import TyLoop ( GenId, Id(..), TyCon ) -- Used inside Names -import CStrings ( identToC, modnameToC, cSEP ) -import CmdLineOpts ( opt_OmitInterfacePragmas, opt_EnsureSplittableC ) - -import Outputable ( Outputable(..) ) -import PprStyle ( PprStyle(..), codeStyle, ifaceStyle ) -import PrelMods ( gHC__ ) -import Pretty -import Lex ( isLexSym, isLexConId ) -import SrcLoc ( noSrcLoc, SrcLoc ) -import Unique ( pprUnique, showUnique, Unique ) -import UniqSet ( UniqSet(..), emptyUniqSet, unitUniqSet, unionUniqSets, uniqSetToList, - unionManyUniqSets, minusUniqSet, mkUniqSet, elementOfUniqSet, addListToUniqSet ) -import UniqFM ( UniqFM ) -import Util ( cmpPString, panic, assertPanic {-, pprTrace ToDo:rm-} ) -\end{code} +#include "HsVersions.h" +import OccName -- All of it +import Module ( Module, moduleName, mkVanillaModule, isModuleInThisPackage ) +import RdrName ( RdrName, mkRdrOrig, mkRdrUnqual, rdrNameOcc, rdrNameModule ) +import CmdLineOpts ( opt_Static, opt_OmitInterfacePragmas, opt_EnsureSplittableC ) +import SrcLoc ( builtinSrcLoc, noSrcLoc, SrcLoc ) +import Unique ( Unique, Uniquable(..), u2i, pprUnique, pprUnique10 ) +import FastTypes +import Maybes ( expectJust ) +import UniqFM +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 -> Pretty -pprModule sty m = ppPStr m - -pprOccName :: PprStyle -> OccName -> Pretty -pprOccName PprDebug n = ppCat [ppPStr (occNameString n), ppBracket (ppStr (occNameFlavour n))] -pprOccName sty n = if codeStyle sty - then identToC (occNameString n) - else ppPStr (occNameString n) - -occNameString :: OccName -> FAST_STRING -occNameString (VarOcc s) = s -occNameString (TvOcc s) = s -occNameString (TCOcc s) = 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" - -isTvOcc :: OccName -> Bool -isTvOcc (TvOcc s) = True -isTvOcc other = False - -instance Eq OccName where - a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False } - a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True } - -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 } - -instance Ord3 OccName where - cmp = cmpOcc - -(VarOcc s1) `cmpOcc` (VarOcc s2) = s1 `_CMP_STRING_` s2 -(VarOcc s1) `cmpOcc` other2 = LT_ - -(TvOcc s1) `cmpOcc` (VarOcc s2) = GT_ -(TvOcc s1) `cmpOcc` (TvOcc s2) = s1 `_CMP_STRING_` s2 -(TvOcc s1) `cmpOcc` other = LT_ - -(TCOcc s1) `cmpOcc` (TCOcc s2) = s1 `_CMP_STRING_` s2 -(TCOcc s1) `cmpOcc` other = GT_ - -instance Outputable OccName where - ppr = pprOccName -\end{code} +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 + } +data NameSort + = Global Module -- (a) TyCon, Class, their derived Ids, dfun Id + -- (b) imported Id -\begin{code} -parenInCode, quoteInText :: OccName -> Bool -parenInCode occ = isLexSym (occNameString occ) + | Exported -- An exported Ids defined in the module being compiled -quoteInText occ = not (isLexSym (occNameString occ)) + | Local -- A user-defined, but non-exported Id or TyVar, + -- defined in the module being compiled --- print `vars`, (op) correctly -pprSymOcc, pprNonSymOcc :: PprStyle -> OccName -> Pretty + | System -- A system-defined Id or TyVar. Typically the + -- OccName is very uninformative (like 's') +\end{code} -pprSymOcc sty var - = if quoteInText var - then ppQuote (pprOccName sty var) - else pprOccName sty var +Notes about the NameSorts: -pprNonSymOcc sty var - = if parenInCode var - then ppParens (pprOccName sty var) - else pprOccName sty var -\end{code} +1. An Exported Id is changed to Global right at the + end in the tidyCore pass, so that an importer sees a Global + Similarly, Local Ids that are visible to an importer (e.g. when + optimisation is on) are changed to Globals. -%************************************************************************ -%* * -\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 -\end{code} +2. 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. -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. +3. 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 -\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} + 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. -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. +\begin{code} +nameUnique :: Name -> Unique +nameOccName :: Name -> OccName +nameModule :: Name -> Module +nameSrcLoc :: Name -> SrcLoc -Exported things include: - - explicitly exported Ids, including data constructors, class method selectors - - dfuns from instance decls +nameUnique name = n_uniq name +nameOccName name = n_occ name +nameSrcLoc name = n_loc 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 { n_sort = Global mod }) = mod +nameModule name = pprPanic "nameModule" (ppr name) -\begin{code} -data ExportFlag = Exported | NotExported +nameModule_maybe (Name { n_sort = Global mod }) = Just mod +nameModule_maybe name = Nothing \end{code} \begin{code} -mkLocalName :: Unique -> OccName -> SrcLoc -> Name -mkLocalName = Local +nameIsLocallyDefined :: Name -> Bool +nameIsFrom :: Module -> Name -> Bool +nameIsLocalOrFrom :: Module -> Name -> Bool +isUserExportedName :: Name -> Bool +isLocalName :: Name -> Bool -- Not globals +isGlobalName :: Name -> Bool +isSystemName :: Name -> Bool +isExternallyVisibleName :: Name -> Bool -mkGlobalName :: Unique -> Module -> OccName -> DefnInfo -> Provenance -> Name -mkGlobalName = Global +isGlobalName (Name {n_sort = Global _}) = True +isGlobalName other = False -mkSysLocalName :: Unique -> FAST_STRING -> SrcLoc -> Name -mkSysLocalName uniq str loc = Local uniq (VarOcc str) loc +isLocalName name = not (isGlobalName name) -mkWiredInIdName :: Unique -> Module -> FAST_STRING -> Id -> Name -mkWiredInIdName uniq mod occ id - = Global uniq mod (VarOcc occ) (WiredInId id) Implicit +nameIsLocallyDefined name = isLocalName name -mkWiredInTyConName :: Unique -> Module -> FAST_STRING -> TyCon -> Name -mkWiredInTyConName uniq mod occ tycon - = Global uniq mod (TCOcc occ) (WiredInTyCon tycon) Implicit +nameIsLocalOrFrom from (Name {n_sort = Global mod}) = mod == from +nameIsLocalOrFrom from other = True +nameIsFrom from (Name {n_sort = Global mod}) = mod == from +nameIsFrom from other = pprPanic "nameIsFrom" (ppr other) -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 +-- 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 isUserExported). +isExternallyVisibleName name = isGlobalName name -mkCompoundName str_fn uniq (Global _ mod occ defn prov) - = Global uniq mod new_occ defn prov - where - new_occ = VarOcc (str_fn (occNameString occ)) -- Always a VarOcc +-- Constructors, selectors and suchlike Globals, and are all exported +-- Other Local things may or may not be exported +isUserExportedName (Name { n_sort = Exported }) = True +isUserExportedName (Name { n_sort = Global _ }) = True +isUserExportedName other = False -mkCompoundName str_fn uniq (Local _ occ loc) - = Local uniq (VarOcc (str_fn (occNameString occ))) loc +isSystemName (Name {n_sort = System}) = True +isSystemName other = False +\end{code} - -- 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 +%************************************************************************ +%* * +\subsection{Making names} +%* * +%************************************************************************ -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 +\begin{code} +mkLocalName :: Unique -> OccName -> SrcLoc -> Name +mkLocalName uniq occ loc = Name { n_uniq = uniq, n_sort = Local, 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) + +mkImportedLocalName :: Unique -> OccName -> SrcLoc -> Name + -- Just the same as mkLocalName, except the provenance is different + -- Reason: this flags the name as one that came in from an interface + -- file. This is useful when trying to decide which of two type + -- variables should 'win' when unifying them. + -- NB: this is only for non-top-level names, so we use ImplicitImport + -- + -- Oct 00: now that Names lack Provenances, mkImportedLocalName doesn't make + -- sense any more, so it's just the same as mkLocalName +mkImportedLocalName uniq occ loc = mkLocalName uniq occ loc + + +mkGlobalName :: Unique -> Module -> OccName -> SrcLoc -> Name +mkGlobalName uniq mod occ loc = Name { n_uniq = uniq, n_sort = Global mod, + n_occ = occ, n_loc = loc } + + +mkKnownKeyGlobal :: RdrName -> Unique -> Name +mkKnownKeyGlobal rdr_name uniq + = mkGlobalName uniq (mkVanillaModule (rdrNameModule rdr_name)) + (rdrNameOcc rdr_name) + builtinSrcLoc + +mkWiredInName :: Module -> OccName -> Unique -> Name +mkWiredInName mod occ uniq = mkGlobalName uniq mod occ builtinSrcLoc + +mkSysLocalName :: Unique -> UserFS -> Name +mkSysLocalName uniq fs = Name { n_uniq = uniq, n_sort = System, + n_occ = mkVarOcc fs, n_loc = noSrcLoc } + +mkCCallName :: Unique -> EncodedString -> Name + -- The encoded string completely describes the ccall +mkCCallName uniq str = Name { n_uniq = uniq, n_sort = Local, + n_occ = mkCCallOcc str, n_loc = noSrcLoc } + +mkIPName :: Unique -> OccName -> Name +mkIPName uniq occ + = Name { n_uniq = uniq, + n_sort = Local, + n_occ = occ, + n_loc = noSrcLoc } + +--------------------------------------------------------------------- +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)} +\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) - -setNameVisibility mod name = name - -all_toplev_ids_visible = not opt_OmitInterfacePragmas || -- Pragmas can make them visible - opt_EnsureSplittableC -- Splitting requires visiblilty +setNameUnique name uniq = name {n_uniq = uniq} + +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} + +setNameModuleAndLoc :: Name -> Module -> SrcLoc -> Name +setNameModuleAndLoc name mod loc = name {n_sort = set (n_sort name), n_loc = loc} + where + set (Global _) = Global mod + +setLocalNameSort :: Name -> Bool -> Name + -- Set the name's sort to Local or Exported, depending on the boolean +setLocalNameSort name is_exported = name { n_sort = if is_exported then Exported + else Local } \end{code} + %************************************************************************ %* * -\subsection{Predicates and selectors} +\subsection{Tidying a name} %* * %************************************************************************ -\begin{code} -nameUnique :: Name -> Unique -nameModAndOcc :: Name -> (Module, OccName) -- Globals only -nameOccName :: Name -> OccName -nameString :: Name -> FAST_STRING -- A.b form -nameSrcLoc :: Name -> SrcLoc -isLocallyDefinedName :: Name -> Bool -isExportedName :: Name -> Bool -isWiredInName :: Name -> Bool -isLocalName :: Name -> Bool +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. + +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 + +Why should things be "visible"? Certainly they must be if they +are exported. But also: + +(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 +\begin{code} +tidyTopName :: Module -> TidyOccEnv -> Name -> (TidyOccEnv, Name) +tidyTopName mod env + name@(Name { n_occ = occ, n_sort = sort, n_uniq = uniq, n_loc = loc }) + = case sort of + System -> localise -- System local Ids + Local -> localise -- User non-exported Ids + Exported -> globalise -- User-exported things + Global _ -> no_op -- Constructors, class selectors, default methods -nameUnique (Local u _ _) = u -nameUnique (Global u _ _ _ _) = u + where + no_op = (env, name) + + globalise = (env, name { n_sort = Global mod }) -- Don't change occurrence name + + localise = (env', name') + (env', occ') = tidyOccName env occ + name' = name { n_occ = occ', n_sort = mkLocalTopSort mod } + +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! + -- (Used only by the STG lambda lifter.) +mkTopName uniq mod fs + = Name { n_uniq = uniq, + n_sort = mkLocalTopSort mod, + n_occ = mkVarOcc (_PK_ ((_UNPK_ fs) ++ show uniq)), + n_loc = noSrcLoc } + +mkLocalTopSort :: Module -> NameSort +mkLocalTopSort 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} -nameOccName (Local _ occ _) = occ -nameOccName (Global _ _ occ _ _) = occ -nameModAndOcc (Global _ mod occ _ _) = (mod,occ) -nameString (Local _ occ _) = occNameString occ -nameString (Global _ mod occ _ _) = mod _APPEND_ SLIT(".") _APPEND_ occNameString occ +%************************************************************************ +%* * +\subsection{Predicates and selectors} +%* * +%************************************************************************ + +\begin{code} +hashName :: Name -> Int +hashName name = iBox (u2i (nameUnique name)) -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 +nameRdrName :: Name -> RdrName +-- Makes a qualified name for top-level (Global) names, whether locally defined or not +-- and an unqualified name just for Locals +nameRdrName (Name { n_occ = occ, n_sort = Global mod }) = mkRdrOrig (moduleName mod) occ +nameRdrName (Name { n_occ = occ }) = mkRdrUnqual occ --- 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 +isDllName :: Name -> Bool + -- Does this name refer to something in a different DLL? +isDllName nm = not opt_Static && + not (nameIsLocallyDefined nm) && -- isLocallyDefinedName test needed 'cos + not (isModuleInThisPackage (nameModule nm)) -- nameModule won't work on local names -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 +isTyVarName :: Name -> Bool +isTyVarName name = isTvOcc (nameOccName name) -isLocalName (Local _ _ _) = True -isLocalName _ = False \end{code} @@ -361,110 +377,113 @@ 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} +\subsection{Name environment} %* * %************************************************************************ \begin{code} -instance Outputable Name where - ppr sty (Local u n _) | codeStyle sty || - ifaceStyle sty = pprUnique u - ppr PprForUser (Local _ n _) = ppPStr (occNameString n) - ppr other_sty (Local u n _) = ppBesides [ppPStr (occNameString n), ppPStr SLIT("_"), pprUnique u] - - ppr sty name@(Global u m n _ _) = ppBesides [pp_name, pp_debug sty name] - where - pp_name | codeStyle sty = identToC qual_name - | otherwise = ppPStr qual_name - qual_name = m _APPEND_ SLIT(".") _APPEND_ occNameString n - -pp_debug PprDebug (Global uniq m n _ prov) = ppBesides [ppStr "{-", pprUnique uniq, ppStr ",", - pp_prov prov, ppStr "-}"] - where - pp_prov (LocalDef _ _) = ppChar 'l' - pp_prov (Imported _ _) = ppChar 'i' - pp_prov Implicit = ppChar 'p' -pp_debug other name = ppNil - --- pprNameProvenance is used in error messages to say where a name came from -pprNameProvenance :: PprStyle -> Name -> Pretty -pprNameProvenance sty (Local _ _ loc) = pprProvenance sty (LocalDef NotExported loc) -pprNameProvenance sty (Global _ _ _ _ prov) = pprProvenance sty prov - -pprProvenance :: PprStyle -> Provenance -> Pretty -pprProvenance sty (Imported mod loc) - = ppSep [ppStr "Imported from", pprModule sty mod, ppStr "at", ppr sty loc] -pprProvenance sty (LocalDef _ loc) - = ppSep [ppStr "Defined at", ppr sty loc] -pprProvenance sty Implicit - = panic "pprNameProvenance: Implicit" +type NameEnv a = UniqFM a -- Domain is Name + +emptyNameEnv :: NameEnv a +mkNameEnv :: [(Name,a)] -> NameEnv a +nameEnvElts :: NameEnv a -> [a] +extendNameEnv_C :: (a->a->a) -> NameEnv a -> Name -> a -> NameEnv a +extendNameEnv :: NameEnv a -> Name -> a -> NameEnv a +plusNameEnv :: NameEnv a -> NameEnv a -> NameEnv a +plusNameEnv_C :: (a->a->a) -> NameEnv a -> NameEnv a -> NameEnv a +extendNameEnvList:: NameEnv a -> [(Name,a)] -> NameEnv a +delFromNameEnv :: NameEnv a -> Name -> NameEnv a +elemNameEnv :: Name -> NameEnv a -> Bool +unitNameEnv :: Name -> a -> NameEnv a +lookupNameEnv :: NameEnv a -> Name -> Maybe a +lookupNameEnv_NF :: NameEnv a -> Name -> a +mapNameEnv :: (a->b) -> NameEnv a -> NameEnv b +foldNameEnv :: (a -> b -> b) -> b -> NameEnv a -> b + +emptyNameEnv = emptyUFM +foldNameEnv = foldUFM +mkNameEnv = listToUFM +nameEnvElts = eltsUFM +extendNameEnv_C = addToUFM_C +extendNameEnv = addToUFM +plusNameEnv = plusUFM +plusNameEnv_C = plusUFM_C +extendNameEnvList= addListToUFM +delFromNameEnv = delFromUFM +elemNameEnv = elemUFM +mapNameEnv = mapUFM +unitNameEnv = unitUFM + +lookupNameEnv = lookupUFM +lookupNameEnv_NF env n = expectJust "lookupNameEnv_NF" (lookupUFM env n) \end{code} %************************************************************************ %* * -\subsection[Sets of names} +\subsection{Pretty printing} %* * %************************************************************************ \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] - -emptyNameSet = emptyUniqSet -unitNameSet = unitUniqSet -mkNameSet = mkUniqSet -addListToNameSet = addListToUniqSet -unionNameSets = unionUniqSets -unionManyNameSets = unionManyUniqSets -minusNameSet = minusUniqSet -elemNameSet = elementOfUniqSet -nameSetToList = uniqSetToList +instance Outputable Name where + -- When printing interfaces, all Locals have been given nice print-names + ppr name = pprName name + +pprName name@(Name {n_sort = sort, n_uniq = uniq, n_occ = occ}) + = getPprStyle $ \ sty -> + case sort of + Global mod -> pprGlobal sty name uniq mod occ + System -> pprSysLocal sty uniq occ + Local -> pprLocal sty uniq occ empty + Exported -> pprLocal sty uniq occ (char 'x') + +pprLocal sty uniq occ pp_export + | codeStyle sty = pprUnique uniq + | debugStyle sty = pprOccName occ <> + text "{-" <> pp_export <+> pprUnique10 uniq <> text "-}" + | otherwise = pprOccName occ + +pprGlobal sty name uniq mod occ + | codeStyle sty = ppr (moduleName mod) <> char '_' <> pprOccName occ + + | debugStyle sty = ppr (moduleName mod) <> dot <> pprOccName occ <> + text "{-" <> pprUnique10 uniq <> text "-}" + + | unqualStyle sty name = pprOccName occ + | otherwise = ppr (moduleName mod) <> dot <> pprOccName occ + +pprSysLocal sty uniq occ + | codeStyle sty = pprUnique uniq + | otherwise = pprOccName occ <> char '_' <> pprUnique uniq \end{code} - %************************************************************************ %* * \subsection{Overloaded functions related to Names} @@ -473,30 +492,28 @@ 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) 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 +isFrom :: NamedThing a => Module -> a -> Bool +isLocalOrFrom :: NamedThing a => Module -> a -> Bool -modAndOcc = nameModAndOcc . getName -isExported = isExportedName . getName getSrcLoc = nameSrcLoc . getName -isLocallyDefined = isLocallyDefinedName . getName -pprSym sty = pprSymOcc sty . getOccName -pprNonSym sty = pprNonSymOcc sty . getOccName -getOccString x = _UNPK_ (occNameString (getOccName x)) +isLocallyDefined = nameIsLocallyDefined . getName +getOccString = occNameString . getOccName +toRdrName = nameRdrName . getName +isFrom mod x = nameIsFrom mod (getName x) +isLocalOrFrom mod x = nameIsLocalOrFrom mod ( getName x) \end{code} \begin{code} -{-# SPECIALIZE isLocallyDefined - :: Name -> Bool - #-} +{-# SPECIALIZE isLocallyDefined :: Name -> Bool #-} \end{code}