OccNames for closure conversion isomorphisms
[ghc-hetmet.git] / compiler / basicTypes / OccName.lhs
index 0d1cb37..8de65b8 100644 (file)
@@ -1,10 +1,8 @@
-{-% DrIFT (Automatic class derivations for Haskell) v1.1 %-}
 %
+% (c) The University of Glasgow 2006
 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
 %
 
-\section[OccName]{@OccName@}
-
 \begin{code}
 module OccName (
        -- * The NameSpace type; abstact
@@ -33,7 +31,8 @@ module OccName (
        mkSpecOcc, mkForeignExportOcc, mkGenOcc1, mkGenOcc2,
        mkDataTOcc, mkDataCOcc, mkDataConWorkerOcc,
        mkSuperDictSelOcc, mkLocalOcc, mkMethodOcc, mkInstTyTcOcc,
-       mkInstTyCoOcc, 
+       mkInstTyCoOcc, mkEqPredCoOcc,
+        mkCloOcc, mkCloTyConOcc, mkCloDataConOcc, mkCloIsoOcc,
 
        -- ** Deconstruction
        occNameFS, occNameString, occNameSpace, 
@@ -45,7 +44,7 @@ module OccName (
 
        -- The OccEnv type
        OccEnv, emptyOccEnv, unitOccEnv, extendOccEnv, mapOccEnv,
-       lookupOccEnv, mkOccEnv, extendOccEnvList, elemOccEnv,
+       lookupOccEnv, mkOccEnv, mkOccEnv_C, extendOccEnvList, elemOccEnv,
        occEnvElts, foldOccEnv, plusOccEnv, plusOccEnv_C, extendOccEnv_C,
 
        -- The OccSet type
@@ -65,23 +64,21 @@ module OccName (
 
 #include "HsVersions.h"
 
-import Util            ( thenCmp )
-import Unique          ( Unique, mkUnique, Uniquable(..) )
-import BasicTypes      ( Boxity(..), Arity )
-import StaticFlags     ( opt_PprStyle_Debug )
+import Util
+import Unique
+import BasicTypes
+import StaticFlags
 import UniqFM
 import UniqSet
 import FastString
 import Outputable
 import Binary
 
-import GLAEXTS
-
-import Data.Char       ( isUpper, isLower, ord )
+import GHC.Exts
+import Data.Char
 
 -- Unicode TODO: put isSymbol in libcompat
 #if __GLASGOW_HASKELL__ > 604
-import Data.Char       ( isSymbol )
 #else
 isSymbol = const False
 #endif
@@ -95,8 +92,8 @@ isSymbol = const False
 %************************************************************************
 
 \begin{code}
-data NameSpace = VarName       -- Variables, including "source" data constructors
-              | DataName       -- "Real" data constructors 
+data NameSpace = VarName       -- Variables, including "real" data constructors
+              | DataName       -- "Source" data constructors 
               | TvName         -- Type variables
               | TcClsName      -- Type constructors and classes; Haskell has them
                                -- in the same name space for now.
@@ -179,8 +176,9 @@ instance Eq OccName where
     (OccName sp1 s1) == (OccName sp2 s2) = s1 == s2 && sp1 == sp2
 
 instance Ord OccName where
-    compare (OccName sp1 s1) (OccName sp2 s2) = (s1  `compare` s2) `thenCmp`
-                                               (sp1 `compare` sp2)
+       -- Compares lexicographically, *not* by Unique of the string
+    compare (OccName sp1 s1) (OccName sp2 s2) 
+       = (s1  `compare` s2) `thenCmp` (sp1 `compare` sp2)
 \end{code}
 
 
@@ -262,6 +260,7 @@ extendOccEnv :: OccEnv a -> OccName -> a -> OccEnv a
 extendOccEnvList :: OccEnv a -> [(OccName, a)] -> OccEnv a
 lookupOccEnv :: OccEnv a -> OccName -> Maybe a
 mkOccEnv     :: [(OccName,a)] -> OccEnv a
+mkOccEnv_C   :: (a -> a -> a) -> [(OccName,a)] -> OccEnv a
 elemOccEnv   :: OccName -> OccEnv a -> Bool
 foldOccEnv   :: (a -> b -> b) -> b -> OccEnv a -> b
 occEnvElts   :: OccEnv a -> [a]
@@ -284,6 +283,8 @@ plusOccEnv_C         = plusUFM_C
 extendOccEnv_C   = addToUFM_C
 mapOccEnv       = mapUFM
 
+mkOccEnv_C comb l = addListToUFM_C comb emptyOccEnv l
+
 type OccSet = UniqFM OccName
 
 emptyOccSet      :: OccSet
@@ -401,6 +402,7 @@ Here's our convention for splitting up the interface file name space:
        $w...           workers
        :T...           compiler-generated tycons for dictionaries
        :D...           ...ditto data cons
+        :Co...          ...ditto coercions
        $sf..           specialised version of f
 
        in encoded form these appear as Zdfxxx etc
@@ -444,6 +446,7 @@ mkSpecOcc       = mk_simple_deriv varName  "$s"
 mkForeignExportOcc  = mk_simple_deriv varName  "$f"
 mkNewTyCoOcc        = mk_simple_deriv tcName  ":Co"
 mkInstTyCoOcc       = mk_simple_deriv tcName  ":Co"      -- derived from rep ty
+mkEqPredCoOcc      = mk_simple_deriv tcName  "$co"
 
 -- Generic derivable classes
 mkGenOcc1           = mk_simple_deriv varName  "$gfrom"
@@ -455,6 +458,12 @@ mkGenOcc2           = mk_simple_deriv varName  "$gto"
 mkDataTOcc = mk_simple_deriv varName  "$t"
 mkDataCOcc = mk_simple_deriv varName  "$c"
 
+-- Closure conversion
+mkCloOcc        = mk_simple_deriv varName  "$CC_"
+mkCloTyConOcc   = mk_simple_deriv tcName   ":CC_"
+mkCloDataConOcc = mk_simple_deriv dataName ":CD_"
+mkCloIsoOcc     = mk_simple_deriv varName  "$CCiso_"
+
 mk_simple_deriv sp px occ = mk_deriv sp px (occNameString occ)
 
 -- Data constructor workers are made by setting the name space