X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FName.lhs;h=bbdb46a2f5f70cc86379c7a5c97ab99394fdbb19;hb=111cee3f1ad93816cb828e38b38521d85c3bcebb;hp=1570bc5b56bbcff2350e0bd542d456e8d144ea47;hpb=fda89b29c748c6cd2fe1fdb477d5c0e8f7d32b90;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Name.lhs b/ghc/compiler/basicTypes/Name.lhs index 1570bc5..bbdb46a 100644 --- a/ghc/compiler/basicTypes/Name.lhs +++ b/ghc/compiler/basicTypes/Name.lhs @@ -1,154 +1,56 @@ % -% (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 ( - -- Re-export the Module type - SYN_IE(Module), - pprModule, moduleString, - - -- The OccName type - OccName(..), - pprOccName, occNameString, occNameFlavour, - isTvOcc, isTCOcc, isVarOcc, prefixOccName, - uniqToOccName, + -- Re-export the OccName stuff + module OccName, -- The Name type Name, -- Abstract - mkLocalName, mkSysLocalName, - - mkCompoundName, mkGlobalName, mkInstDeclName, - + mkLocalName, mkImportedLocalName, mkSysLocalName, mkCCallName, + mkTopName, mkIPName, + mkDerivedName, mkGlobalName, mkKnownKeyGlobal, mkWiredInIdName, mkWiredInTyConName, maybeWiredInIdName, maybeWiredInTyConName, - isWiredInName, + isWiredInName, hashName, - nameUnique, changeUnique, setNameProvenance, getNameProvenance, - setNameVisibility, - nameOccName, nameString, nameModule, + nameUnique, setNameUnique, setNameProvenance, getNameProvenance, setNameImportReason, + tidyTopName, + nameOccName, nameModule, setNameOcc, nameRdrName, setNameModule, - isExportedName, nameSrcLoc, - isLocallyDefinedName, + isUserExportedName, isUserImportedName, isUserImportedExplicitlyName, nameSrcLoc, + isLocallyDefinedName, isDynName, - isLocalName, + isSystemName, isLocalName, isGlobalName, isExternallyVisibleName, + - pprNameProvenance, - - -- Sets of Names - SYN_IE(NameSet), - emptyNameSet, unitNameSet, mkNameSet, unionNameSets, unionManyNameSets, - minusNameSet, elemNameSet, nameSetToList, addOneToNameSet, addListToNameSet, isEmptyNameSet, - - -- Misc - Provenance(..), pprProvenance, - ExportFlag(..), + -- Provenance + Provenance(..), ImportReason(..), pprProvenance, + ExportFlag(..), PrintUnqualified, + pprNameProvenance, hasBetterProv, -- Class NamedThing and overloaded friends NamedThing(..), - modAndOcc, isExported, getSrcLoc, isLocallyDefined, getOccString ) where -IMP_Ubiq() -#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ <= 201 -IMPORT_DELOOPER(TyLoop) ( GenId, Id(..), TyCon ) -- Used inside Names -#else -import {-# SOURCE #-} Id ( Id ) -import {-# SOURCE #-} TyCon ( TyCon ) -#endif - -import CStrings ( identToC, modnameToC, cSEP ) -import CmdLineOpts ( opt_OmitInterfacePragmas, opt_EnsureSplittableC ) -import BasicTypes ( SYN_IE(Module), IfaceFlavour(..), moduleString, pprModule ) - -import Outputable ( Outputable(..), PprStyle(..), codeStyle, ifaceStyle ) -import PrelMods ( gHC__ ) -import Pretty -import Lex ( isLexSym, isLexConId ) -import SrcLoc ( noSrcLoc, SrcLoc ) -import Usage ( SYN_IE(UVar), SYN_IE(Usage) ) -import Unique ( pprUnique, showUnique, Unique, Uniquable(..) ) -import UniqSet ( UniqSet(..), emptyUniqSet, unitUniqSet, unionUniqSets, uniqSetToList, isEmptyUniqSet, - unionManyUniqSets, minusUniqSet, mkUniqSet, elementOfUniqSet, addListToUniqSet, addOneToUniqSet ) -import UniqFM ( UniqFM ) -import Util ( Ord3(..), cmpPString, panic, assertPanic {-, pprTrace ToDo:rm-} ) -\end{code} +#include "HsVersions.h" +import {-# SOURCE #-} Var ( Id, setIdName ) +import {-# SOURCE #-} TyCon ( TyCon, setTyConName ) -%************************************************************************ -%* * -\subsection[Name-pieces-datatypes]{The @OccName@ datatypes} -%* * -%************************************************************************ +import OccName -- All of it +import Module ( Module, moduleName, pprModule, mkVanillaModule, isDynamicModule ) +import RdrName ( RdrName, mkRdrQual, mkRdrUnqual, rdrNameOcc, rdrNameModule ) +import CmdLineOpts ( opt_PprStyle_NoPrags, opt_OmitInterfacePragmas, opt_EnsureSplittableC ) -\begin{code} -data OccName = VarOcc FAST_STRING -- Variables and data constructors - | TvOcc FAST_STRING -- Type variables - | TCOcc FAST_STRING -- Type constructors and classes - -pprOccName :: PprStyle -> OccName -> Doc -pprOccName sty n = if codeStyle sty - then identToC (occNameString n) - else ptext (occNameString n) - -occNameString :: OccName -> FAST_STRING -occNameString (VarOcc s) = s -occNameString (TvOcc s) = s -occNameString (TCOcc s) = s - -prefixOccName :: FAST_STRING -> OccName -> OccName -prefixOccName prefix (VarOcc s) = VarOcc (prefix _APPEND_ s) -prefixOccName prefix (TvOcc s) = TvOcc (prefix _APPEND_ s) -prefixOccName prefix (TCOcc s) = TCOcc (prefix _APPEND_ s) - --- occNameFlavour is used only to generate good error messages, so it doesn't matter --- that the VarOcc case isn't mega-efficient. We could have different Occ constructors for --- data constructors and values, but that makes everything else a bit more complicated. -occNameFlavour :: OccName -> String -occNameFlavour (VarOcc s) | isLexConId s = "Data constructor" - | otherwise = "Value" -occNameFlavour (TvOcc s) = "Type variable" -occNameFlavour (TCOcc s) = "Type constructor or class" - -isVarOcc, isTCOcc, isTvOcc :: OccName -> Bool -isVarOcc (VarOcc s) = True -isVarOcc other = False - -isTvOcc (TvOcc s) = True -isTvOcc other = False - -isTCOcc (TCOcc s) = True -isTCOcc 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 +import SrcLoc ( noSrcLoc, mkBuiltinSrcLoc, SrcLoc ) +import Unique ( pprUnique, Unique, Uniquable(..), u2i ) +import Outputable +import GlaExts \end{code} @@ -159,15 +61,18 @@ instance Outputable OccName where %************************************************************************ \begin{code} -data Name - = Local Unique - OccName - SrcLoc - - | Global Unique - Module -- The defining module - OccName -- Its name in that module - Provenance -- How it was defined +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 + } + +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 @@ -176,105 +81,128 @@ in the form M.n. If originally-local things have this property they must be made @Global@ first. \begin{code} -data Provenance - = LocalDef ExportFlag SrcLoc -- Locally defined - | Imported Module SrcLoc IfaceFlavour -- Directly imported from M; - -- gives name of module in import statement - -- and locn of import statement - | Implicit IfaceFlavour -- Implicitly imported - | WiredInTyCon TyCon -- There's a wired-in version - | WiredInId Id -- ...ditto... -\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} -data ExportFlag = Exported | NotExported -\end{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) + +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 +mkImportedLocalName uniq occ loc = Name { n_uniq = uniq, n_sort = Local, n_occ = occ, + n_prov = NonLocalDef ImplicitImport True } -\begin{code} -mkLocalName :: Unique -> OccName -> SrcLoc -> Name -mkLocalName = Local mkGlobalName :: Unique -> Module -> OccName -> Provenance -> Name -mkGlobalName = Global - -mkSysLocalName :: Unique -> FAST_STRING -> SrcLoc -> Name -mkSysLocalName uniq str loc = Local uniq (VarOcc str) loc - -mkWiredInIdName :: Unique -> Module -> FAST_STRING -> Id -> Name -mkWiredInIdName uniq mod occ id - = Global uniq mod (VarOcc occ) (WiredInId id) - +mkGlobalName uniq mod occ prov = Name { n_uniq = uniq, n_sort = Global mod, + n_occ = occ, n_prov = prov } + + +mkKnownKeyGlobal :: (RdrName, Unique) -> Name +mkKnownKeyGlobal (rdr_name, uniq) + = mkGlobalName uniq (mkVanillaModule (rdrNameModule rdr_name)) + (rdrNameOcc rdr_name) + systemProvenance + +mkSysLocalName :: Unique -> UserFS -> Name +mkSysLocalName uniq fs = Name { n_uniq = uniq, n_sort = Local, + n_occ = mkSrcVarOcc fs, n_prov = systemProvenance } + +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 } + +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 occ tycon - = Global uniq mod (TCOcc occ) (WiredInTyCon tycon) - - -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 +mkWiredInTyConName uniq mod fs tycon + = Name { n_uniq = uniq, n_sort = WiredInTyCon mod tycon, + n_occ = mkSrcOccFS tcName fs, n_prov = SystemProv } -mkCompoundName str_fn uniq (Global _ mod occ prov) - = Global uniq mod new_occ prov - where - new_occ = VarOcc (str_fn (occNameString occ)) -- Always a VarOcc -mkCompoundName str_fn uniq (Local _ occ loc) - = Local uniq (VarOcc (str_fn (occNameString occ))) loc +--------------------------------------------------------------------- +mkDerivedName :: (OccName -> OccName) + -> Name -- Base name + -> Unique -- New unique + -> Name -- Result is always a value name - -- 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 prov - where - prov | from_here = LocalDef Exported loc - | otherwise = Implicit HiFile -- Odd - - -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 proveance 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 uniq occ locn) = LocalDef NotExported locn +mkDerivedName f name uniq = name {n_uniq = uniq, n_occ = f (n_occ 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. -changeUnique (Local _ n l) u = Local u n l -changeUnique (Global _ mod occ prov) u = Global u mod occ prov +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} + +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 \end{code} -setNameVisibility is applied to names in the final program -The Maybe Module argument is (Just mod) for top-level values, -and Nothing for all others (local values and type variables) +%************************************************************************ +%* * +\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) -For nested things it localises Global names. - 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 @@ -302,34 +230,147 @@ are exported. But also: top-level defns externally visible \begin{code} -setNameVisibility :: Maybe Module -> Unique -> Name -> Name +tidyTopName :: Module -> TidyOccEnv -> Name -> (TidyOccEnv, Name) +tidyTopName mod env name + = (env', name') + where + (env', occ') = tidyOccName env (n_occ name) -setNameVisibility maybe_mod occ_uniq name@(Global uniq mod occ (LocalDef NotExported loc)) - | not all_toplev_ids_visible || not_top_level maybe_mod - = Local uniq (uniqToOccName occ_uniq) loc -- Localise Global name + name' = Name { n_uniq = n_uniq name, n_sort = mk_top_sort mod, + n_occ = occ', n_prov = LocalDef noSrcLoc NotExported } -setNameVisibility maybe_mod occ_uniq name@(Global _ _ _ _) - = name -- Otherwise don't fiddle with Global +mk_top_sort mod | all_toplev_ids_visible = Global mod + | otherwise = Local -setNameVisibility (Just mod) occ_uniq (Local uniq occ loc) - | all_toplev_ids_visible - = Global uniq mod -- Globalise Local name - (uniqToOccName occ_uniq) - (LocalDef NotExported loc) +all_toplev_ids_visible = + not opt_OmitInterfacePragmas || -- Pragmas can make them visible + opt_EnsureSplittableC -- Splitting requires visiblilty +\end{code} -setNameVisibility maybe_mod occ_uniq (Local uniq occ loc) - = Local uniq (uniqToOccName occ_uniq) loc -- New OccName for Local -uniqToOccName uniq = VarOcc (_PK_ ('$':showUnique uniq)) - -- The "$" is to make sure that this OccName is distinct from all user-defined ones +\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} -not_top_level (Just m) = False -not_top_level Nothing = True +getNameProvenance :: Name -> Provenance +getNameProvenance name = n_prov name -all_toplev_ids_visible = not opt_OmitInterfacePragmas || -- Pragmas can make them visible - opt_EnsureSplittableC -- Splitting requires visiblilty +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} +%* * +%************************************************************************ + +\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} + +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 + +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 +\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} + + %************************************************************************ %* * \subsection{Predicates and selectors} @@ -338,62 +379,100 @@ all_toplev_ids_visible = not opt_OmitInterfacePragmas || -- Pragmas can make th \begin{code} nameUnique :: Name -> Unique -nameModAndOcc :: Name -> (Module, OccName) -- Globals only nameOccName :: Name -> OccName nameModule :: Name -> Module -nameString :: Name -> FAST_STRING -- A.b form nameSrcLoc :: Name -> SrcLoc isLocallyDefinedName :: Name -> Bool -isExportedName :: Name -> Bool +isUserExportedName :: Name -> Bool isWiredInName :: Name -> Bool isLocalName :: Name -> Bool +isGlobalName :: Name -> Bool +isExternallyVisibleName :: Name -> Bool + + + +hashName :: Name -> Int +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 -nameUnique (Local u _ _) = u -nameUnique (Global u _ _ _) = u +nameSortModule (Global mod) = mod +nameSortModule (WiredInId mod _) = mod +nameSortModule (WiredInTyCon mod _) = mod -nameOccName (Local _ occ _) = occ -nameOccName (Global _ _ occ _) = occ +nameRdrName :: Name -> RdrName +nameRdrName (Name { n_sort = Local, n_occ = occ }) = mkRdrUnqual occ +nameRdrName (Name { n_sort = sort, n_occ = occ }) = mkRdrQual (moduleName (nameSortModule sort)) occ -nameModule (Global _ mod occ _) = mod +isUserExportedName (Name { n_prov = LocalDef _ Exported }) = True +isUserExportedName other = False -nameModAndOcc (Global _ mod occ _) = (mod,occ) +isUserImportedExplicitlyName (Name { n_prov = NonLocalDef (UserImport _ _ explicit) _ }) = explicit +isUserImportedExplicitlyName other = False -nameString (Local _ occ _) = occNameString occ -nameString (Global _ mod occ _) = mod _APPEND_ SLIT(".") _APPEND_ occNameString occ +isUserImportedName (Name { n_prov = NonLocalDef (UserImport _ _ _) _ }) = True +isUserImportedName other = False -isExportedName (Global _ _ _ (LocalDef Exported _)) = True -isExportedName other = False +isDynName :: Name -> Bool + -- Does this name come from a DLL? +isDynName nm = not (isLocallyDefinedName nm) && + isDynamicModule (nameModule nm) -nameSrcLoc (Local _ _ loc) = loc -nameSrcLoc (Global _ _ _ (LocalDef _ loc)) = loc -nameSrcLoc (Global _ _ _ (Imported _ loc _)) = loc -nameSrcLoc other = noSrcLoc +nameSrcLoc name = provSrcLoc (n_prov name) + +provSrcLoc (LocalDef loc _) = loc +provSrcLoc (NonLocalDef (UserImport _ loc _) _) = loc +provSrcLoc other = noSrcLoc -isLocallyDefinedName (Local _ _ _) = True -isLocallyDefinedName (Global _ _ _ (LocalDef _ _)) = True -isLocallyDefinedName other = False +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 (Global _ _ _ (WiredInTyCon _)) = True -isWiredInName (Global _ _ _ (WiredInId _)) = True -isWiredInName _ = False +isWiredInName (Name {n_sort = WiredInTyCon _ _}) = True +isWiredInName (Name {n_sort = WiredInId _ _}) = True +isWiredInName _ = False maybeWiredInIdName :: Name -> Maybe Id -maybeWiredInIdName (Global _ _ _ (WiredInId id)) = Just id -maybeWiredInIdName other = Nothing +maybeWiredInIdName (Name {n_sort = WiredInId _ id}) = Just id +maybeWiredInIdName other = Nothing maybeWiredInTyConName :: Name -> Maybe TyCon -maybeWiredInTyConName (Global _ _ _ (WiredInTyCon tc)) = Just tc -maybeWiredInTyConName other = Nothing +maybeWiredInTyConName (Name {n_sort = WiredInTyCon _ tc}) = Just tc +maybeWiredInTyConName other = Nothing + + +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 +hasBetterProv name1 name2 + = case n_prov name1 of + LocalDef _ _ -> True + SystemProv -> False + NonLocalDef _ _ -> case n_prov name2 of + LocalDef _ _ -> False + other -> True -isLocalName (Local _ _ _) = True -isLocalName _ = False +isSystemName (Name {n_prov = SystemProv}) = True +isSystemName other = False \end{code} @@ -404,37 +483,29 @@ isLocalName _ = False %************************************************************************ \begin{code} -cmpName n1 n2 = c n1 n2 - where - c (Local u1 _ _) (Local u2 _ _) = cmp u1 u2 - c (Local _ _ _) _ = LT_ - c (Global u1 _ _ _) (Global u2 _ _ _) = cmp u1 u2 - c (Global _ _ _ _) _ = GT_ +cmpName n1 n2 = n_uniq n1 `compare` n_uniq n2 \end{code} \begin{code} instance Eq Name where - a == b = case (a `cmp` b) of { EQ_ -> True; _ -> False } - a /= b = case (a `cmp` b) of { EQ_ -> False; _ -> True } + a == b = case (a `compare` b) of { EQ -> True; _ -> False } + a /= b = case (a `compare` b) of { EQ -> False; _ -> True } instance Ord Name where - a <= b = case (a `cmp` b) of { LT_ -> True; EQ_ -> True; GT__ -> False } - a < b = case (a `cmp` b) of { LT_ -> True; EQ_ -> False; GT__ -> False } - a >= b = case (a `cmp` b) of { LT_ -> False; EQ_ -> True; GT__ -> True } - a > b = case (a `cmp` b) of { LT_ -> False; EQ_ -> False; GT__ -> True } - -instance Ord3 Name where - cmp = cmpName + a <= b = case (a `compare` b) of { LT -> True; EQ -> True; GT -> False } + a < b = case (a `compare` b) of { LT -> True; EQ -> False; GT -> False } + a >= b = case (a `compare` b) of { LT -> False; EQ -> True; GT -> True } + a > b = case (a `compare` b) of { LT -> False; EQ -> False; GT -> True } + compare a b = cmpName a b instance Uniquable Name where - uniqueOf = nameUnique + getUnique = nameUnique instance NamedThing Name where getName n = n \end{code} - %************************************************************************ %* * \subsection{Pretty printing} @@ -443,97 +514,79 @@ instance NamedThing Name where \begin{code} instance Outputable Name where - ppr PprQuote name@(Local _ _ _) = quotes (ppr (PprForUser 1) name) - -- When printing interfaces, all Locals have been given nice print-names - ppr (PprForUser _) (Local _ n _) = ptext (occNameString n) - ppr PprInterface (Local _ n _) = ptext (occNameString n) - - ppr sty (Local u n _) | codeStyle sty = pprUnique u - - ppr sty (Local u n _) = hcat [ptext (occNameString n), ptext SLIT("_"), pprUnique u] - - ppr PprQuote name@(Global _ _ _ _) = quotes (ppr (PprForUser 1) name) - - ppr sty name@(Global u m n _) - | codeStyle sty - = identToC (m _APPEND_ SLIT(".") _APPEND_ occNameString n) - - ppr sty name@(Global u m n prov) - = hcat [pp_mod_dot, ptext (occNameString n), pp_debug sty name] - where - pp_mod = pprModule (PprForUser 1) m - pp_mod_dot = case prov of --- Omit home module qualifier - LocalDef _ _ -> empty - Imported _ _ hif -> pp_mod <> pp_dot hif - Implicit hif -> pp_mod <> pp_dot hif - other -> pp_mod <> text "." - - pp_dot HiFile = text "." -- Vanilla case - pp_dot HiBootFile = text "!" -- M!t indicates a name imported from a .hi-boot interface - - -pp_debug PprDebug (Global uniq m n prov) = hcat [text "{-", pprUnique uniq, char ',', - pp_prov prov, text "-}"] - where - pp_prov (LocalDef Exported _) = char 'x' - pp_prov (LocalDef NotExported _) = char 'l' - pp_prov (Imported _ _ _) = char 'i' - pp_prov (Implicit _) = char 'p' - pp_prov (WiredInTyCon _) = char 'W' - pp_prov (WiredInId _) = char 'w' -pp_debug other name = empty - --- pprNameProvenance is used in error messages to say where a name came from -pprNameProvenance :: PprStyle -> Name -> Doc -pprNameProvenance sty (Local _ _ loc) = pprProvenance sty (LocalDef NotExported loc) -pprNameProvenance sty (Global _ _ _ prov) = pprProvenance sty prov - -pprProvenance :: PprStyle -> Provenance -> Doc -pprProvenance sty (Imported mod loc _) - = sep [ptext SLIT("Imported from"), pprModule sty mod, ptext SLIT("at"), ppr sty loc] -pprProvenance sty (LocalDef _ loc) = sep [ptext SLIT("Defined at"), ppr sty loc] -pprProvenance sty (Implicit _) = panic "pprNameProvenance: Implicit" -pprProvenance sty (WiredInTyCon tc) = ptext SLIT("Wired-in tycon") -pprProvenance sty (WiredInId id) = ptext SLIT("Wired-in id") -\end{code} - - -%************************************************************************ -%* * -\subsection[Sets of names} -%* * -%************************************************************************ - -\begin{code} -type NameSet = UniqSet Name -emptyNameSet :: NameSet -unitNameSet :: Name -> NameSet -addListToNameSet :: NameSet -> [Name] -> NameSet -addOneToNameSet :: NameSet -> Name -> NameSet -mkNameSet :: [Name] -> NameSet -unionNameSets :: NameSet -> NameSet -> NameSet -unionManyNameSets :: [NameSet] -> NameSet -minusNameSet :: NameSet -> NameSet -> NameSet -elemNameSet :: Name -> NameSet -> Bool -nameSetToList :: NameSet -> [Name] -isEmptyNameSet :: NameSet -> Bool - -isEmptyNameSet = isEmptyUniqSet -emptyNameSet = emptyUniqSet -unitNameSet = unitUniqSet -mkNameSet = mkUniqSet -addListToNameSet = addListToUniqSet -addOneToNameSet = addOneToUniqSet -unionNameSets = unionUniqSets -unionManyNameSets = unionManyUniqSets -minusNameSet = minusUniqSet -elemNameSet = elementOfUniqSet -nameSetToList = uniqSetToList + 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 + = 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' \end{code} - %************************************************************************ %* * \subsection{Overloaded functions related to Names} @@ -542,30 +595,22 @@ nameSetToList = uniqSetToList \begin{code} class NamedThing a where - getOccName :: a -> OccName -- Even RdrNames can do this! + getOccName :: a -> OccName getName :: a -> Name getOccName n = nameOccName (getName n) -- Default method \end{code} \begin{code} -modAndOcc :: NamedThing a => a -> (Module, OccName) -getModule :: NamedThing a => a -> Module getSrcLoc :: NamedThing a => a -> SrcLoc isLocallyDefined :: NamedThing a => a -> Bool -isExported :: NamedThing a => a -> Bool getOccString :: NamedThing a => a -> String -modAndOcc = nameModAndOcc . getName -getModule = nameModule . getName -isExported = isExportedName . getName getSrcLoc = nameSrcLoc . getName isLocallyDefined = isLocallyDefinedName . getName -getOccString x = _UNPK_ (occNameString (getOccName x)) +getOccString x = occNameString (getOccName x) \end{code} \begin{code} -{-# SPECIALIZE isLocallyDefined - :: Name -> Bool - #-} +{-# SPECIALIZE isLocallyDefined :: Name -> Bool #-} \end{code}