X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FName.lhs;h=5888124fc32f12908052290a40c676d168581808;hb=2ffefc1bfca0c8924825cd15750e7ced457f3c81;hp=ff8096a9298862f0586d258cf02eeac320eee2bc;hpb=495ef8bd9ef30bffe50ea399b91e3ba09646b59a;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Name.lhs b/ghc/compiler/basicTypes/Name.lhs index ff8096a..5888124 100644 --- a/ghc/compiler/basicTypes/Name.lhs +++ b/ghc/compiler/basicTypes/Name.lhs @@ -12,59 +12,49 @@ module Name ( Name, -- Abstract mkLocalName, mkImportedLocalName, mkSysLocalName, mkCCallName, mkTopName, mkIPName, - mkDerivedName, mkGlobalName, mkKnownKeyGlobal, - mkWiredInIdName, mkWiredInTyConName, - mkUnboundName, isUnboundName, + mkDerivedName, mkGlobalName, mkKnownKeyGlobal, mkWiredInName, - maybeWiredInIdName, maybeWiredInTyConName, - isWiredInName, hashName, - - nameUnique, setNameUnique, setNameProvenance, getNameProvenance, setNameImportReason, + nameUnique, setNameUnique, setLocalNameSort, tidyTopName, - nameOccName, nameModule, setNameOcc, nameRdrName, setNameModule, toRdrName, + nameOccName, nameModule, nameModule_maybe, + setNameOcc, nameRdrName, setNameModuleAndLoc, + toRdrName, hashName, - isUserExportedName, isUserImportedName, isUserImportedExplicitlyName, - maybeUserImportedFrom, - nameSrcLoc, isLocallyDefinedName, isDllName, + isUserExportedName, + nameSrcLoc, nameIsLocallyDefined, isDllName, nameIsFrom, nameIsLocalOrFrom, isSystemName, isLocalName, isGlobalName, isExternallyVisibleName, + isTyVarName, -- Environment - NameEnv, + NameEnv, mkNameEnv, emptyNameEnv, unitNameEnv, nameEnvElts, - addToNameEnv_C, addToNameEnv, addListToNameEnv, - plusNameEnv, plusNameEnv_C, extendNameEnv, - lookupNameEnv, delFromNameEnv, elemNameEnv, - + extendNameEnv_C, extendNameEnv, foldNameEnv, + plusNameEnv, plusNameEnv_C, extendNameEnv, extendNameEnvList, + lookupNameEnv, lookupNameEnv_NF, delFromNameEnv, elemNameEnv, - -- Provenance - Provenance(..), ImportReason(..), pprProvenance, - ExportFlag(..), PrintUnqualified, - pprNameProvenance, hasBetterProv, -- Class NamedThing and overloaded friends NamedThing(..), - getSrcLoc, isLocallyDefined, getOccString, toRdrName + getSrcLoc, isLocallyDefined, getOccString, toRdrName, + isFrom, isLocalOrFrom ) where #include "HsVersions.h" -import {-# SOURCE #-} Var ( Id, setIdName ) -import {-# SOURCE #-} TyCon ( TyCon, setTyConName ) - import OccName -- All of it -import Module ( Module, moduleName, pprModule, mkVanillaModule, isLocalModule ) -import RdrName ( RdrName, mkRdrQual, mkRdrUnqual, rdrNameOcc, rdrNameModule ) -import CmdLineOpts ( opt_Static, opt_PprStyle_NoPrags, opt_OmitInterfacePragmas, opt_EnsureSplittableC ) - -import SrcLoc ( noSrcLoc, mkBuiltinSrcLoc, SrcLoc ) -import Unique ( pprUnique, Unique, Uniquable(..), hasKey, unboundKey, u2i ) +import Module ( Module, moduleName, mkVanillaModule, + printModulePrefix, 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 -import GlaExts \end{code} - %************************************************************************ %* * \subsection[Name-datatype]{The @Name@ datatype, and name construction} @@ -74,27 +64,111 @@ import GlaExts \begin{code} data Name = Name { n_sort :: NameSort, -- What sort of name it is - n_uniq :: Unique, n_occ :: OccName, -- Its occurrence name - n_prov :: Provenance -- How it was made + n_uniq :: Unique, + n_loc :: SrcLoc -- Definition site } data NameSort - = Local - | Global Module - | WiredInId Module Id - | WiredInTyCon Module TyCon + = Global Module -- (a) TyCon, Class, their derived Ids, dfun Id + -- (b) imported Id + + | Exported -- An exported Ids defined in the module being compiled + + | Local -- A user-defined, but non-exported 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} -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. +Notes about the NameSorts: + +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. + +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. + +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 + + 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} +nameUnique :: Name -> Unique +nameOccName :: Name -> OccName +nameModule :: Name -> Module +nameSrcLoc :: Name -> SrcLoc + +nameUnique name = n_uniq name +nameOccName name = n_occ name +nameSrcLoc name = n_loc name + +nameModule (Name { n_sort = Global mod }) = mod +nameModule name = pprPanic "nameModule" (ppr name) + +nameModule_maybe (Name { n_sort = Global mod }) = Just mod +nameModule_maybe name = Nothing +\end{code} + +\begin{code} +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 + +isGlobalName (Name {n_sort = Global _}) = True +isGlobalName other = False + +isLocalName name = not (isGlobalName name) + +nameIsLocallyDefined name = isLocalName name + +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) + +-- 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 + +-- 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 + +isSystemName (Name {n_sort = System}) = True +isSystemName other = False +\end{code} + + +%************************************************************************ +%* * +\subsection{Making names} +%* * +%************************************************************************ \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 } +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 @@ -106,72 +180,45 @@ mkLocalName uniq occ loc = Name { n_uniq = uniq, n_sort = Local, n_occ = occ, 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. + -- 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 -mkImportedLocalName uniq occ loc = Name { n_uniq = uniq, n_sort = Local, n_occ = occ, - n_prov = NonLocalDef ImplicitImport True } + -- + -- 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 -> Provenance -> Name -mkGlobalName uniq mod occ prov = Name { n_uniq = uniq, n_sort = Global mod, - n_occ = occ, n_prov = prov } +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) +mkKnownKeyGlobal :: RdrName -> Unique -> Name +mkKnownKeyGlobal rdr_name uniq = mkGlobalName uniq (mkVanillaModule (rdrNameModule rdr_name)) (rdrNameOcc rdr_name) - systemProvenance + 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 = Local, - n_occ = mkSrcVarOcc fs, n_prov = systemProvenance } +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_prov = NonLocalDef ImplicitImport 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 - = Name { n_uniq = uniq, - n_sort = mk_top_sort mod, - n_occ = mkSrcVarOcc (_PK_ ((_UNPK_ fs) ++ show uniq)), - n_prov = LocalDef noSrcLoc NotExported } + n_occ = mkCCallOcc str, n_loc = noSrcLoc } mkIPName :: Unique -> OccName -> Name mkIPName uniq occ = Name { n_uniq = uniq, n_sort = Local, n_occ = occ, - -- ZZ is this an appropriate provinence? - n_prov = SystemProv } - -------------------------- 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 } - + n_loc = noSrcLoc } --------------------------------------------------------------------- mkDerivedName :: (OccName -> OccName) @@ -180,14 +227,6 @@ mkDerivedName :: (OccName -> OccName) -> Name -- Result is always a value name mkDerivedName f name uniq = name {n_uniq = uniq, n_occ = f (n_occ name)} - --- mkUnboundName makes a place-holder Name; it shouldn't be looked at except possibly --- during compiler debugging. -mkUnboundName :: RdrName -> Name -mkUnboundName rdr_name = mkLocalName unboundKey (rdrNameOcc rdr_name) noSrcLoc - -isUnboundName :: Name -> Bool -isUnboundName name = name `hasKey` unboundKey \end{code} \begin{code} @@ -202,27 +241,31 @@ setNameOcc :: Name -> OccName -> Name -- 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)} +setNameModuleAndLoc :: Name -> Module -> SrcLoc -> Name +setNameModuleAndLoc name mod loc = name {n_sort = set (n_sort name), n_loc = loc} where - set (Global _) = Global mod - set (WiredInId _ id) = WiredInId mod id - set (WiredInTyCon _ tycon) = WiredInTyCon mod tycon + 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{Setting provenance and visibility +\subsection{Tidying a name} %* * %************************************************************************ 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) +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. @@ -252,144 +295,49 @@ are exported. But also: \begin{code} tidyTopName :: Module -> TidyOccEnv -> Name -> (TidyOccEnv, Name) -tidyTopName mod env name - = (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 } +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 -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} - - -\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 -\end{code} - - -%************************************************************************ -%* * -\subsection{Provenance and export info} -%* * -%************************************************************************ + no_op = (env, name) -\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} + globalise = (env, name { n_sort = Global mod }) -- Don't change occurrence name -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. - -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 + localise = (env', name') + (env', occ') = tidyOccName env occ + name' = name { n_occ = occ', n_sort = mkLocalTopSort mod } -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} -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 +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} -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. - - -\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 -\end{code} %************************************************************************ @@ -399,116 +347,27 @@ pprProvenance (NonLocalDef (UserImport mod loc _) _) %************************************************************************ \begin{code} -nameUnique :: Name -> Unique -nameOccName :: Name -> OccName -nameModule :: Name -> Module -nameSrcLoc :: Name -> SrcLoc -isLocallyDefinedName :: Name -> Bool -isUserExportedName :: Name -> Bool -isWiredInName :: Name -> Bool -isLocalName :: Name -> Bool -isGlobalName :: Name -> Bool -isExternallyVisibleName :: Name -> Bool - - - hashName :: Name -> Int -hashName name = IBOX( u2i (nameUnique name) ) +hashName name = iBox (u2i (nameUnique name)) -nameUnique name = n_uniq name -nameOccName name = n_occ name - -nameModule name = - case n_sort name of - Local -> pprPanic "nameModule" (ppr name) - x -> nameSortModule x - -nameSortModule (Global mod) = mod -nameSortModule (WiredInId mod _) = mod -nameSortModule (WiredInTyCon mod _) = mod 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_sort = Local, n_occ = occ }) = mkRdrUnqual occ -nameRdrName (Name { n_sort = sort, n_occ = occ }) = mkRdrQual (moduleName (nameSortModule sort)) occ - -ifaceNameRdrName :: Name -> RdrName --- Makes a qualified naem for imported things, --- and an unqualified one for local things -ifaceNameRdrName n | isLocallyDefined n = mkRdrUnqual (nameOccName n) - | otherwise = mkRdrQual (moduleName (nameModule n)) (nameOccName n) - -isUserExportedName (Name { n_prov = LocalDef _ Exported }) = True -isUserExportedName other = False - -isUserImportedExplicitlyName (Name { n_prov = NonLocalDef (UserImport _ _ explicit) _ }) = explicit -isUserImportedExplicitlyName other = False - -isUserImportedName (Name { n_prov = NonLocalDef (UserImport _ _ _) _ }) = True -isUserImportedName other = False - -maybeUserImportedFrom (Name { n_prov = NonLocalDef (UserImport m _ _) _ }) = Just m -maybeUserImportedFrom other = Nothing +nameRdrName (Name { n_occ = occ, n_sort = Global mod }) = mkRdrOrig (moduleName mod) occ +nameRdrName (Name { n_occ = occ }) = mkRdrUnqual occ isDllName :: Name -> Bool -- Does this name refer to something in a different DLL? isDllName nm = not opt_Static && - not (isLocallyDefinedName nm) && - not (isLocalModule (nameModule nm)) - -nameSrcLoc name = provSrcLoc (n_prov name) - -provSrcLoc (LocalDef loc _) = loc -provSrcLoc (NonLocalDef (UserImport _ loc _) _) = loc -provSrcLoc other = 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 + not (nameIsLocallyDefined nm) && -- isLocallyDefinedName test needed 'cos + not (isModuleInThisPackage (nameModule nm)) -- nameModule won't work on local names --- 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 -maybeWiredInIdName :: Name -> Maybe Id -maybeWiredInIdName (Name {n_sort = WiredInId _ id}) = Just id -maybeWiredInIdName other = Nothing -maybeWiredInTyConName :: Name -> Maybe TyCon -maybeWiredInTyConName (Name {n_sort = WiredInTyCon _ tc}) = Just tc -maybeWiredInTyConName other = Nothing +isTyVarName :: Name -> Bool +isTyVarName name = isTvOcc (nameOccName name) - -isLocalName (Name {n_sort = Local}) = True -isLocalName _ = False - -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 - -hasBetterProv :: Name -> Name -> Bool --- Choose --- a local thing over an imported thing --- a user-imported thing over a non-user-imported thing --- an explicitly-imported thing over an implicitly imported thing -hasBetterProv n1 n2 - = case (n_prov n1, n_prov n2) of - (LocalDef _ _, _ ) -> True - (NonLocalDef (UserImport _ _ True) _, _ ) -> True - (NonLocalDef (UserImport _ _ _ ) _, NonLocalDef ImplicitImport _) -> True - other -> False - -isSystemName (Name {n_prov = SystemProv}) = True -isSystemName other = False \end{code} @@ -552,30 +411,37 @@ instance NamedThing Name where type NameEnv a = UniqFM a -- Domain is Name emptyNameEnv :: NameEnv a +mkNameEnv :: [(Name,a)] -> NameEnv a nameEnvElts :: NameEnv a -> [a] -addToNameEnv_C :: (a->a->a) -> NameEnv a -> Name -> a -> NameEnv a -addToNameEnv :: NameEnv a -> Name -> a -> NameEnv a -addListToNameEnv :: NameEnv a -> [(Name,a)] -> NameEnv 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 -extendNameEnv :: NameEnv a -> [(Name,a)] -> NameEnv a -lookupNameEnv :: NameEnv a -> Name -> Maybe 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 -addToNameEnv_C = addToUFM_C -addToNameEnv = addToUFM -addListToNameEnv = addListToUFM +extendNameEnv_C = addToUFM_C +extendNameEnv = addToUFM plusNameEnv = plusUFM plusNameEnv_C = plusUFM_C -extendNameEnv = addListToUFM -lookupNameEnv = lookupUFM +extendNameEnvList= addListToUFM delFromNameEnv = delFromUFM elemNameEnv = elemUFM +mapNameEnv = mapUFM unitNameEnv = unitUFM + +lookupNameEnv = lookupUFM +lookupNameEnv_NF env n = expectJust "lookupNameEnv_NF" (lookupUFM env n) \end{code} @@ -590,73 +456,34 @@ 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 +pprName (Name {n_sort = sort, n_uniq = uniq, n_occ = occ}) = 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 + case sort of + Global mod -> pprGlobal sty uniq mod occ + System -> pprSysLocal sty uniq occ + Local -> pprLocal sty uniq occ empty + Exported -> pprLocal sty uniq occ (char 'x') - pp_local_extra sty uniq - | sys_local = underscore <> pprUnique uniq -- Must print uniques for sys_locals - | debugStyle sty = text "{-" <> pprUnique uniq <> text "-}" - | otherwise = empty +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 uniq mod occ + | codeStyle sty = ppr (moduleName mod) <> char '_' <> pprOccName occ -pprName (Name {n_sort = sort, n_uniq = uniq, n_occ = occ, n_prov = prov}) - -- Globals, and wired in things - = 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 user_sty - -- Hack alert! Omit the qualifier on SystemProv things in user style - -- I claim such SystemProv things 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 (user_sty || iface_sty) - - NonLocalDef (UserImport imp_mod _ _) omit - | user_sty -> pp_qual imp_mod omit - | otherwise -> pp_qual mod False - NonLocalDef ImplicitImport omit -> pp_qual mod (user_sty && omit) - where - user_sty = userStyle sty - iface_sty = ifaceStyle sty - - pp_qual mod omit_qual - | omit_qual = empty - | otherwise = pprModule mod <> dot - - 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' + | debugStyle sty = ppr (moduleName mod) <> dot <> pprOccName occ <> + text "{-" <> pprUnique10 uniq <> text "-}" + + | ifaceStyle sty + || printModulePrefix mod = ppr (moduleName mod) <> dot <> pprOccName occ + + | otherwise = pprOccName occ + +pprSysLocal sty uniq occ + | codeStyle sty = pprUnique uniq + | otherwise = pprOccName occ <> char '_' <> pprUnique uniq \end{code} @@ -679,11 +506,15 @@ getSrcLoc :: NamedThing a => a -> SrcLoc isLocallyDefined :: 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 getSrcLoc = nameSrcLoc . getName -isLocallyDefined = isLocallyDefinedName . getName -getOccString x = occNameString (getOccName x) -toRdrName = ifaceNameRdrName . getName +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}