[project @ 2005-02-25 13:06:31 by simonpj]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Name.lhs
index 3a68b58..4ea51b6 100644 (file)
@@ -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}
 
 %************************************************************************