[project @ 2003-02-18 15:54:02 by simonpj]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Name.lhs
index 6993cec..acf518f 100644 (file)
@@ -10,37 +10,35 @@ module Name (
 
        -- The Name type
        Name,                                   -- Abstract
-       mkInternalName, mkSystemName, mkFCallName,
+       mkInternalName, mkSystemName, 
+       mkSystemNameEncoded, mkSystemTvNameEncoded, mkFCallName,
        mkIPName,
        mkExternalName, mkKnownKeyExternalName, mkWiredInName,
 
        nameUnique, setNameUnique,
        nameOccName, nameModule, nameModule_maybe,
-       setNameOcc, nameRdrName, setNameModuleAndLoc, 
-       toRdrName, hashName, 
-       externaliseName, localiseName,
+       setNameOcc, setNameSrcLoc, 
+       hashName, externaliseName, localiseName,
 
-       nameSrcLoc, 
+       nameSrcLoc, eqNameByOcc,
 
        isSystemName, isInternalName, isExternalName,
-       isTyVarName, isDllName, 
+       isTyVarName, isDllName, isWiredInName,
        nameIsLocalOrFrom, isHomePackageName,
        
        -- Class NamedThing and overloaded friends
        NamedThing(..),
-       getSrcLoc, getOccString, toRdrName
+       getSrcLoc, getOccString
     ) where
 
 #include "HsVersions.h"
 
 import OccName         -- All of it
-import Module          ( Module, moduleName, mkVanillaModule, isHomeModule )
-import RdrName         ( RdrName, mkRdrOrig, mkRdrUnqual, rdrNameOcc, rdrNameModule )
+import Module          ( Module, moduleName, isHomeModule )
 import CmdLineOpts     ( opt_Static )
-import SrcLoc          ( builtinSrcLoc, noSrcLoc, SrcLoc )
+import SrcLoc          ( noSrcLoc, isWiredInLoc, wiredInSrcLoc, SrcLoc )
 import Unique          ( Unique, Uniquable(..), getKey, pprUnique )
 import FastTypes
-import Binary
 import Outputable
 \end{code}
 
@@ -107,12 +105,6 @@ nameSrcLoc         :: Name -> SrcLoc
 nameUnique  name = n_uniq name
 nameOccName name = n_occ  name
 nameSrcLoc  name = n_loc  name
-
-nameModule (Name { n_sort = External mod }) = mod
-nameModule name                                  = pprPanic "nameModule" (ppr name)
-
-nameModule_maybe (Name { n_sort = External mod }) = Just mod
-nameModule_maybe name                          = Nothing
 \end{code}
 
 \begin{code}
@@ -121,9 +113,18 @@ isInternalName       :: Name -> Bool
 isExternalName   :: Name -> Bool
 isSystemName     :: Name -> Bool
 isHomePackageName :: Name -> Bool
+isWiredInName    :: Name -> Bool
+
+isWiredInName name = isWiredInLoc (n_loc name)
 
 isExternalName (Name {n_sort = External _}) = True
-isExternalName other                   = False
+isExternalName other                       = False
+
+nameModule (Name { n_sort = External mod }) = mod
+nameModule name                                    = pprPanic "nameModule" (ppr name)
+
+nameModule_maybe (Name { n_sort = External mod }) = Just mod
+nameModule_maybe name                            = Nothing
 
 isInternalName name = not (isExternalName name)
 
@@ -141,6 +142,18 @@ isTyVarName name = isTvOcc (nameOccName name)
 
 isSystemName (Name {n_sort = System}) = True
 isSystemName other                   = False
+
+eqNameByOcc :: Name -> Name -> Bool
+-- Compare using the strings, not the unique
+-- See notes with HsCore.eq_ufVar
+eqNameByOcc (Name {n_sort = sort1, n_occ = occ1})
+           (Name {n_sort = sort2, n_occ = occ2})
+  = sort1 `eq_sort` sort2 && occ1 == occ2
+  where
+    eq_sort (External m1) (External m2) = moduleName m1 == moduleName m2
+    eq_sort (External _)  _            = False
+    eq_sort _            (External _)   = False
+    eq_sort _           _              = True
 \end{code}
 
 
@@ -164,20 +177,30 @@ mkInternalName uniq occ loc = Name { n_uniq = uniq, n_sort = Internal, n_occ = o
 
 mkExternalName :: Unique -> Module -> OccName -> SrcLoc -> Name
 mkExternalName uniq mod occ loc = Name { n_uniq = uniq, n_sort = External mod,
-                                      n_occ = occ, n_loc = loc }
+                                        n_occ = occ, n_loc = loc }
 
