Reorganisation of the source tree
[ghc-hetmet.git] / ghc / compiler / basicTypes / Name.lhs
diff --git a/ghc/compiler/basicTypes/Name.lhs b/ghc/compiler/basicTypes/Name.lhs
deleted file mode 100644 (file)
index 1e1fb31..0000000
+++ /dev/null
@@ -1,384 +0,0 @@
-%
-% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
-%
-\section[Name]{@Name@: to transmit name info from renamer to typechecker}
-
-\begin{code}
-module Name (
-       -- Re-export the OccName stuff
-       module OccName,
-
-       -- The Name type
-       Name,                                   -- Abstract
-       BuiltInSyntax(..), 
-       mkInternalName, mkSystemName,
-       mkSystemVarName, mkSysTvName, 
-       mkFCallName, mkIPName,
-       mkExternalName, mkWiredInName,
-
-       nameUnique, setNameUnique,
-       nameOccName, nameModule, nameModule_maybe,
-       tidyNameOcc, 
-       hashName, localiseName,
-
-       nameSrcLoc, nameParent, nameParent_maybe, isImplicitName, 
-
-       isSystemName, isInternalName, isExternalName,
-       isTyVarName, isWiredInName, isBuiltInSyntax,
-       wiredInNameTyThing_maybe, 
-       nameIsLocalOrFrom,
-       
-       -- Class NamedThing and overloaded friends
-       NamedThing(..),
-       getSrcLoc, getOccString
-    ) where
-
-#include "HsVersions.h"
-
-import {-# SOURCE #-} TypeRep( TyThing )
-
-import OccName         -- All of it
-import Module          ( Module, moduleFS )
-import SrcLoc          ( noSrcLoc, wiredInSrcLoc, SrcLoc )
-import Unique          ( Unique, Uniquable(..), getKey, pprUnique )
-import Maybes          ( orElse, isJust )
-import FastString      ( FastString, zEncodeFS )
-import Outputable
-\end{code}
-
-%************************************************************************
-%*                                                                     *
-\subsection[Name-datatype]{The @Name@ datatype, and name construction}
-%*                                                                     *
-%************************************************************************
-\begin{code}
-data Name = Name {
-               n_sort :: NameSort,     -- What sort of name it is
-               n_occ  :: !OccName,     -- Its occurrence name
-               n_uniq :: Unique,
-               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
-  = 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
-
-  | 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 External names, 
-    and all other local Ids get Internal names
-
-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 @External@ first.
-
-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
-       b) unifier eliminates sys tyvars in favour of user provs where possible
-
-    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.
-
-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
-nameSrcLoc             :: Name -> SrcLoc
-
-nameUnique  name = n_uniq name
-nameOccName name = n_occ  name
-nameSrcLoc  name = n_loc  name
-\end{code}
-
-\begin{code}
-nameIsLocalOrFrom :: Module -> Name -> Bool
-isInternalName   :: Name -> Bool
-isExternalName   :: Name -> Bool
-isSystemName     :: 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
-
-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 :: Name -> Name
-nameParent name = case nameParent_maybe name of
-                       Just parent -> parent
-                       Nothing     -> name
-
-isImplicitName :: Name -> Bool
--- An Implicit Name is one has a parent; that is, one whose definition
--- derives from the parent thing
-isImplicitName name = isJust (nameParent_maybe name)
-
-nameModule name = nameModule_maybe name `orElse` pprPanic "nameModule" (ppr 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
-
-isTyVarName :: Name -> Bool
-isTyVarName name = isTvOcc (nameOccName name)
-
-isSystemName (Name {n_sort = System}) = True
-isSystemName other                   = False
-\end{code}
-
-
-%************************************************************************
-%*                                                                     *
-\subsection{Making names}
-%*                                                                     *
-%************************************************************************
-
-\begin{code}
-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
-       --      * 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)
-
-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 }
-
-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 -> OccName -> Name
-mkSystemName uniq occ = Name { n_uniq = uniq, n_sort = System, 
-                              n_occ = occ, n_loc = noSrcLoc }
-
-mkSystemVarName :: Unique -> FastString -> Name
-mkSystemVarName uniq fs = mkSystemName uniq (mkVarOccFS fs)
-
-mkSysTvName :: Unique -> FastString -> Name
-mkSysTvName uniq fs = mkSystemName uniq (mkOccNameFS tvName fs) 
-
-mkFCallName :: Unique -> String -> Name
-       -- The encoded string completely describes the ccall
-mkFCallName uniq str =  Name { n_uniq = uniq, n_sort = Internal, 
-                              n_occ = mkVarOcc str, n_loc = noSrcLoc }
-
-mkIPName :: Unique -> OccName -> Name
-mkIPName uniq occ
-  = Name { n_uniq = uniq,
-          n_sort = Internal,
-          n_occ  = occ,
-          n_loc = noSrcLoc }
-\end{code}
-
-\begin{code}
--- 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.
-setNameUnique name uniq = name {n_uniq = uniq}
-
-tidyNameOcc :: Name -> OccName -> Name
--- We set the OccName of a Name when tidying
--- In doing so, we change System --> Internal, so that when we print
--- it we don't get the unique by default.  It's tidy now!
-tidyNameOcc name@(Name { n_sort = System }) occ = name { n_occ = occ, n_sort = Internal}
-tidyNameOcc name                           occ = name { n_occ = occ }
-
-localiseName :: Name -> Name
-localiseName n = n { n_sort = Internal }
-\end{code}
-
-
-%************************************************************************
-%*                                                                     *
-\subsection{Predicates and selectors}
-%*                                                                     *
-%************************************************************************
-
-\begin{code}
-hashName :: Name -> Int
-hashName name = getKey (nameUnique name)
-\end{code}
-
-
-%************************************************************************
-%*                                                                     *
-\subsection[Name-instances]{Instance declarations}
-%*                                                                     *
-%************************************************************************
-
-\begin{code}
-cmpName n1 n2 = n_uniq n1 `compare` n_uniq n2
-\end{code}
-
-\begin{code}
-instance Eq Name where
-    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 `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
-    getUnique = nameUnique
-
-instance NamedThing Name where
-    getName n = n
-\end{code}
-
-
-%************************************************************************
-%*                                                                     *
-\subsection{Pretty printing}
-%*                                                                     *
-%************************************************************************
-
-\begin{code}
-instance Outputable Name where
-    ppr name = pprName name
-
-instance OutputableBndr Name where
-    pprBndr _ name = pprName name
-
-pprName (Name {n_sort = sort, n_uniq = uniq, n_occ = occ})
-  = getPprStyle $ \ sty ->
-    case sort of
-      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_z_module mod <> char '_' <> ppr_z_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,
-                                           pprNameSpaceBrief (occNameSpace 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 = ppr_occ_name occ <> braces (hsep [pprNameSpaceBrief (occNameSpace occ), 
-                                                      pprUnique uniq])
-  | dumpStyle sty  = ppr_occ_name occ <> char '_' <> pprUnique uniq
-                       -- For debug dumps, we're not necessarily dumping
-                       -- tidied code, so we need to print the uniques.
-  | 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
-  | debugStyle sty = ppr_occ_name occ <> char '_' <> pprUnique uniq
-                    <> braces (pprNameSpaceBrief (occNameSpace 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 = ftext (occNameFS occ)
-       -- Don't use pprOccName; instead, just print the string of the OccName; 
-       -- we print the namespace in the debug stuff above
-
--- In code style, we Z-encode the strings.  The results of Z-encoding each FastString are
--- cached behind the scenes in the FastString implementation.
-ppr_z_occ_name occ = ftext (zEncodeFS (occNameFS occ))
-ppr_z_module   mod = ftext (zEncodeFS (moduleFS mod))
-
-\end{code}
-
-%************************************************************************
-%*                                                                     *
-\subsection{Overloaded functions related to Names}
-%*                                                                     *
-%************************************************************************
-
-\begin{code}
-class NamedThing a where
-    getOccName :: a -> OccName
-    getName    :: a -> Name
-
-    getOccName n = nameOccName (getName n)     -- Default method
-\end{code}
-
-\begin{code}
-getSrcLoc          :: NamedThing a => a -> SrcLoc
-getOccString       :: NamedThing a => a -> String
-
-getSrcLoc          = nameSrcLoc           . getName
-getOccString       = occNameString        . getOccName
-\end{code}
-