X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FName.lhs;h=adb1082e49185b5323139a9b3e9390f0514c3733;hb=bb88e732b7383c10496c0f60c3bdea2c22362cc6;hp=303e0c749ac4cf2956a045aa77c1c5d5a4678dd0;hpb=f16228e47dbaf4c5eb710bf507b3b61bc5ad7122;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Name.lhs b/ghc/compiler/basicTypes/Name.lhs index 303e0c7..adb1082 100644 --- a/ghc/compiler/basicTypes/Name.lhs +++ b/ghc/compiler/basicTypes/Name.lhs @@ -10,35 +10,39 @@ module Name ( -- The Name type Name, -- Abstract - mkLocalName, mkSysLocalName, mkFCallName, - mkIPName, - mkGlobalName, mkKnownKeyGlobal, mkWiredInName, + BuiltInSyntax(..), + mkInternalName, mkSystemName, + mkSystemNameEncoded, mkSysTvName, + mkFCallName, mkIPName, + mkExternalName, mkWiredInName, nameUnique, setNameUnique, - nameOccName, nameModule, nameModule_maybe, - setNameOcc, nameRdrName, setNameModuleAndLoc, - toRdrName, hashName, - globaliseName, localiseName, + nameOccName, nameModule, nameModule_maybe, nameModuleName, + setNameOcc, + hashName, localiseName, - nameSrcLoc, + nameSrcLoc, nameParent, nameParent_maybe, - isSystemName, isLocalName, isGlobalName, isExternallyVisibleName, - isTyVarName, isDllName, + isSystemName, isInternalName, isExternalName, + isTyVarName, isDllName, isWiredInName, isBuiltInSyntax, + wiredInNameTyThing_maybe, nameIsLocalOrFrom, isHomePackageName, -- Class NamedThing and overloaded friends NamedThing(..), - getSrcLoc, getOccString, toRdrName + getSrcLoc, getOccString ) where #include "HsVersions.h" +import {-# SOURCE #-} TypeRep( TyThing ) + import OccName -- All of it -import Module ( Module, moduleName, mkVanillaModule, isHomeModule ) -import RdrName ( RdrName, mkRdrOrig, mkRdrUnqual, rdrNameOcc, rdrNameModule ) +import Module ( Module, ModuleName, moduleName, isHomeModule ) import CmdLineOpts ( opt_Static ) -import SrcLoc ( builtinSrcLoc, noSrcLoc, SrcLoc ) -import Unique ( Unique, Uniquable(..), u2i, pprUnique ) +import SrcLoc ( noSrcLoc, wiredInSrcLoc, SrcLoc ) +import Unique ( Unique, Uniquable(..), getKey, pprUnique ) +import Maybes ( orElse ) import FastTypes import Outputable \end{code} @@ -52,36 +56,48 @@ import Outputable \begin{code} data Name = Name { n_sort :: NameSort, -- What sort of name it is - n_occ :: OccName, -- Its occurrence name + n_occ :: !OccName, -- Its occurrence name n_uniq :: Unique, - n_loc :: SrcLoc -- Definition site + n_loc :: !SrcLoc -- Definition site } +-- NOTE: we make the n_loc field strict to eliminate some potential +-- (and real!) space leaks, due to the fact that we don't look at +-- the SrcLoc in a Name all that often. + data NameSort - = Global Module -- (a) TyCon, Class, their derived Ids, dfun Id - -- (b) Imported Id - -- (c) Top-level Id in the original source, even if - -- locally defined + = External Module (Maybe Name) + -- (Just parent) => this Name is a subordinate name of 'parent' + -- e.g. data constructor of a data type, method of a class + -- Nothing => not a subordinate + + | WiredIn Module (Maybe Name) TyThing BuiltInSyntax + -- A variant of External, for wired-in things - | Local -- A user-defined Id or TyVar + | Internal -- A user-defined Id or TyVar -- defined in the module being compiled | System -- A system-defined Id or TyVar. Typically the -- OccName is very uninformative (like 's') + +data BuiltInSyntax = BuiltInSyntax | UserSyntax +-- BuiltInSyntax is for things like (:), [], tuples etc, +-- which have special syntactic forms. They aren't "in scope" +-- as such. \end{code} Notes about the NameSorts: -1. Initially, top-level Ids (including locally-defined ones) get Global names, - and all other local Ids get Local names +1. Initially, top-level Ids (including locally-defined ones) get External names, + and all other local Ids get Internal names -2. Things with a @Global@ name are given C static labels, so they finally +2. Things with a External name are given C static labels, so they finally appear in the .o file's symbol table. They appear in the symbol table in the form M.n. If originally-local things have this property they - must be made @Global@ first. + must be made @External@ first. -3. In the tidy-core phase, a Global that is not visible to an importer - is changed to Local, and a Local that is visible is changed to Global +3. In the tidy-core phase, a External that is not visible to an importer + is changed to Internal, and a Internal that is visible is changed to External 4. A System Name differs in the following ways: a) has unique attached when printing dumps @@ -93,41 +109,74 @@ Notes about the NameSorts: If any desugarer sys-locals have survived that far, they get changed to "ds1", "ds2", etc. +Built-in syntax => It's a syntactic form, not "in scope" (e.g. []) + +Wired-in thing => The thing (Id, TyCon) is fully known to the compiler, + not read from an interface file. + E.g. Bool, True, Int, Float, and many others + +All built-in syntax is for wired-in things. + \begin{code} nameUnique :: Name -> Unique nameOccName :: Name -> OccName nameModule :: Name -> Module +nameModuleName :: Name -> ModuleName 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} -nameIsLocalOrFrom :: Module -> Name -> Bool -isLocalName :: Name -> Bool -- Not globals -isGlobalName :: Name -> Bool -isSystemName :: Name -> Bool -isExternallyVisibleName :: Name -> Bool -isHomePackageName :: Name -> Bool +nameIsLocalOrFrom :: Module -> Name -> Bool +isInternalName :: Name -> Bool +isExternalName :: Name -> Bool +isSystemName :: Name -> Bool +isHomePackageName :: Name -> Bool +isWiredInName :: Name -> Bool + +isWiredInName (Name {n_sort = WiredIn _ _ _ _}) = True +isWiredInName other = False + +wiredInNameTyThing_maybe :: Name -> Maybe TyThing +wiredInNameTyThing_maybe (Name {n_sort = WiredIn _ _ thing _}) = Just thing +wiredInNameTyThing_maybe other = Nothing + +isBuiltInSyntax (Name {n_sort = WiredIn _ _ _ BuiltInSyntax}) = True +isBuiltInSyntax other = False + +isExternalName (Name {n_sort = External _ _}) = True +isExternalName (Name {n_sort = WiredIn _ _ _ _}) = True +isExternalName other = False -isGlobalName (Name {n_sort = Global _}) = True -isGlobalName other = False +isInternalName name = not (isExternalName name) -isLocalName name = not (isGlobalName name) +nameParent_maybe :: Name -> Maybe Name +nameParent_maybe (Name {n_sort = External _ p}) = p +nameParent_maybe (Name {n_sort = WiredIn _ p _ _}) = p +nameParent_maybe other = Nothing -nameIsLocalOrFrom from (Name {n_sort = Global mod}) = mod == from -nameIsLocalOrFrom from other = True +nameParent :: Name -> Name +nameParent name = case nameParent_maybe name of + Just parent -> parent + Nothing -> name -isHomePackageName (Name {n_sort = Global mod}) = isHomeModule mod -isHomePackageName other = True -- Local and system names +nameModule name = nameModule_maybe name `orElse` pprPanic "nameModule" (ppr name) +nameModuleName name = moduleName (nameModule name) + +nameModule_maybe (Name { n_sort = External mod _}) = Just mod +nameModule_maybe (Name { n_sort = WiredIn mod _ _ _}) = Just mod +nameModule_maybe name = Nothing + +nameIsLocalOrFrom from name + | isExternalName name = from == nameModule name + | otherwise = True + +isHomePackageName name + | isExternalName name = isHomeModule (nameModule name) + | otherwise = True -- Internal and system names isDllName :: Name -> Bool -- Does this name refer to something in a different DLL? isDllName nm = not opt_Static && not (isHomePackageName nm) @@ -135,11 +184,6 @@ isDllName nm = not opt_Static && not (isHomePackageName nm) isTyVarName :: Name -> Bool isTyVarName name = isTvOcc (nameOccName 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 -isExternallyVisibleName name = isGlobalName name - isSystemName (Name {n_sort = System}) = True isSystemName other = False \end{code} @@ -152,8 +196,8 @@ isSystemName other = False %************************************************************************ \begin{code} -mkLocalName :: Unique -> OccName -> SrcLoc -> Name -mkLocalName uniq occ loc = Name { n_uniq = uniq, n_sort = Local, n_occ = occ, n_loc = loc } +mkInternalName :: Unique -> OccName -> SrcLoc -> Name +mkInternalName uniq occ loc = Name { n_uniq = uniq, n_sort = Internal, n_occ = occ, n_loc = loc } -- NB: You might worry that after lots of huffing and -- puffing we might end up with two local names with distinct -- uniques, but the same OccName. Indeed we can, but that's ok @@ -163,32 +207,43 @@ mkLocalName uniq occ loc = Name { n_uniq = uniq, n_sort = Local, n_occ = occ, n_ -- * for interface files we tidyCore first, which puts the uniques -- into the print name (see setNameVisibility below) -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 } +mkExternalName :: Unique -> Module -> OccName -> Maybe Name -> SrcLoc -> Name +mkExternalName uniq mod occ mb_parent loc + = Name { n_uniq = uniq, n_sort = External mod mb_parent, + n_occ = occ, n_loc = loc } -mkKnownKeyGlobal :: RdrName -> Unique -> Name -mkKnownKeyGlobal rdr_name uniq - = mkGlobalName uniq (mkVanillaModule (rdrNameModule rdr_name)) - (rdrNameOcc rdr_name) - builtinSrcLoc +mkWiredInName :: Module -> OccName -> Unique + -> Maybe Name -> TyThing -> BuiltInSyntax -> Name +mkWiredInName mod occ uniq mb_parent thing built_in + = Name { n_uniq = uniq, + n_sort = WiredIn mod mb_parent thing built_in, + n_occ = occ, n_loc = wiredInSrcLoc } + +mkSystemName :: Unique -> UserFS -> Name +mkSystemName uniq fs = Name { n_uniq = uniq, n_sort = System, + n_occ = mkVarOcc fs, n_loc = noSrcLoc } -mkWiredInName :: Module -> OccName -> Unique -> Name -mkWiredInName mod occ uniq = mkGlobalName uniq mod occ builtinSrcLoc +-- Use this version when the string is already encoded. Avoids duplicating +-- the string each time a new name is created. +mkSystemNameEncoded :: Unique -> EncodedFS -> Name +mkSystemNameEncoded uniq fs = Name { n_uniq = uniq, n_sort = System, + n_occ = mkSysOccFS varName fs, + n_loc = noSrcLoc } -mkSysLocalName :: Unique -> UserFS -> Name -mkSysLocalName uniq fs = Name { n_uniq = uniq, n_sort = System, - n_occ = mkVarOcc fs, n_loc = noSrcLoc } +mkSysTvName :: Unique -> EncodedFS -> Name +mkSysTvName uniq fs = Name { n_uniq = uniq, n_sort = System, + n_occ = mkSysOccFS tvName fs, + n_loc = noSrcLoc } mkFCallName :: Unique -> EncodedString -> Name -- The encoded string completely describes the ccall -mkFCallName uniq str = Name { n_uniq = uniq, n_sort = Local, +mkFCallName uniq str = Name { n_uniq = uniq, n_sort = Internal, n_occ = mkFCallOcc str, n_loc = noSrcLoc } mkIPName :: Unique -> OccName -> Name mkIPName uniq occ = Name { n_uniq = uniq, - n_sort = Local, + n_sort = Internal, n_occ = occ, n_loc = noSrcLoc } \end{code} @@ -202,16 +257,8 @@ setNameUnique name uniq = name {n_uniq = uniq} setNameOcc :: Name -> OccName -> Name setNameOcc name occ = name {n_occ = occ} -globaliseName :: Name -> Module -> Name -globaliseName n mod = n { n_sort = Global mod } - localiseName :: Name -> Name -localiseName n = n { n_sort = Local } - -setNameModuleAndLoc :: Name -> Module -> SrcLoc -> Name -setNameModuleAndLoc name mod loc = name {n_sort = set (n_sort name), n_loc = loc} - where - set (Global _) = Global mod +localiseName n = n { n_sort = Internal } \end{code} @@ -223,14 +270,7 @@ setNameModuleAndLoc name mod loc = name {n_sort = set (n_sort name), n_loc = loc \begin{code} hashName :: Name -> Int -hashName name = iBox (u2i (nameUnique name)) - - -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 +hashName name = getKey (nameUnique name) \end{code} @@ -272,36 +312,44 @@ instance NamedThing Name where \begin{code} instance Outputable Name where - -- When printing interfaces, all Locals have been given nice print-names + -- When printing interfaces, all Internals have been given nice print-names ppr name = pprName name -pprName name@(Name {n_sort = sort, n_uniq = uniq, n_occ = occ}) +instance OutputableBndr Name where + pprBndr _ name = pprName name + +pprName (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 - -pprGlobal sty name uniq mod occ - | codeStyle sty = ppr (moduleName mod) <> char '_' <> pprOccName occ - - | debugStyle sty = ppr (moduleName mod) <> dot <> pprOccName occ <> - text "{-" <> pprUnique uniq <> text "-}" - - | unqualStyle sty name = pprOccName occ - | otherwise = ppr (moduleName mod) <> dot <> pprOccName occ - -pprLocal sty uniq occ + WiredIn mod _ _ BuiltInSyntax -> pprOccName occ -- Built-in syntax is never qualified + WiredIn mod _ _ UserSyntax -> pprExternal sty uniq mod occ True + External mod _ -> pprExternal sty uniq mod occ False + System -> pprSystem sty uniq occ + Internal -> pprInternal sty uniq occ + +pprExternal sty uniq mod occ is_wired + | unqualStyle sty mod_name occ = pprOccName occ + | codeStyle sty = ppr mod_name <> char '_' <> pprOccName occ + | debugStyle sty = sep [ppr mod_name <> dot <> pprOccName occ, + hsep [text "{-" + , if is_wired then ptext SLIT("(w)") else empty + , pprUnique uniq +-- (overkill) , case mb_p of +-- Nothing -> empty +-- Just n -> brackets (ppr n) + , text "-}"]] + | otherwise = ppr mod_name <> dot <> pprOccName occ + where + mod_name = moduleName mod + +pprInternal sty uniq occ | codeStyle sty = pprUnique uniq - | debugStyle sty = pprOccName occ <> - text "{-" <> pprUnique uniq <> text "-}" - | otherwise = pprOccName occ -- User and Iface styles + | debugStyle sty = pprOccName occ <> text "{-" <> pprUnique uniq <> text "-}" + | otherwise = pprOccName occ -- User style --- Like Local, except that we only omit the unique in Iface style -pprSysLocal sty uniq occ +-- Like Internal, except that we only omit the unique in Iface style +pprSystem sty uniq occ | codeStyle sty = pprUnique uniq - | ifaceStyle sty = pprOccName occ -- The tidy phase has ensured that OccNames - -- are enough | otherwise = pprOccName occ <> char '_' <> pprUnique uniq -- If the tidy phase hasn't run, the OccName -- is unlikely to be informative (like 's'), @@ -325,10 +373,8 @@ class NamedThing a where \begin{code} getSrcLoc :: NamedThing a => a -> SrcLoc getOccString :: NamedThing a => a -> String -toRdrName :: NamedThing a => a -> RdrName getSrcLoc = nameSrcLoc . getName getOccString = occNameString . getOccName -toRdrName = nameRdrName . getName \end{code}