-mkKnownKeyExternalName :: RdrName -> Unique -> Name
-mkKnownKeyExternalName rdr_name uniq
-  = mkExternalName uniq (mkVanillaModule (rdrNameModule rdr_name))
-                     (rdrNameOcc rdr_name)
-                     builtinSrcLoc
+mkKnownKeyExternalName :: Module -> OccName -> Unique -> Name
+mkKnownKeyExternalName mod occ uniq
+  = mkExternalName uniq mod occ noSrcLoc
 
 mkWiredInName :: Module -> OccName -> Unique -> Name
-mkWiredInName mod occ uniq = mkExternalName uniq mod occ builtinSrcLoc
+mkWiredInName mod occ uniq = mkExternalName uniq mod occ wiredInSrcLoc
 
-mkSystemName :: Unique -> EncodedFS -> Name
+mkSystemName :: Unique -> UserFS -> Name
 mkSystemName uniq fs = Name { n_uniq = uniq, n_sort = System, 
-                               n_occ = mkVarOcc fs, n_loc = noSrcLoc }
+                             n_occ = mkVarOcc fs, n_loc = noSrcLoc }
+
+-- 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 }
+
+mkSystemTvNameEncoded :: Unique -> EncodedFS -> Name
+mkSystemTvNameEncoded 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
@@ -207,10 +230,8 @@ externaliseName n mod = n { n_sort = External mod }
 localiseName :: Name -> Name
 localiseName n = n { n_sort = Internal }
                                
-setNameModuleAndLoc :: Name -> Module -> SrcLoc -> Name
-setNameModuleAndLoc name mod loc = name {n_sort = set (n_sort name), n_loc = loc}
-                      where
-                        set (External _) = External mod
+setNameSrcLoc :: Name -> SrcLoc -> Name
+setNameSrcLoc name loc = name {n_loc = loc}
 \end{code}
 
 
@@ -223,13 +244,6 @@ setNameModuleAndLoc name mod loc = name {n_sort = set (n_sort name), n_loc = loc
 \begin{code}
 hashName :: Name -> Int
 hashName name = iBox (getKey (nameUnique name))
-
-
-nameRdrName :: Name -> RdrName
--- Makes a qualified name for top-level (External) names, 
--- whether locally defined or not and an unqualified name just for Internals
-nameRdrName (Name { n_occ = occ, n_sort = External mod }) = mkRdrOrig (moduleName mod) occ
-nameRdrName (Name { n_occ = occ })                       = mkRdrUnqual occ
 \end{code}
 
 
@@ -262,26 +276,6 @@ instance NamedThing Name where
     getName n = n
 \end{code}
 
-%************************************************************************
-%*                                                                     *
-\subsection{Binary output}
-%*                                                                     *
-%************************************************************************
-
-\begin{code}
-instance Binary Name where
-  -- we must print these as RdrNames, because that's how they will be read in
-  put_ bh Name {n_sort = sort, n_uniq = uniq, n_occ = occ} =
-   case sort of
-    External mod
-       | this_mod == mod -> put_ bh (mkRdrUnqual occ)
-       | otherwise       -> put_ bh (mkRdrOrig (moduleName mod) occ)
-        where (this_mod,_,_,_) = getUserData bh
-    _ -> do 
-       put_ bh (mkRdrUnqual occ)
-
-  get bh = error "can't Binary.get a Name"    
-\end{code}
 
 %************************************************************************
 %*                                                                     *
@@ -294,6 +288,9 @@ 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})
   = getPprStyle $ \ sty ->
     case sort of
@@ -303,17 +300,13 @@ pprName name@(Name {n_sort = sort, n_uniq = uniq, n_occ = occ})
 
 pprExternal 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 "-}"
-
+  | debugStyle sty       = ppr (moduleName mod) <> dot <> ppr_debug_occ uniq occ
   | unqualStyle sty name = pprOccName occ
   | otherwise           = ppr (moduleName mod) <> dot <> pprOccName occ
 
 pprInternal sty uniq occ
   | codeStyle sty  = pprUnique uniq
-  | debugStyle sty = pprOccName occ <> 
-                    text "{-" <> pprUnique uniq <> text "-}"
+  | debugStyle sty = ppr_debug_occ uniq occ
   | otherwise      = pprOccName occ    -- User style
 
 -- Like Internal, except that we only omit the unique in Iface style
@@ -323,6 +316,10 @@ pprSystem sty uniq occ
                                -- If the tidy phase hasn't run, the OccName
                                -- is unlikely to be informative (like 's'),
                                -- so print the unique
+
+ppr_debug_occ uniq occ = hsep [pprOccName occ, text "{-", 
+                              text (briefOccNameFlavour occ), 
+                              pprUnique uniq, text "-}"]
 \end{code}
 
 %************************************************************************
@@ -342,10 +339,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}