X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FName.lhs;h=4ea51b603606dfb9322c954361c31d0e4a62b8d8;hb=8e67f5502e2e316245806ee3735a2f41a844b611;hp=3a68b58d1dff6b7b677567e223fd093aeeb63754;hpb=98688c6e8fd33f31c51218cf93cbf03fe3a5e73d;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Name.lhs b/ghc/compiler/basicTypes/Name.lhs index 3a68b58..4ea51b6 100644 --- a/ghc/compiler/basicTypes/Name.lhs +++ b/ghc/compiler/basicTypes/Name.lhs @@ -10,22 +10,23 @@ module Name ( -- The Name type Name, -- Abstract - mkInternalName, mkSystemName, - mkSystemNameEncoded, mkSystemTvNameEncoded, mkFCallName, - mkIPName, + BuiltInSyntax(..), + mkInternalName, mkSystemName, + mkSystemVarName, mkSystemVarNameEncoded, mkSysTvName, + mkFCallName, mkIPName, mkExternalName, mkWiredInName, nameUnique, setNameUnique, - nameOccName, nameModule, nameModule_maybe, nameModuleName, + nameOccName, nameModule, nameModule_maybe, setNameOcc, hashName, localiseName, nameSrcLoc, nameParent, nameParent_maybe, isSystemName, isInternalName, isExternalName, - isTyVarName, isDllName, isWiredInName, + isTyVarName, isWiredInName, isBuiltInSyntax, wiredInNameTyThing_maybe, - nameIsLocalOrFrom, isHomePackageName, + nameIsLocalOrFrom, -- Class NamedThing and overloaded friends NamedThing(..), @@ -37,12 +38,10 @@ module Name ( import {-# SOURCE #-} TypeRep( TyThing ) import OccName -- All of it -import Module ( Module, ModuleName, moduleName, isHomeModule ) -import CmdLineOpts ( opt_Static ) +import Module ( Module ) import SrcLoc ( noSrcLoc, wiredInSrcLoc, SrcLoc ) import Unique ( Unique, Uniquable(..), getKey, pprUnique ) import Maybes ( orElse ) -import FastTypes import Outputable \end{code} @@ -70,7 +69,7 @@ data NameSort -- e.g. data constructor of a data type, method of a class -- Nothing => not a subordinate - | WiredIn Module (Maybe Name) TyThing + | WiredIn Module (Maybe Name) TyThing BuiltInSyntax -- A variant of External, for wired-in things | Internal -- A user-defined Id or TyVar @@ -78,6 +77,11 @@ data NameSort | 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: @@ -103,11 +107,18 @@ 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 @@ -120,26 +131,28 @@ 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 +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 +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 +isExternalName (Name {n_sort = External _ _}) = True +isExternalName (Name {n_sort = WiredIn _ _ _ _}) = True +isExternalName other = False isInternalName name = not (isExternalName 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 +nameParent_maybe (Name {n_sort = External _ p}) = p +nameParent_maybe (Name {n_sort = WiredIn _ p _ _}) = p +nameParent_maybe other = Nothing nameParent :: Name -> Name nameParent name = case nameParent_maybe name of @@ -147,23 +160,14 @@ nameParent name = case nameParent_maybe name of Nothing -> name 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 +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) - isTyVarName :: Name -> Bool isTyVarName name = isTvOcc (nameOccName name) @@ -195,27 +199,27 @@ mkExternalName uniq mod occ mb_parent loc = Name { n_uniq = uniq, n_sort = External mod mb_parent, n_occ = occ, n_loc = loc } -mkWiredInName :: Module -> OccName -> Unique -> Maybe Name -> TyThing -> Name -mkWiredInName mod occ uniq mb_parent thing +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, + 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 } +mkSystemName :: Unique -> OccName -> Name +mkSystemName uniq occ = Name { n_uniq = uniq, n_sort = System, + n_occ = occ, n_loc = noSrcLoc } + +mkSystemVarName :: Unique -> UserFS -> Name +mkSystemVarName uniq fs = mkSystemName uniq (mkVarOcc fs) -- 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 } +mkSystemVarNameEncoded :: Unique -> EncodedFS -> Name +mkSystemVarNameEncoded uniq fs = mkSystemName uniq (mkSysOccFS varName fs) -mkSystemTvNameEncoded :: Unique -> EncodedFS -> Name -mkSystemTvNameEncoded uniq fs = Name { n_uniq = uniq, n_sort = System, - n_occ = mkSysOccFS tvName fs, - n_loc = noSrcLoc } +mkSysTvName :: Unique -> EncodedFS -> Name +mkSysTvName uniq fs = mkSystemName uniq (mkSysOccFS tvName fs) mkFCallName :: Unique -> EncodedString -> Name -- The encoded string completely describes the ccall @@ -252,7 +256,7 @@ localiseName n = n { n_sort = Internal } \begin{code} hashName :: Name -> Int -hashName name = iBox (getKey (nameUnique name)) +hashName name = getKey (nameUnique name) \end{code} @@ -294,47 +298,52 @@ instance NamedThing Name where \begin{code} instance Outputable Name where - -- When printing interfaces, all Internals have been given nice print-names ppr name = pprName name instance OutputableBndr Name where pprBndr _ name = pprName name -pprName name@(Name {n_sort = sort, n_uniq = uniq, n_occ = occ}) +pprName (Name {n_sort = sort, n_uniq = uniq, n_occ = occ}) = getPprStyle $ \ sty -> case sort of - External mod mb_p -> pprExternal sty name uniq mod occ mb_p False - WiredIn mod mb_p thing -> pprExternal sty name uniq mod occ mb_p True - System -> pprSystem sty uniq occ - Internal -> pprInternal sty uniq occ - -pprExternal sty name uniq mod occ mb_p is_wired - | codeStyle sty = ppr (moduleName mod) <> char '_' <> pprOccName occ - | debugStyle sty = sep [ppr (moduleName mod) <> dot <> pprOccName occ, - hsep [text "{-", - if is_wired then ptext SLIT("(w)") else empty, - pprUnique uniq, - case mb_p of - Nothing -> empty - Just n -> brackets (ppr n), - text "-}"]] - | unqualStyle sty name = pprOccName occ - | otherwise = ppr (moduleName mod) <> dot <> pprOccName occ + WiredIn mod _ _ builtin -> pprExternal sty uniq mod occ True builtin + External mod _ -> pprExternal sty uniq mod occ False UserSyntax + System -> pprSystem sty uniq occ + Internal -> pprInternal sty uniq occ + +pprExternal sty uniq mod occ is_wired is_builtin + | codeStyle sty = ppr mod <> char '_' <> ppr_occ_name occ + -- In code style, always qualify + -- ToDo: maybe we could print all wired-in things unqualified + -- in code style, to reduce symbol table bloat? + | debugStyle sty = ppr mod <> dot <> ppr_occ_name occ + <> braces (hsep [if is_wired then ptext SLIT("(w)") else empty, + text (briefOccNameFlavour occ), + pprUnique uniq]) + | BuiltInSyntax <- is_builtin = ppr_occ_name occ + -- never qualify builtin syntax + | unqualStyle sty mod occ = ppr_occ_name occ + | otherwise = ppr mod <> dot <> ppr_occ_name occ pprInternal sty uniq occ | codeStyle sty = pprUnique uniq - | debugStyle sty = hsep [pprOccName occ, text "{-", - text (briefOccNameFlavour occ), - pprUnique uniq, text "-}"] - | otherwise = pprOccName occ -- User style + | debugStyle sty = ppr_occ_name occ <> braces (hsep [text (briefOccNameFlavour occ), + pprUnique uniq]) + | otherwise = ppr_occ_name occ -- User style -- Like Internal, except that we only omit the unique in Iface style pprSystem sty uniq occ | codeStyle sty = pprUnique uniq - | otherwise = pprOccName occ <> char '_' <> pprUnique uniq + | debugStyle sty = ppr_occ_name occ <> char '_' <> pprUnique uniq + <> braces (text (briefOccNameFlavour occ)) + | otherwise = ppr_occ_name occ <> char '_' <> pprUnique uniq -- If the tidy phase hasn't run, the OccName -- is unlikely to be informative (like 's'), -- so print the unique + +ppr_occ_name occ = pprEncodedFS (occNameFS occ) + -- Don't use pprOccName; instead, just print the string of the OccName; + -- we print the namespace in the debug stuff above \end{code} %************************************************************************