[project @ 2003-07-24 12:19:56 by ralf]
[ghc-hetmet.git] / ghc / compiler / prelude / PrelNames.lhs
index dafee0d..4d834df 100644 (file)
@@ -1,60 +1,73 @@
 %
 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
 %
-\section[PrelNames]{Definitions of prelude modules}
+\section[PrelNames]{Definitions of prelude modules and names}
 
-The strings identify built-in prelude modules.  They are
-defined here so as to avod 
 
-[oh dear, looks like the recursive module monster caught up with
- and gobbled whoever was writing the above :-) -- SOF ]
+Nota Bene: all Names defined in here should come from the base package
+
+* ModuleNames for prelude modules, 
+       e.g.    pREL_BASE_Name :: ModuleName
+
+* Modules for prelude modules
+       e.g.    pREL_Base :: Module
+
+* Uniques for Ids, DataCons, TyCons and Classes that the compiler 
+  "knows about" in some way
+       e.g.    intTyConKey :: Unique
+               minusClassOpKey :: Unique
+
+* Names for Ids, DataCons, TyCons and Classes that the compiler 
+  "knows about" in some way
+       e.g.    intTyConName :: Name
+               minusName    :: Name
+  One of these Names contains
+       (a) the module and occurrence name of the thing
+       (b) its Unique
+  The may way the compiler "knows about" one of these things is
+  where the type checker or desugarer needs to look it up. For
+  example, when desugaring list comprehensions the desugarer
+  needs to conjure up 'foldr'.  It does this by looking up
+  foldrName in the environment.
+
+* RdrNames for Ids, DataCons etc that the compiler may emit into
+  generated code (e.g. for deriving).  It's not necessary to know
+  the uniques for these guys, only their names
+
 
 \begin{code}
 module PrelNames (
        Unique, Uniquable(..), hasKey,  -- Re-exported for convenience
 
        -----------------------------------------------------------
-       module PrelNames,       -- A huge bunch of (a) RdrNames, e.g. intTyCon_RDR
-                               --                 (b) Uniques   e.g. intTyConKey
+       module PrelNames,       -- A huge bunch of (a) Names,  e.g. intTyConName
+                               --                 (b) Uniques e.g. intTyConKey
+                               --                 (c) Groups of classes and types
+                               --                 (d) miscellaneous things
                                -- So many that we export them all
-
-       -----------------------------------------------------------
-       knownKeyNames, 
-        mkTupNameStr, mkTupConRdrName,
-
-       ------------------------------------------------------------
-       -- Goups of classes and types
-       needsDataDeclCtxtClassKeys, cCallishClassKeys, noDictClassKeys,
-       fractionalClassKeys, numericClassKeys, standardClassKeys,
-       derivingOccurrences,    -- For a given class C, this tells what other 
-       derivableClassKeys,     -- things are needed as a result of a 
-                               -- deriving(C) clause
-       numericTyKeys, cCallishTyKeys,
-
-       mkUnboundName, isUnboundName
     ) where
 
 #include "HsVersions.h"
 
-import Module    ( ModuleName, mkPrelModule, mkHomeModule, mkModuleName )
-import OccName   ( NameSpace, UserFS, varName, dataName, tcName, clsName, 
+import Module    ( ModuleName, mkBasePkgModule, mkHomeModule, mkModuleName )
+import OccName   ( UserFS, dataName, tcName, clsName, varName,
                    mkKindOccFS, mkOccFS
                  )
-import RdrName   ( RdrName, mkOrig, mkUnqual )
-import UniqFM
+                 
+import RdrName   ( RdrName, nameRdrName, mkOrig, rdrNameOcc )
 import Unique    ( Unique, Uniquable(..), hasKey,
                    mkPreludeMiscIdUnique, mkPreludeDataConUnique,
                    mkPreludeTyConUnique, mkPreludeClassUnique,
-                   mkTupleTyConUnique
+                   mkTupleTyConUnique, isTupleKey
                  ) 
-import BasicTypes ( Boxity(..), Arity )
-import UniqFM    ( UniqFM, listToUFM )
-import Name      ( Name, mkInternalName, mkKnownKeyExternalName, nameRdrName )
-import RdrName    ( rdrNameOcc )
-import SrcLoc     ( builtinSrcLoc, noSrcLoc )
+import BasicTypes ( Boxity(..) )
+import Name      ( Name, mkInternalName, mkKnownKeyExternalName, mkWiredInName, nameUnique )
+import SrcLoc     ( noSrcLoc )
 import Util      ( nOfThem )
 import Panic     ( panic )
 import FastString
+
+
 \end{code}
 
 
@@ -74,7 +87,7 @@ itName uniq = mkInternalName uniq (mkOccFS varName FSLIT("it")) noSrcLoc
 -- mkUnboundName makes a place-holder Name; it shouldn't be looked at except possibly
 -- during compiler debugging.
 mkUnboundName :: RdrName -> Name
-mkUnboundName rdr_name = mkInternalName unboundKey (rdrNameOcc rdr_name) builtinSrcLoc
+mkUnboundName rdr_name = mkInternalName unboundKey (rdrNameOcc rdr_name) noSrcLoc
 
 isUnboundName :: Name -> Bool
 isUnboundName name = name `hasKey` unboundKey
@@ -83,6 +96,25 @@ isUnboundName name = name `hasKey` unboundKey
 
 %************************************************************************
 %*                                                                     *
+\subsection{Built-in-syntax names
+%*                                                                     *
+%************************************************************************
+
+Built-in syntax names are parsed directly into Exact RdrNames.
+This predicate just identifies them. 
+
+\begin{code}
+isBuiltInSyntaxName :: Name -> Bool
+isBuiltInSyntaxName n
+  =  isTupleKey uniq
+  || uniq `elem` [listTyConKey, nilDataConKey, consDataConKey,
+                 funTyConKey, parrTyConKey]
+  where
+     uniq = nameUnique n
+\end{code}
+
+%************************************************************************
+%*                                                                     *
 \subsection{Known key Names}
 %*                                                                     *
 %************************************************************************
@@ -92,23 +124,18 @@ names with uniques.  These ones are the *non* wired-in ones.  The
 wired in ones are defined in TysWiredIn etc.
 
 \begin{code}
-knownKeyNames :: [Name]
-knownKeyNames
- =  [
-       -- Type constructors (synonyms especially)
+basicKnownKeyNames :: [Name]
+basicKnownKeyNames
+ =  [  -- Type constructors (synonyms especially)
        ioTyConName, ioDataConName,
-       runMainName,
+       runIOName,
        orderingTyConName,
        rationalTyConName,
        ratioDataConName,
        ratioTyConName,
        byteArrayTyConName,
        mutableByteArrayTyConName,
-       foreignObjTyConName,
-       foreignPtrTyConName,
        bcoPrimTyConName,
-       stablePtrTyConName,
-       stablePtrDataConName,
 
        --  Classes.  *Must* include:
        --      classes that are grabbed by key (e.g., eqClassKey)
@@ -120,102 +147,88 @@ knownKeyNames
        enumClassName,                  -- derivable
        monadClassName,
        functorClassName,
-       showClassName,                  -- derivable
        realClassName,                  -- numeric
        integralClassName,              -- numeric
        fractionalClassName,            -- numeric
        floatingClassName,              -- numeric
        realFracClassName,              -- numeric
        realFloatClassName,             -- numeric
-       readClassName,                  -- derivable
-       ixClassName,                    -- derivable (but it isn't Prelude.Ix; hmmm)
        cCallableClassName,             -- mentioned, ccallish
        cReturnableClassName,           -- mentioned, ccallish
-
-       -- ClassOps 
-       fromIntegerName,
-       negateName,
-       geName,
-       minusName,
-       enumFromName,
-       enumFromThenName,
-       enumFromToName,
-       enumFromThenToName,
-       fromEnumName,
-       toEnumName,
-       eqName,
-       thenMName,
-       bindMName,
-       returnMName,
-       failMName,
-       fromRationalName,
-
-        -- not class methods, but overloaded (for parallel arrays)
-       enumFromToPName,
-       enumFromThenToPName,
-
-       deRefStablePtrName,
+       dataClassName, 
+       typeableClassName,
+
+       -- Numeric stuff
+       negateName, minusName, 
+       fromRationalName, fromIntegerName, 
+       geName, eqName, 
+       
+       -- Enum stuff
+       enumFromName, enumFromThenName, 
+       enumFromThenToName, enumFromToName,
+       enumFromToPName, enumFromThenToPName,
+
+       -- Monad stuff
+       thenMName, bindMName, returnMName, failMName,
+       thenIOName, bindIOName, returnIOName, failIOName,
+
+       -- MonadRec stuff
+       mfixName,
+
+       -- Arrow stuff
+       arrAName, composeAName, firstAName,
+       appAName, choiceAName, loopAName,
+
+       -- Ix stuff
+       ixClassName, 
+
+       -- Show stuff
+       showClassName, 
+
+       -- Read stuff
+       readClassName, 
+       
+       -- Stable pointers
        newStablePtrName,
-       bindIOName,
-       thenIOName,
-       returnIOName,
-       failIOName,
 
        -- Strings and lists
-       mapName,
-       appendName,
-       unpackCStringName,
-       unpackCStringAppendName,
-       unpackCStringFoldrName,
-       unpackCStringUtf8Name,
+       unpackCStringName, unpackCStringAppendName,
+       unpackCStringFoldrName, unpackCStringUtf8Name,
 
        -- List operations
-       concatName,
-       filterName,
-       zipName,
-       foldrName,
-       buildName,
-       augmentName,
+       concatName, filterName,
+       zipName, foldrName, buildName, augmentName, appendName,
 
         -- Parallel array operations
-       nullPName,
-       lengthPName,
-       replicatePName,
-       mapPName,
-       filterPName,
-       zipPName,
-       crossPName,
-       indexPName,
-       toPName,
-       bpermutePName,
-       bpermuteDftPName,
-       indexOfPName,
+       nullPName, lengthPName, replicatePName, mapPName,
+       filterPName, zipPName, crossPName, indexPName,
+       toPName, bpermutePName, bpermuteDftPName, indexOfPName,
 
        -- FFI primitive types that are not wired-in.
-       int8TyConName,
-       int16TyConName,
-       int32TyConName,
-       int64TyConName,
-       word8TyConName,
-       word16TyConName,
-       word32TyConName,
-       word64TyConName,
+       stablePtrTyConName, ptrTyConName, funPtrTyConName, addrTyConName,
+       int8TyConName, int16TyConName, int32TyConName, int64TyConName,
+       word8TyConName, word16TyConName, word32TyConName, word64TyConName,
 
        -- Others
-       unsafeCoerceName,
-       otherwiseIdName,
-       plusIntegerName,
-       timesIntegerName,
-       eqStringName,
-       assertName,
-       runSTRepName,
-       printName,
-       splitName, fstName, sndName,    -- Used by splittery
-
-       -- Others (needed for flattening and not mentioned before)
-       andName,
-       orName
+       unsafeCoerceName, otherwiseIdName, 
+       plusIntegerName, timesIntegerName,
+       eqStringName, assertName, assertErrorName, runSTRepName,
+       printName, splitName, fstName, sndName,
+       errorName,
+
+       -- Booleans
+       andName, orName
+       
+       -- The Either type
+       , eitherTyConName, leftDataConName, rightDataConName
+
+       -- dotnet interop
+       , objectTyConName, marshalObjectName, unmarshalObjectName
+       , marshalStringName, unmarshalStringName, checkDotnetResName
     ]
+
+monadNames :: [Name]   -- The monad ops need by a HsDo
+monadNames = [returnMName, failMName, bindMName, thenMName]
 \end{code}
 
 
@@ -225,6 +238,8 @@ knownKeyNames
 %*                                                                     *
 %************************************************************************
 
+
+--MetaHaskell Extension Add a new module here
 \begin{code}
 pRELUDE_Name      = mkModuleName "Prelude"
 gHC_PRIM_Name     = mkModuleName "GHC.Prim"       -- Primitive types and values
@@ -236,13 +251,13 @@ pREL_NUM_Name     = mkModuleName "GHC.Num"
 pREL_LIST_Name    = mkModuleName "GHC.List"
 pREL_PARR_Name    = mkModuleName "GHC.PArr"
 pREL_TUP_Name     = mkModuleName "Data.Tuple"
+pREL_EITHER_Name  = mkModuleName "Data.Either"
 pREL_PACK_Name    = mkModuleName "GHC.Pack"
 pREL_CONC_Name    = mkModuleName "GHC.Conc"
 pREL_IO_BASE_Name = mkModuleName "GHC.IOBase"
 pREL_ST_Name     = mkModuleName "GHC.ST"
 pREL_ARR_Name     = mkModuleName "GHC.Arr"
 pREL_BYTEARR_Name = mkModuleName "PrelByteArr"
-fOREIGN_PTR_Name  = mkModuleName "Foreign.ForeignPtr"
 pREL_STABLE_Name  = mkModuleName "GHC.Stable"
 pREL_ADDR_Name    = mkModuleName "GHC.Addr"
 pREL_PTR_Name     = mkModuleName "GHC.Ptr"
@@ -251,6 +266,10 @@ pREL_REAL_Name    = mkModuleName "GHC.Real"
 pREL_FLOAT_Name   = mkModuleName "GHC.Float"
 pREL_TOP_HANDLER_Name = mkModuleName "GHC.TopHandler"
 sYSTEM_IO_Name   = mkModuleName "System.IO"
+dYNAMIC_Name     = mkModuleName "Data.Dynamic"
+tYPEABLE_Name    = mkModuleName "Data.Typeable"
+gENERICS_Name    = mkModuleName "Data.Generics"
+dOTNET_Name       = mkModuleName "GHC.Dotnet"
 
 rEAD_PREC_Name = mkModuleName "Text.ParserCombinators.ReadPrec"
 lEX_Name       = mkModuleName "Text.Read.Lex"
@@ -258,26 +277,35 @@ lEX_Name       = mkModuleName "Text.Read.Lex"
 mAIN_Name        = mkModuleName "Main"
 pREL_INT_Name    = mkModuleName "GHC.Int"
 pREL_WORD_Name   = mkModuleName "GHC.Word"
-
-fOREIGNOBJ_Name          = mkModuleName "ForeignObj"
+mONAD_FIX_Name   = mkModuleName "Control.Monad.Fix"
+aRROW_Name       = mkModuleName "Control.Arrow"
 aDDR_Name        = mkModuleName "Addr"
 
 gLA_EXTS_Name   = mkModuleName "GHC.Exts"
 
-gHC_PRIM       = mkPrelModule gHC_PRIM_Name
-pREL_BASE      = mkPrelModule pREL_BASE_Name
-pREL_ADDR      = mkPrelModule pREL_ADDR_Name
-pREL_PTR       = mkPrelModule pREL_PTR_Name
-pREL_STABLE    = mkPrelModule pREL_STABLE_Name
-pREL_IO_BASE   = mkPrelModule pREL_IO_BASE_Name
-pREL_PACK      = mkPrelModule pREL_PACK_Name
-pREL_ERR       = mkPrelModule pREL_ERR_Name
-pREL_NUM       = mkPrelModule pREL_NUM_Name
-pREL_REAL      = mkPrelModule pREL_REAL_Name
-pREL_FLOAT     = mkPrelModule pREL_FLOAT_Name
-pRELUDE                = mkPrelModule pRELUDE_Name
-
-iNTERACTIVE     = mkHomeModule (mkModuleName "$Interactive")
+gHC_PRIM       = mkBasePkgModule gHC_PRIM_Name
+pREL_BASE      = mkBasePkgModule pREL_BASE_Name
+pREL_ADDR      = mkBasePkgModule pREL_ADDR_Name
+pREL_PTR       = mkBasePkgModule pREL_PTR_Name
+pREL_STABLE    = mkBasePkgModule pREL_STABLE_Name
+pREL_IO_BASE   = mkBasePkgModule pREL_IO_BASE_Name
+pREL_PACK      = mkBasePkgModule pREL_PACK_Name
+pREL_ERR       = mkBasePkgModule pREL_ERR_Name
+pREL_NUM       = mkBasePkgModule pREL_NUM_Name
+pREL_REAL      = mkBasePkgModule pREL_REAL_Name
+pREL_FLOAT     = mkBasePkgModule pREL_FLOAT_Name
+pRELUDE                = mkBasePkgModule pRELUDE_Name
+
+-- MetaHaskell Extension  text2 from Meta/work/gen.hs
+mETA_META_Name   = mkModuleName "Language.Haskell.THSyntax"
+
+rOOT_MAIN_Name = mkModuleName ":Main"          -- Root module for initialisation 
+rOOT_MAIN      = mkHomeModule rOOT_MAIN_Name   
+       -- The ':xxx' makes a moudle name that the user can never
+       -- use himself.  The z-encoding for ':' is "ZC", so the z-encoded
+       -- module name still starts with a capital letter, which keeps
+       -- the z-encoded version consistent.
+iNTERACTIVE    = mkHomeModule (mkModuleName ":Interactive")
 \end{code}
 
 %************************************************************************
@@ -302,31 +330,142 @@ mkTupNameStr Unboxed 2 = (gHC_PRIM_Name, mkFastString "(#,#)")
 mkTupNameStr Unboxed 3 = (gHC_PRIM_Name, mkFastString "(#,,#)")
 mkTupNameStr Unboxed 4 = (gHC_PRIM_Name, mkFastString "(#,,,#)")
 mkTupNameStr Unboxed n = (gHC_PRIM_Name, mkFastString ("(#" ++ nOfThem (n-1) ',' ++ "#)"))
-
-mkTupConRdrName :: NameSpace -> Boxity -> Arity -> RdrName 
-mkTupConRdrName space boxity arity   = case mkTupNameStr boxity arity of
-                                         (mod, occ) -> mkOrig space mod occ
 \end{code}
 
 
 %************************************************************************
 %*                                                                     *
-\subsection{Unqualified RdrNames}
+                       RdrNames
 %*                                                                     *
 %************************************************************************
 
 \begin{code}
-main_RDR_Unqual :: RdrName
-main_RDR_Unqual = mkUnqual varName FSLIT("main")
--- Don't get a RdrName from PrelNames.mainName, because nameRdrName
--- gets an Orig RdrName, and we want a Qual or Unqual one.  An Unqual
--- one will do fine.
+eq_RDR                         = nameRdrName eqName
+ge_RDR                         = nameRdrName geName
+ne_RDR                         = varQual_RDR  pREL_BASE_Name FSLIT("/=")
+le_RDR                         = varQual_RDR  pREL_BASE_Name FSLIT("<=") 
+gt_RDR                         = varQual_RDR  pREL_BASE_Name FSLIT(">")  
+compare_RDR            = varQual_RDR  pREL_BASE_Name FSLIT("compare") 
+ltTag_RDR              = dataQual_RDR pREL_BASE_Name FSLIT("LT") 
+eqTag_RDR              = dataQual_RDR pREL_BASE_Name FSLIT("EQ")
+gtTag_RDR              = dataQual_RDR pREL_BASE_Name FSLIT("GT")
+
+eqClass_RDR            = nameRdrName eqClassName
+numClass_RDR           = nameRdrName numClassName
+ordClass_RDR           = nameRdrName ordClassName
+enumClass_RDR          = nameRdrName enumClassName
+monadClass_RDR         = nameRdrName monadClassName
+cCallableClass_RDR     = nameRdrName cCallableClassName
+cReturnableClass_RDR   = nameRdrName cReturnableClassName
+
+map_RDR                = varQual_RDR pREL_BASE_Name FSLIT("map")
+append_RDR             = varQual_RDR pREL_BASE_Name FSLIT("++")
+
+foldr_RDR              = nameRdrName foldrName
+build_RDR              = nameRdrName buildName
+returnM_RDR            = nameRdrName returnMName
+bindM_RDR              = nameRdrName bindMName
+failM_RDR              = nameRdrName failMName
+
+false_RDR              = nameRdrName falseDataConName
+true_RDR               = nameRdrName trueDataConName
+and_RDR                        = nameRdrName andName
+
+left_RDR               = nameRdrName leftDataConName
+right_RDR              = nameRdrName rightDataConName
+
+error_RDR              = nameRdrName errorName
+
+fromEnum_RDR           = varQual_RDR pREL_ENUM_Name FSLIT("fromEnum")
+toEnum_RDR             = varQual_RDR pREL_ENUM_Name FSLIT("toEnum")
+mkInt_RDR              = nameRdrName intDataConName
+
+enumFrom_RDR           = nameRdrName enumFromName
+enumFromTo_RDR                 = nameRdrName enumFromToName
+enumFromThen_RDR       = nameRdrName enumFromThenName
+enumFromThenTo_RDR     = nameRdrName enumFromThenToName
+
+ratioDataCon_RDR       = nameRdrName ratioDataConName
+plusInteger_RDR                = nameRdrName plusIntegerName
+timesInteger_RDR       = nameRdrName timesIntegerName
+
+ioDataCon_RDR          = nameRdrName ioDataConName
+
+eqString_RDR           = nameRdrName eqStringName
+unpackCString_RDR              = nameRdrName unpackCStringName
+unpackCStringFoldr_RDR         = nameRdrName unpackCStringFoldrName
+unpackCStringUtf8_RDR          = nameRdrName unpackCStringUtf8Name
+
+newStablePtr_RDR       = nameRdrName newStablePtrName
+addrDataCon_RDR                = dataQual_RDR aDDR_Name FSLIT("A#")
+
+bindIO_RDR             = nameRdrName bindIOName
+returnIO_RDR           = nameRdrName returnIOName
+
+fromInteger_RDR                = nameRdrName fromIntegerName
+fromRational_RDR       = nameRdrName fromRationalName
+minus_RDR              = nameRdrName minusName
+times_RDR              = varQual_RDR  pREL_NUM_Name FSLIT("*")
+plus_RDR                = varQual_RDR pREL_NUM_Name FSLIT("+")
+
+compose_RDR            = varQual_RDR pREL_BASE_Name FSLIT(".")
+
+not_RDR                = varQual_RDR pREL_BASE_Name FSLIT("not")
+getTag_RDR             = varQual_RDR pREL_BASE_Name FSLIT("getTag")
+succ_RDR               = varQual_RDR pREL_ENUM_Name FSLIT("succ")
+pred_RDR                = varQual_RDR pREL_ENUM_Name FSLIT("pred")
+minBound_RDR            = varQual_RDR pREL_ENUM_Name FSLIT("minBound")
+maxBound_RDR            = varQual_RDR pREL_ENUM_Name FSLIT("maxBound")
+range_RDR               = varQual_RDR pREL_ARR_Name FSLIT("range")
+inRange_RDR             = varQual_RDR pREL_ARR_Name FSLIT("inRange")
+index_RDR              = varQual_RDR pREL_ARR_Name FSLIT("index")
+
+readList_RDR            = varQual_RDR pREL_READ_Name FSLIT("readList")
+readListDefault_RDR     = varQual_RDR pREL_READ_Name FSLIT("readListDefault")
+readListPrec_RDR        = varQual_RDR pREL_READ_Name FSLIT("readListPrec")
+readListPrecDefault_RDR = varQual_RDR pREL_READ_Name FSLIT("readListPrecDefault")
+readPrec_RDR            = varQual_RDR pREL_READ_Name FSLIT("readPrec")
+parens_RDR              = varQual_RDR pREL_READ_Name FSLIT("parens")
+choose_RDR              = varQual_RDR pREL_READ_Name FSLIT("choose")
+lexP_RDR                = varQual_RDR pREL_READ_Name FSLIT("lexP")
+
+punc_RDR                = dataQual_RDR lEX_Name FSLIT("Punc")
+ident_RDR               = dataQual_RDR lEX_Name FSLIT("Ident")
+symbol_RDR              = dataQual_RDR lEX_Name FSLIT("Symbol")
+
+step_RDR                = varQual_RDR  rEAD_PREC_Name FSLIT("step")
+alt_RDR                 = varQual_RDR  rEAD_PREC_Name FSLIT("+++") 
+reset_RDR               = varQual_RDR  rEAD_PREC_Name FSLIT("reset")
+prec_RDR                = varQual_RDR  rEAD_PREC_Name FSLIT("prec")
+
+showList_RDR            = varQual_RDR pREL_SHOW_Name FSLIT("showList")
+showList___RDR          = varQual_RDR pREL_SHOW_Name FSLIT("showList__")
+showsPrec_RDR           = varQual_RDR pREL_SHOW_Name FSLIT("showsPrec") 
+showString_RDR          = varQual_RDR pREL_SHOW_Name FSLIT("showString")
+showSpace_RDR           = varQual_RDR pREL_SHOW_Name FSLIT("showSpace") 
+showParen_RDR           = varQual_RDR pREL_SHOW_Name FSLIT("showParen") 
+
+typeOf_RDR     = varQual_RDR tYPEABLE_Name FSLIT("typeOf")
+mkTypeRep_RDR  = varQual_RDR tYPEABLE_Name FSLIT("mkAppTy")
+mkTyConRep_RDR = varQual_RDR tYPEABLE_Name FSLIT("mkTyCon")
+
+constr_RDR  = dataQual_RDR gENERICS_Name FSLIT("Constr")
+gfoldl_RDR  = varQual_RDR gENERICS_Name FSLIT("gfoldl")
+gfoldr_RDR  = varQual_RDR gENERICS_Name FSLIT("gfoldr")
+gunfold_RDR = varQual_RDR gENERICS_Name FSLIT("gunfold")
+gmapT_RDR   = varQual_RDR gENERICS_Name FSLIT("gmapT")
+gmapQ_RDR   = varQual_RDR gENERICS_Name FSLIT("gmapQ")
+gmapM_RDR   = varQual_RDR gENERICS_Name FSLIT("gmapM")
+conOf_RDR   = varQual_RDR gENERICS_Name FSLIT("conOf")
+consOf_RDR  = varQual_RDR gENERICS_Name FSLIT("consOf")
+
+undefined_RDR = varQual_RDR pREL_ERR_Name FSLIT("undefined")
 \end{code}
 
 
 %************************************************************************
 %*                                                                     *
-\subsection{Commonly-used RdrNames}
+\subsection{Known-key names}
 %*                                                                     *
 %************************************************************************
 
@@ -334,19 +473,20 @@ Many of these Names are not really "built in", but some parts of the
 compiler (notably the deriving mechanism) need to mention their names,
 and it's convenient to write them all down in one place.
 
+--MetaHaskell Extension  add the constrs and the lower case case
+-- guys as well (perhaps) e.g. see  trueDataConName    below
+
+
 \begin{code}
-dollarMainName = varQual mAIN_Name FSLIT("$main") dollarMainKey
-runMainName    = varQual pREL_TOP_HANDLER_Name FSLIT("runMain") runMainKey
+rootMainName = varQual rOOT_MAIN_Name FSLIT("main") rootMainKey
+runIOName    = varQual pREL_TOP_HANDLER_Name FSLIT("runIO") runMainKey
 
 -- Stuff from GHC.Prim
-usOnceTyConName  = kindQual FSLIT(".") usOnceTyConKey
-usManyTyConName  = kindQual FSLIT("!") usManyTyConKey
 superKindName    = kindQual FSLIT("KX") kindConKey
 superBoxityName  = kindQual FSLIT("BX") boxityConKey
 liftedConName    = kindQual FSLIT("*") liftedConKey
 unliftedConName  = kindQual FSLIT("#") unliftedConKey
 openKindConName  = kindQual FSLIT("?") anyBoxConKey
-usageKindConName = kindQual FSLIT("$") usageConKey
 typeConName     = kindQual FSLIT("Type") typeConKey
 
 funTyConName                 = tcQual  gHC_PRIM_Name FSLIT("(->)")  funTyConKey
@@ -377,56 +517,50 @@ threadIdPrimTyConName           = tcQual  gHC_PRIM_Name FSLIT("ThreadId#") threadI
 cCallableClassName           = clsQual gHC_PRIM_Name FSLIT("CCallable") cCallableClassKey
 cReturnableClassName         = clsQual gHC_PRIM_Name FSLIT("CReturnable") cReturnableClassKey
 
+unsafeCoerceName = wVarQual gHC_PRIM_Name FSLIT("unsafeCoerce#") unsafeCoerceIdKey 
+nullAddrName     = wVarQual gHC_PRIM_Name FSLIT("nullAddr#")   nullAddrIdKey
+seqName                 = wVarQual gHC_PRIM_Name FSLIT("seq")          seqIdKey
+realWorldName   = wVarQual gHC_PRIM_Name FSLIT("realWorld#")   realWorldPrimIdKey
+
 -- PrelBase data types and constructors
-charTyConName    = tcQual   pREL_BASE_Name FSLIT("Char") charTyConKey
-charDataConName   = dataQual pREL_BASE_Name FSLIT("C#") charDataConKey
-intTyConName     = tcQual   pREL_BASE_Name FSLIT("Int") intTyConKey
-intDataConName   = dataQual pREL_BASE_Name FSLIT("I#") intDataConKey
+charTyConName    = wTcQual   pREL_BASE_Name FSLIT("Char") charTyConKey
+charDataConName   = wDataQual pREL_BASE_Name FSLIT("C#") charDataConKey
+intTyConName     = wTcQual   pREL_BASE_Name FSLIT("Int") intTyConKey
+intDataConName   = wDataQual pREL_BASE_Name FSLIT("I#") intDataConKey
 orderingTyConName = tcQual   pREL_BASE_Name FSLIT("Ordering") orderingTyConKey
-boolTyConName    = tcQual   pREL_BASE_Name FSLIT("Bool") boolTyConKey
-falseDataConName  = dataQual pREL_BASE_Name FSLIT("False") falseDataConKey
-trueDataConName          = dataQual pREL_BASE_Name FSLIT("True") trueDataConKey
-listTyConName    = tcQual   pREL_BASE_Name FSLIT("[]") listTyConKey
-nilDataConName           = dataQual pREL_BASE_Name FSLIT("[]") nilDataConKey
-consDataConName          = dataQual pREL_BASE_Name FSLIT(":") consDataConKey
+boolTyConName    = wTcQual   pREL_BASE_Name FSLIT("Bool") boolTyConKey
+falseDataConName  = wDataQual pREL_BASE_Name FSLIT("False") falseDataConKey
+trueDataConName          = wDataQual pREL_BASE_Name FSLIT("True") trueDataConKey
+listTyConName    = wTcQual   pREL_BASE_Name FSLIT("[]") listTyConKey
+nilDataConName           = wDataQual pREL_BASE_Name FSLIT("[]") nilDataConKey
+consDataConName          = wDataQual pREL_BASE_Name FSLIT(":") consDataConKey
+eqName           = varQual  pREL_BASE_Name FSLIT("==") eqClassOpKey
+geName           = varQual  pREL_BASE_Name FSLIT(">=") geClassOpKey
 
--- PrelTup
-fstName                  = varQual pREL_TUP_Name FSLIT("fst") fstIdKey
-sndName                  = varQual pREL_TUP_Name FSLIT("snd") sndIdKey
+eitherTyConName          = tcQual   pREL_EITHER_Name FSLIT("Either") eitherTyConKey
+leftDataConName   = dataQual pREL_EITHER_Name FSLIT("Left")   leftDataConKey
+rightDataConName  = dataQual pREL_EITHER_Name FSLIT("Right")  rightDataConKey
 
 -- Generics
 crossTyConName     = tcQual   pREL_BASE_Name FSLIT(":*:") crossTyConKey
 crossDataConName   = dataQual pREL_BASE_Name FSLIT(":*:") crossDataConKey
-plusTyConName      = tcQual   pREL_BASE_Name FSLIT(":+:") plusTyConKey
-inlDataConName     = dataQual pREL_BASE_Name FSLIT("Inl") inlDataConKey
-inrDataConName     = dataQual pREL_BASE_Name FSLIT("Inr") inrDataConKey
-genUnitTyConName   = tcQual   pREL_BASE_Name FSLIT("Unit") genUnitTyConKey
-genUnitDataConName = dataQual pREL_BASE_Name FSLIT("Unit") genUnitDataConKey
-
--- Random PrelBase functions
-unsafeCoerceName  = varQual pREL_BASE_Name FSLIT("unsafeCoerce") 
-                                                            unsafeCoerceIdKey
-otherwiseIdName   = varQual pREL_BASE_Name FSLIT("otherwise") otherwiseIdKey
-appendName       = varQual pREL_BASE_Name FSLIT("++")       appendIdKey
-foldrName        = varQual pREL_BASE_Name FSLIT("foldr")     foldrIdKey
-mapName                  = varQual pREL_BASE_Name FSLIT("map")      mapIdKey
-buildName        = varQual pREL_BASE_Name FSLIT("build")     buildIdKey
-augmentName      = varQual pREL_BASE_Name FSLIT("augment")   augmentIdKey
-eqStringName     = varQual pREL_BASE_Name FSLIT("eqString")  eqStringIdKey
-andName                  = varQual pREL_BASE_Name FSLIT("&&")       andIdKey
-orName           = varQual pREL_BASE_Name FSLIT("||")       orIdKey
+plusTyConName      = wTcQual   pREL_BASE_Name FSLIT(":+:") plusTyConKey
+inlDataConName     = wDataQual pREL_BASE_Name FSLIT("Inl") inlDataConKey
+inrDataConName     = wDataQual pREL_BASE_Name FSLIT("Inr") inrDataConKey
+genUnitTyConName   = wTcQual   pREL_BASE_Name FSLIT("Unit") genUnitTyConKey
+genUnitDataConName = wDataQual pREL_BASE_Name FSLIT("Unit") genUnitDataConKey
 
--- Strings
+-- Base strings Strings
 unpackCStringName       = varQual pREL_BASE_Name FSLIT("unpackCString#") unpackCStringIdKey
 unpackCStringAppendName = varQual pREL_BASE_Name FSLIT("unpackAppendCString#") unpackCStringAppendIdKey
 unpackCStringFoldrName  = varQual pREL_BASE_Name FSLIT("unpackFoldrCString#") unpackCStringFoldrIdKey
 unpackCStringUtf8Name   = varQual pREL_BASE_Name FSLIT("unpackCStringUtf8#") unpackCStringUtf8IdKey
+eqStringName           = varQual pREL_BASE_Name FSLIT("eqString")  eqStringIdKey
 
--- Classes Eq and Ord
+-- Base classes (Eq, Ord, Functor)
 eqClassName      = clsQual pREL_BASE_Name FSLIT("Eq") eqClassKey
+functorClassName  = clsQual pREL_BASE_Name FSLIT("Functor") functorClassKey
 ordClassName     = clsQual pREL_BASE_Name FSLIT("Ord") ordClassKey
-eqName           = varQual  pREL_BASE_Name FSLIT("==") eqClassOpKey
-geName           = varQual  pREL_BASE_Name FSLIT(">=") geClassOpKey
 
 -- Class Monad
 monadClassName    = clsQual pREL_BASE_Name FSLIT("Monad") monadClassKey
@@ -435,14 +569,21 @@ bindMName    = varQual pREL_BASE_Name FSLIT(">>=") bindMClassOpKey
 returnMName       = varQual pREL_BASE_Name FSLIT("return") returnMClassOpKey
 failMName         = varQual pREL_BASE_Name FSLIT("fail") failMClassOpKey
 
--- Class Functor
-functorClassName  = clsQual pREL_BASE_Name FSLIT("Functor") functorClassKey
 
--- Class Show
-showClassName    = clsQual pREL_SHOW_Name FSLIT("Show") showClassKey
+-- Random PrelBase functions
+otherwiseIdName   = varQual pREL_BASE_Name FSLIT("otherwise") otherwiseIdKey
+foldrName        = varQual pREL_BASE_Name FSLIT("foldr")     foldrIdKey
+buildName        = varQual pREL_BASE_Name FSLIT("build")     buildIdKey
+augmentName      = varQual pREL_BASE_Name FSLIT("augment")   augmentIdKey
+appendName       = varQual pREL_BASE_Name FSLIT("++")        appendIdKey
+andName                  = varQual pREL_BASE_Name FSLIT("&&")        andIdKey
+orName           = varQual pREL_BASE_Name FSLIT("||")        orIdKey
+assertName        = varQual pREL_BASE_Name FSLIT("assert")    assertIdKey
+lazyIdName       = wVarQual pREL_BASE_Name FSLIT("lazy")     lazyIdKey
 
--- Class Read
-readClassName    = clsQual pREL_READ_Name FSLIT("Read") readClassKey
+-- PrelTup
+fstName                  = varQual pREL_TUP_Name FSLIT("fst") fstIdKey
+sndName                  = varQual pREL_TUP_Name FSLIT("snd") sndIdKey
 
 -- Module PrelNum
 numClassName     = clsQual pREL_NUM_Name FSLIT("Num") numClassKey
@@ -451,9 +592,9 @@ minusName     = varQual pREL_NUM_Name FSLIT("-") minusClassOpKey
 negateName       = varQual pREL_NUM_Name FSLIT("negate") negateClassOpKey
 plusIntegerName   = varQual pREL_NUM_Name FSLIT("plusInteger") plusIntegerIdKey
 timesIntegerName  = varQual pREL_NUM_Name FSLIT("timesInteger") timesIntegerIdKey
-integerTyConName  = tcQual  pREL_NUM_Name FSLIT("Integer") integerTyConKey
-smallIntegerDataConName = dataQual pREL_NUM_Name FSLIT("S#") smallIntegerDataConKey
-largeIntegerDataConName = dataQual pREL_NUM_Name FSLIT("J#") largeIntegerDataConKey
+integerTyConName  = wTcQual  pREL_NUM_Name FSLIT("Integer") integerTyConKey
+smallIntegerDataConName = wDataQual pREL_NUM_Name FSLIT("S#") smallIntegerDataConKey
+largeIntegerDataConName = wDataQual pREL_NUM_Name FSLIT("J#") largeIntegerDataConKey
 
 -- PrelReal types and classes
 rationalTyConName   = tcQual   pREL_REAL_Name  FSLIT("Rational") rationalTyConKey
@@ -466,30 +607,26 @@ fractionalClassName = clsQual  pREL_REAL_Name  FSLIT("Fractional") fractionalCla
 fromRationalName    = varQual  pREL_REAL_Name  FSLIT("fromRational") fromRationalClassOpKey
 
 -- PrelFloat classes
-floatTyConName    = tcQual   pREL_FLOAT_Name FSLIT("Float") floatTyConKey
-floatDataConName   = dataQual pREL_FLOAT_Name FSLIT("F#") floatDataConKey
-doubleTyConName    = tcQual   pREL_FLOAT_Name FSLIT("Double") doubleTyConKey
-doubleDataConName  = dataQual pREL_FLOAT_Name FSLIT("D#") doubleDataConKey
+floatTyConName    = wTcQual   pREL_FLOAT_Name FSLIT("Float") floatTyConKey
+floatDataConName   = wDataQual pREL_FLOAT_Name FSLIT("F#") floatDataConKey
+doubleTyConName    = wTcQual   pREL_FLOAT_Name FSLIT("Double") doubleTyConKey
+doubleDataConName  = wDataQual pREL_FLOAT_Name FSLIT("D#") doubleDataConKey
 floatingClassName  = clsQual  pREL_FLOAT_Name FSLIT("Floating") floatingClassKey
 realFloatClassName = clsQual  pREL_FLOAT_Name FSLIT("RealFloat") realFloatClassKey
 
 -- Class Ix
 ixClassName       = clsQual pREL_ARR_Name FSLIT("Ix") ixClassKey
 
--- Class Enum
+-- Class Typeable and Data
+typeableClassName = clsQual tYPEABLE_Name FSLIT("Typeable") typeableClassKey
+dataClassName     = clsQual gENERICS_Name FSLIT("Data")     dataClassKey
+
+-- Enum module (Enum, Bounded)
 enumClassName     = clsQual pREL_ENUM_Name FSLIT("Enum") enumClassKey
-toEnumName        = varQual pREL_ENUM_Name FSLIT("toEnum") toEnumClassOpKey
-fromEnumName      = varQual pREL_ENUM_Name FSLIT("fromEnum") fromEnumClassOpKey
 enumFromName      = varQual pREL_ENUM_Name FSLIT("enumFrom") enumFromClassOpKey
 enumFromToName    = varQual pREL_ENUM_Name FSLIT("enumFromTo") enumFromToClassOpKey
 enumFromThenName   = varQual pREL_ENUM_Name FSLIT("enumFromThen") enumFromThenClassOpKey
 enumFromThenToName = varQual pREL_ENUM_Name FSLIT("enumFromThenTo") enumFromThenToClassOpKey
-
--- Overloaded via Class Enum
-enumFromToPName           = varQual pREL_PARR_Name FSLIT("enumFromToP") enumFromToPIdKey
-enumFromThenToPName= varQual pREL_PARR_Name FSLIT("enumFromThenToP") enumFromThenToPIdKey
-
--- Class Bounded
 boundedClassName  = clsQual pREL_ENUM_Name FSLIT("Bounded") boundedClassKey
 
 -- List functions
@@ -497,22 +634,29 @@ concatName          = varQual pREL_LIST_Name FSLIT("concat") concatIdKey
 filterName       = varQual pREL_LIST_Name FSLIT("filter") filterIdKey
 zipName                  = varQual pREL_LIST_Name FSLIT("zip") zipIdKey
 
+-- Class Show
+showClassName    = clsQual pREL_SHOW_Name FSLIT("Show")       showClassKey
+
+-- Class Read
+readClassName     = clsQual pREL_READ_Name FSLIT("Read") readClassKey
+
 -- parallel array types and functions
-parrTyConName    = tcQual  pREL_PARR_Name FSLIT("[::]")       parrTyConKey
-parrDataConName   = dataQual pREL_PARR_Name FSLIT("PArr")      parrDataConKey
-nullPName        = varQual pREL_PARR_Name FSLIT("nullP")      nullPIdKey
-lengthPName      = varQual pREL_PARR_Name FSLIT("lengthP")    lengthPIdKey
-replicatePName   = varQual pREL_PARR_Name FSLIT("replicateP") replicatePIdKey
-mapPName         = varQual pREL_PARR_Name FSLIT("mapP")       mapPIdKey
-filterPName      = varQual pREL_PARR_Name FSLIT("filterP")    filterPIdKey
-zipPName         = varQual pREL_PARR_Name FSLIT("zipP")       zipPIdKey
-crossPName       = varQual pREL_PARR_Name FSLIT("crossP")     crossPIdKey
-indexPName       = varQual pREL_PARR_Name FSLIT("!:")        indexPIdKey
-toPName                  = varQual pREL_PARR_Name FSLIT("toP")       toPIdKey
-bpermutePName     = varQual pREL_PARR_Name FSLIT("bpermuteP")  bpermutePIdKey
-bpermuteDftPName  = varQual pREL_PARR_Name FSLIT("bpermuteDftP") 
-                                                             bpermuteDftPIdKey
-indexOfPName      = varQual pREL_PARR_Name FSLIT("indexOfP")   indexOfPIdKey
+enumFromToPName           = varQual pREL_PARR_Name FSLIT("enumFromToP") enumFromToPIdKey
+enumFromThenToPName= varQual pREL_PARR_Name FSLIT("enumFromThenToP") enumFromThenToPIdKey
+parrTyConName    = wTcQual  pREL_PARR_Name FSLIT("[::]")        parrTyConKey
+parrDataConName   = wDataQual pREL_PARR_Name FSLIT("PArr")              parrDataConKey
+nullPName        = varQual pREL_PARR_Name FSLIT("nullP")        nullPIdKey
+lengthPName      = varQual pREL_PARR_Name FSLIT("lengthP")      lengthPIdKey
+replicatePName   = varQual pREL_PARR_Name FSLIT("replicateP")   replicatePIdKey
+mapPName         = varQual pREL_PARR_Name FSLIT("mapP")         mapPIdKey
+filterPName      = varQual pREL_PARR_Name FSLIT("filterP")      filterPIdKey
+zipPName         = varQual pREL_PARR_Name FSLIT("zipP")         zipPIdKey
+crossPName       = varQual pREL_PARR_Name FSLIT("crossP")       crossPIdKey
+indexPName       = varQual pREL_PARR_Name FSLIT("!:")           indexPIdKey
+toPName                  = varQual pREL_PARR_Name FSLIT("toP")          toPIdKey
+bpermutePName     = varQual pREL_PARR_Name FSLIT("bpermuteP")    bpermutePIdKey
+bpermuteDftPName  = varQual pREL_PARR_Name FSLIT("bpermuteDftP") bpermuteDftPIdKey
+indexOfPName      = varQual pREL_PARR_Name FSLIT("indexOfP")     indexOfPIdKey
 
 -- IOBase things
 ioTyConName      = tcQual   pREL_IO_BASE_Name FSLIT("IO") ioTyConKey
@@ -531,179 +675,66 @@ int16TyConName    = tcQual pREL_INT_Name  FSLIT("Int16") int16TyConKey
 int32TyConName    = tcQual pREL_INT_Name  FSLIT("Int32") int32TyConKey
 int64TyConName    = tcQual pREL_INT_Name  FSLIT("Int64") int64TyConKey
 
-word8TyConName    = tcQual pREL_WORD_Name FSLIT("Word8")  word8TyConKey
-word16TyConName   = tcQual pREL_WORD_Name FSLIT("Word16") word16TyConKey
-word32TyConName   = tcQual pREL_WORD_Name FSLIT("Word32") word32TyConKey
-word64TyConName   = tcQual pREL_WORD_Name FSLIT("Word64") word64TyConKey
-
-wordTyConName     = tcQual   pREL_WORD_Name FSLIT("Word")   wordTyConKey
-wordDataConName   = dataQual pREL_WORD_Name FSLIT("W#")     wordDataConKey
+-- Word module
+word8TyConName    = tcQual   pREL_WORD_Name FSLIT("Word8")  word8TyConKey
+word16TyConName   = tcQual   pREL_WORD_Name FSLIT("Word16") word16TyConKey
+word32TyConName   = tcQual   pREL_WORD_Name FSLIT("Word32") word32TyConKey
+word64TyConName   = tcQual   pREL_WORD_Name FSLIT("Word64") word64TyConKey
+wordTyConName     = wTcQual   pREL_WORD_Name FSLIT("Word")   wordTyConKey
+wordDataConName   = wDataQual pREL_WORD_Name FSLIT("W#")     wordDataConKey
 
+-- Addr module
 addrTyConName    = tcQual   aDDR_Name FSLIT("Addr") addrTyConKey
-addrDataConName   = dataQual aDDR_Name FSLIT("A#") addrDataConKey
 
+-- PrelPtr module
 ptrTyConName     = tcQual   pREL_PTR_Name FSLIT("Ptr") ptrTyConKey
-ptrDataConName    = dataQual pREL_PTR_Name FSLIT("Ptr") ptrDataConKey
-
 funPtrTyConName          = tcQual   pREL_PTR_Name FSLIT("FunPtr") funPtrTyConKey
-funPtrDataConName = dataQual pREL_PTR_Name FSLIT("FunPtr") funPtrDataConKey
 
 -- Byte array types
 byteArrayTyConName       = tcQual pREL_BYTEARR_Name  FSLIT("ByteArray") byteArrayTyConKey
 mutableByteArrayTyConName = tcQual pREL_BYTEARR_Name  FSLIT("MutableByteArray") mutableByteArrayTyConKey
 
 -- Foreign objects and weak pointers
-foreignObjTyConName   = tcQual   fOREIGNOBJ_Name FSLIT("ForeignObj") foreignObjTyConKey
-foreignObjDataConName = dataQual fOREIGNOBJ_Name FSLIT("ForeignObj") foreignObjDataConKey
-foreignPtrTyConName   = tcQual   fOREIGN_PTR_Name FSLIT("ForeignPtr") foreignPtrTyConKey
-foreignPtrDataConName = dataQual fOREIGN_PTR_Name FSLIT("ForeignPtr") foreignPtrDataConKey
 stablePtrTyConName    = tcQual   pREL_STABLE_Name FSLIT("StablePtr") stablePtrTyConKey
-stablePtrDataConName  = dataQual pREL_STABLE_Name FSLIT("StablePtr") stablePtrDataConKey
-deRefStablePtrName    = varQual  pREL_STABLE_Name FSLIT("deRefStablePtr") deRefStablePtrIdKey
 newStablePtrName      = varQual  pREL_STABLE_Name FSLIT("newStablePtr") newStablePtrIdKey
 
-assertName         = varQual gHC_PRIM_Name FSLIT("assert") assertIdKey
-getTagName        = varQual gHC_PRIM_Name FSLIT("getTag#") getTagIdKey
-
-errorName         = varQual pREL_ERR_Name FSLIT("error") errorIdKey
+-- Error module
+errorName               = wVarQual pREL_ERR_Name FSLIT("error")                errorIdKey
+assertErrorName                 = wVarQual pREL_ERR_Name FSLIT("assertError")          assertErrorIdKey
+recSelErrorName                 = wVarQual pREL_ERR_Name FSLIT("recSelError")          recSelErrorIdKey
+runtimeErrorName        = wVarQual pREL_ERR_Name FSLIT("runtimeError")         runtimeErrorIdKey
+irrefutPatErrorName     = wVarQual pREL_ERR_Name FSLIT("irrefutPatError")      irrefutPatErrorIdKey
+recConErrorName                 = wVarQual pREL_ERR_Name FSLIT("recConError")          recConErrorIdKey
+patErrorName            = wVarQual pREL_ERR_Name FSLIT("patError")             patErrorIdKey
+noMethodBindingErrorName = wVarQual pREL_ERR_Name FSLIT("noMethodBindingError") noMethodBindingErrorIdKey
+nonExhaustiveGuardsErrorName 
+  = wVarQual pREL_ERR_Name FSLIT("nonExhaustiveGuardsError") nonExhaustiveGuardsErrorIdKey
+
+-- PrelST module
 runSTRepName      = varQual pREL_ST_Name  FSLIT("runSTRep") runSTRepIdKey
 
 -- The "split" Id for splittable implicit parameters
 splitName          = varQual gLA_EXTS_Name FSLIT("split") splitIdKey
-\end{code}
-
-%************************************************************************
-%*                                                                     *
-\subsection{Known names}
-%*                                                                     *
-%************************************************************************
-
-The following names are known to the compiler, but they don't require
-pre-assigned keys.  Mostly these names are used in generating deriving
-code, which is passed through the renamer anyway.
 
-       THEY ARE ALL ORIGINAL NAMES, HOWEVER
+-- Recursive-do notation
+mfixName          = varQual mONAD_FIX_Name FSLIT("mfix") mfixIdKey
+
+-- Arrow notation
+arrAName          = varQual aRROW_Name FSLIT("arr")    arrAIdKey
+composeAName      = varQual aRROW_Name FSLIT(">>>")    composeAIdKey
+firstAName        = varQual aRROW_Name FSLIT("first")  firstAIdKey
+appAName          = varQual aRROW_Name FSLIT("app")    appAIdKey
+choiceAName       = varQual aRROW_Name FSLIT("|||")    choiceAIdKey
+loopAName         = varQual aRROW_Name FSLIT("loop")   loopAIdKey
+
+-- dotnet interop
+objectTyConName            = wTcQual  dOTNET_Name FSLIT("Object") objectTyConKey
+unmarshalObjectName = varQual  dOTNET_Name FSLIT("unmarshalObject") unmarshalObjectIdKey
+marshalObjectName   = varQual  dOTNET_Name FSLIT("marshalObject") marshalObjectIdKey
+marshalStringName   = varQual  dOTNET_Name FSLIT("marshalString") marshalStringIdKey
+unmarshalStringName = varQual  dOTNET_Name FSLIT("unmarshalString") unmarshalStringIdKey
+checkDotnetResName  = varQual  dOTNET_Name FSLIT("checkResult")     checkDotnetResNameIdKey
 
-\begin{code}
--- Lists and tuples
-tupleCon_RDR, tupleTyCon_RDR           :: Int -> RdrName
-ubxTupleCon_RDR, ubxTupleTyCon_RDR     :: Int -> RdrName
-
-tupleCon_RDR      = mkTupConRdrName dataName Boxed  
-tupleTyCon_RDR    = mkTupConRdrName tcName   Boxed  
-ubxTupleCon_RDR   = mkTupConRdrName dataName Unboxed
-ubxTupleTyCon_RDR = mkTupConRdrName tcName   Unboxed
-
-unitCon_RDR      = dataQual_RDR pREL_BASE_Name FSLIT("()")
-unitTyCon_RDR    = tcQual_RDR   pREL_BASE_Name FSLIT("()")
-
-and_RDR                   = varQual_RDR  pREL_BASE_Name FSLIT("&&")
-not_RDR                   = varQual_RDR  pREL_BASE_Name FSLIT("not")
-compose_RDR       = varQual_RDR  pREL_BASE_Name FSLIT(".")
-ne_RDR            = varQual_RDR  pREL_BASE_Name FSLIT("/=")
-le_RDR            = varQual_RDR  pREL_BASE_Name FSLIT("<=")
-lt_RDR            = varQual_RDR  pREL_BASE_Name FSLIT("<")
-gt_RDR            = varQual_RDR  pREL_BASE_Name FSLIT(">")
-ltTag_RDR                 = dataQual_RDR pREL_BASE_Name FSLIT("LT")
-eqTag_RDR                 = dataQual_RDR pREL_BASE_Name FSLIT("EQ")
-gtTag_RDR                 = dataQual_RDR pREL_BASE_Name FSLIT("GT")
-max_RDR                   = varQual_RDR  pREL_BASE_Name FSLIT("max")
-min_RDR                   = varQual_RDR  pREL_BASE_Name FSLIT("min")
-compare_RDR       = varQual_RDR  pREL_BASE_Name FSLIT("compare")
-showList_RDR      = varQual_RDR  pREL_SHOW_Name FSLIT("showList")
-showList___RDR     = varQual_RDR  pREL_SHOW_Name FSLIT("showList__")
-showsPrec_RDR     = varQual_RDR  pREL_SHOW_Name FSLIT("showsPrec")
-showSpace_RDR     = varQual_RDR  pREL_SHOW_Name FSLIT("showSpace")
-showString_RDR    = varQual_RDR  pREL_SHOW_Name FSLIT("showString")
-showParen_RDR     = varQual_RDR  pREL_SHOW_Name FSLIT("showParen")
-
-readsPrec_RDR     = varQual_RDR  pREL_READ_Name FSLIT("readsPrec")
-readPrec_RDR      = varQual_RDR  pREL_READ_Name FSLIT("readPrec")
-readListPrec_RDR   = varQual_RDR  pREL_READ_Name FSLIT("readListPrec")
-readList_RDR      = varQual_RDR  pREL_READ_Name FSLIT("readList")
-
-readListDefault_RDR     = varQual_RDR  pREL_READ_Name FSLIT("readListDefault")
-readListPrecDefault_RDR = varQual_RDR  pREL_READ_Name FSLIT("readListPrecDefault")
-parens_RDR             = varQual_RDR  pREL_READ_Name FSLIT("parens")
-choose_RDR             = varQual_RDR  pREL_READ_Name FSLIT("choose")
-lexP_RDR               = varQual_RDR  pREL_READ_Name FSLIT("lexP")
-
--- Module ReadPrec
-step_RDR          = varQual_RDR  rEAD_PREC_Name FSLIT("step")
-reset_RDR         = varQual_RDR  rEAD_PREC_Name FSLIT("reset")
-alt_RDR                   = varQual_RDR  rEAD_PREC_Name FSLIT("+++")
-prec_RDR          = varQual_RDR  rEAD_PREC_Name FSLIT("prec")
-
--- Module Lex
-symbol_RDR        = dataQual_RDR  lEX_Name FSLIT("Symbol")
-ident_RDR         = dataQual_RDR  lEX_Name FSLIT("Ident")
-punc_RDR          = dataQual_RDR  lEX_Name FSLIT("Punc")
-
-times_RDR         = varQual_RDR  pREL_NUM_Name FSLIT("*")
-plus_RDR          = varQual_RDR  pREL_NUM_Name FSLIT("+")
-negate_RDR        = varQual_RDR  pREL_NUM_Name FSLIT("negate")
-range_RDR         = varQual_RDR  pREL_ARR_Name FSLIT("range")
-index_RDR         = varQual_RDR  pREL_ARR_Name FSLIT("index")
-inRange_RDR       = varQual_RDR  pREL_ARR_Name FSLIT("inRange")
-succ_RDR          = varQual_RDR  pREL_ENUM_Name FSLIT("succ")
-pred_RDR          = varQual_RDR  pREL_ENUM_Name FSLIT("pred")
-minBound_RDR      = varQual_RDR  pREL_ENUM_Name FSLIT("minBound")
-maxBound_RDR      = varQual_RDR  pREL_ENUM_Name FSLIT("maxBound")
-assertErr_RDR      = varQual_RDR  pREL_ERR_Name FSLIT("assertError")
-\end{code}
-
-These RDR names also have known keys, so we need to get back the RDR names to
-populate the occurrence list above.
-
-\begin{code}
-funTyCon_RDR           = nameRdrName funTyConName
-nilCon_RDR             = nameRdrName nilDataConName
-listTyCon_RDR          = nameRdrName listTyConName
-parrTyCon_RDR          = nameRdrName parrTyConName
-ioTyCon_RDR            = nameRdrName ioTyConName
-intTyCon_RDR           = nameRdrName intTyConName
-eq_RDR                         = nameRdrName eqName
-ge_RDR                         = nameRdrName geName
-numClass_RDR           = nameRdrName numClassName
-ordClass_RDR           = nameRdrName ordClassName
-map_RDR                = nameRdrName mapName
-append_RDR             = nameRdrName appendName
-foldr_RDR              = nameRdrName foldrName
-build_RDR              = nameRdrName buildName
-enumFromTo_RDR                 = nameRdrName enumFromToName
-returnM_RDR            = nameRdrName returnMName
-bindM_RDR              = nameRdrName bindMName
-failM_RDR              = nameRdrName failMName
-false_RDR              = nameRdrName falseDataConName
-true_RDR               = nameRdrName trueDataConName
-error_RDR              = nameRdrName errorName
-getTag_RDR             = nameRdrName getTagName
-fromEnum_RDR           = nameRdrName fromEnumName
-toEnum_RDR             = nameRdrName toEnumName
-enumFrom_RDR           = nameRdrName enumFromName
-mkInt_RDR              = nameRdrName intDataConName
-enumFromThen_RDR       = nameRdrName enumFromThenName
-enumFromThenTo_RDR     = nameRdrName enumFromThenToName
-ratioDataCon_RDR       = nameRdrName ratioDataConName
-plusInteger_RDR                = nameRdrName plusIntegerName
-timesInteger_RDR       = nameRdrName timesIntegerName
-enumClass_RDR          = nameRdrName enumClassName
-monadClass_RDR         = nameRdrName monadClassName
-ioDataCon_RDR          = nameRdrName ioDataConName
-cCallableClass_RDR     = nameRdrName cCallableClassName
-cReturnableClass_RDR   = nameRdrName cReturnableClassName
-eqClass_RDR            = nameRdrName eqClassName
-eqString_RDR           = nameRdrName eqStringName
-unpackCString_RDR              = nameRdrName unpackCStringName
-unpackCStringFoldr_RDR         = nameRdrName unpackCStringFoldrName
-unpackCStringUtf8_RDR          = nameRdrName unpackCStringUtf8Name
-deRefStablePtr_RDR     = nameRdrName deRefStablePtrName
-newStablePtr_RDR       = nameRdrName newStablePtrName
-bindIO_RDR             = nameRdrName bindIOName
-returnIO_RDR           = nameRdrName returnIOName
-fromInteger_RDR                = nameRdrName fromIntegerName
-fromRational_RDR       = nameRdrName fromRationalName
-minus_RDR              = nameRdrName minusName
 \end{code}
 
 %************************************************************************
@@ -715,20 +746,30 @@ minus_RDR         = nameRdrName minusName
 All these are original names; hence mkOrig
 
 \begin{code}
-varQual  mod str uq = mkKnownKeyExternalName (varQual_RDR  mod str) uq
-dataQual mod str uq = mkKnownKeyExternalName (dataQual_RDR mod str) uq
-tcQual   mod str uq = mkKnownKeyExternalName (tcQual_RDR   mod str) uq
-clsQual  mod str uq = mkKnownKeyExternalName (clsQual_RDR  mod str) uq
-
-kindQual str uq = mkInternalName uq (mkKindOccFS tcName str) builtinSrcLoc
+varQual  = mk_known_key_name varName
+dataQual = mk_known_key_name dataName  -- All the constructor names here are for the DataCon
+                                       -- itself, which lives in the VarName name space
+tcQual   = mk_known_key_name tcName
+clsQual  = mk_known_key_name clsName
+
+wVarQual  = mk_wired_in_name varName   -- The wired-in analogues
+wDataQual = mk_wired_in_name dataName          
+wTcQual   = mk_wired_in_name tcName
+
+varQual_RDR  mod str = mkOrig mod (mkOccFS varName str)        -- The RDR analogues
+dataQual_RDR mod str = mkOrig mod (mkOccFS dataName str)
+tcQual_RDR   mod str = mkOrig mod (mkOccFS tcName str)
+clsQual_RDR  mod str = mkOrig mod (mkOccFS clsName str)
+
+mk_known_key_name space mod str uniq 
+  = mkKnownKeyExternalName (mkBasePkgModule mod) (mkOccFS space str) uniq 
+mk_wired_in_name space mod str uniq 
+  = mkWiredInName (mkBasePkgModule mod) (mkOccFS space str) uniq
+
+kindQual str uq = mkInternalName uq (mkKindOccFS tcName str) noSrcLoc
        -- Kinds are not z-encoded in interface file, hence mkKindOccFS
        -- And they don't come from any particular module; indeed we always
        -- want to print them unqualified.  Hence the LocalName
-
-varQual_RDR  mod str = mkOrig varName  mod str
-tcQual_RDR   mod str = mkOrig tcName   mod str
-clsQual_RDR  mod str = mkOrig clsName  mod str
-dataQual_RDR mod str = mkOrig dataName mod str
 \end{code}
 
 %************************************************************************
@@ -736,15 +777,18 @@ dataQual_RDR mod str = mkOrig dataName mod str
 \subsubsection[Uniques-prelude-Classes]{@Uniques@ for wired-in @Classes@}
 %*                                                                     *
 %************************************************************************
+--MetaHaskell extension hand allocate keys here
 
 \begin{code}
 boundedClassKey                = mkPreludeClassUnique 1 
 enumClassKey           = mkPreludeClassUnique 2 
 eqClassKey             = mkPreludeClassUnique 3 
+typeableClassKey       = mkPreludeClassUnique 4
 floatingClassKey       = mkPreludeClassUnique 5 
 fractionalClassKey     = mkPreludeClassUnique 6 
 integralClassKey       = mkPreludeClassUnique 7 
 monadClassKey          = mkPreludeClassUnique 8 
+dataClassKey           = mkPreludeClassUnique 9
 functorClassKey                = mkPreludeClassUnique 10
 numClassKey            = mkPreludeClassUnique 11
 ordClassKey            = mkPreludeClassUnique 12
@@ -753,10 +797,8 @@ realClassKey               = mkPreludeClassUnique 14
 realFloatClassKey      = mkPreludeClassUnique 15
 realFracClassKey       = mkPreludeClassUnique 16
 showClassKey           = mkPreludeClassUnique 17
-
 cCallableClassKey      = mkPreludeClassUnique 18
 cReturnableClassKey    = mkPreludeClassUnique 19
-
 ixClassKey             = mkPreludeClassUnique 20
 \end{code}
 
@@ -790,8 +832,6 @@ int64TyConKey                               = mkPreludeTyConUnique 21
 integerTyConKey                                = mkPreludeTyConUnique 22
 listTyConKey                           = mkPreludeTyConUnique 23
 foreignObjPrimTyConKey                 = mkPreludeTyConUnique 24
-foreignObjTyConKey                     = mkPreludeTyConUnique 25
-foreignPtrTyConKey                     = mkPreludeTyConUnique 26
 weakPrimTyConKey                       = mkPreludeTyConUnique 27
 mutableArrayPrimTyConKey               = mkPreludeTyConUnique 28
 mutableByteArrayPrimTyConKey           = mkPreludeTyConUnique 29
@@ -828,11 +868,6 @@ bcoPrimTyConKey                            = mkPreludeTyConUnique 73
 ptrTyConKey                            = mkPreludeTyConUnique 74
 funPtrTyConKey                         = mkPreludeTyConUnique 75
 
--- Usage type constructors
-usageConKey                            = mkPreludeTyConUnique 76
-usOnceTyConKey                         = mkPreludeTyConUnique 77
-usManyTyConKey                         = mkPreludeTyConUnique 78
-
 -- Generic Type Constructors
 crossTyConKey                          = mkPreludeTyConUnique 79
 plusTyConKey                           = mkPreludeTyConUnique 80
@@ -841,6 +876,15 @@ genUnitTyConKey                            = mkPreludeTyConUnique 81
 -- Parallel array type constructor
 parrTyConKey                           = mkPreludeTyConUnique 82
 
+-- dotnet interop
+objectTyConKey                         = mkPreludeTyConUnique 83
+
+eitherTyConKey                         = mkPreludeTyConUnique 84
+
+---------------- Template Haskell -------------------
+--     USES TyConUniques 100-119
+-----------------------------------------------------
+
 unitTyConKey = mkTupleTyConUnique Boxed 0
 \end{code}
 
@@ -851,7 +895,6 @@ unitTyConKey = mkTupleTyConUnique Boxed 0
 %************************************************************************
 
 \begin{code}
-addrDataConKey                         = mkPreludeDataConUnique  0
 charDataConKey                         = mkPreludeDataConUnique  1
 consDataConKey                         = mkPreludeDataConUnique  2
 doubleDataConKey                       = mkPreludeDataConUnique  3
@@ -860,17 +903,12 @@ floatDataConKey                           = mkPreludeDataConUnique  5
 intDataConKey                          = mkPreludeDataConUnique  6
 smallIntegerDataConKey                 = mkPreludeDataConUnique  7
 largeIntegerDataConKey                 = mkPreludeDataConUnique  8
-foreignObjDataConKey                   = mkPreludeDataConUnique  9
-foreignPtrDataConKey                   = mkPreludeDataConUnique 10
 nilDataConKey                          = mkPreludeDataConUnique 11
 ratioDataConKey                                = mkPreludeDataConUnique 12
-stablePtrDataConKey                    = mkPreludeDataConUnique 13
 stableNameDataConKey                   = mkPreludeDataConUnique 14
 trueDataConKey                         = mkPreludeDataConUnique 15
 wordDataConKey                         = mkPreludeDataConUnique 16
 ioDataConKey                           = mkPreludeDataConUnique 17
-ptrDataConKey                          = mkPreludeDataConUnique 18
-funPtrDataConKey                       = mkPreludeDataConUnique 19
 
 -- Generic data constructors
 crossDataConKey                                = mkPreludeDataConUnique 20
@@ -880,6 +918,9 @@ genUnitDataConKey                   = mkPreludeDataConUnique 23
 
 -- Data constructor for parallel arrays
 parrDataConKey                         = mkPreludeDataConUnique 24
+
+leftDataConKey                         = mkPreludeDataConUnique 25
+rightDataConKey                                = mkPreludeDataConUnique 26
 \end{code}
 
 %************************************************************************
@@ -890,36 +931,36 @@ parrDataConKey                            = mkPreludeDataConUnique 24
 
 \begin{code}
 absentErrorIdKey             = mkPreludeMiscIdUnique  1
-appendIdKey                  = mkPreludeMiscIdUnique  2
 augmentIdKey                 = mkPreludeMiscIdUnique  3
-buildIdKey                   = mkPreludeMiscIdUnique  4
-errorIdKey                   = mkPreludeMiscIdUnique  5
-foldlIdKey                   = mkPreludeMiscIdUnique  6
-foldrIdKey                   = mkPreludeMiscIdUnique  7
-recSelErrIdKey               = mkPreludeMiscIdUnique  8
-integerMinusOneIdKey         = mkPreludeMiscIdUnique  9
-integerPlusOneIdKey          = mkPreludeMiscIdUnique 10
-integerPlusTwoIdKey          = mkPreludeMiscIdUnique 11
-integerZeroIdKey             = mkPreludeMiscIdUnique 12
-int2IntegerIdKey             = mkPreludeMiscIdUnique 13
-seqIdKey                     = mkPreludeMiscIdUnique 14
-irrefutPatErrorIdKey         = mkPreludeMiscIdUnique 15
-eqStringIdKey                = mkPreludeMiscIdUnique 16
-noMethodBindingErrorIdKey     = mkPreludeMiscIdUnique 17
-nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 18
-runtimeErrorIdKey            = mkPreludeMiscIdUnique 19 
-parErrorIdKey                = mkPreludeMiscIdUnique 20
-parIdKey                     = mkPreludeMiscIdUnique 21
-patErrorIdKey                = mkPreludeMiscIdUnique 22
-realWorldPrimIdKey           = mkPreludeMiscIdUnique 23
-recConErrorIdKey             = mkPreludeMiscIdUnique 24
-recUpdErrorIdKey             = mkPreludeMiscIdUnique 25
-traceIdKey                   = mkPreludeMiscIdUnique 26
-unpackCStringUtf8IdKey       = mkPreludeMiscIdUnique 27
-unpackCStringAppendIdKey      = mkPreludeMiscIdUnique 28
-unpackCStringFoldrIdKey              = mkPreludeMiscIdUnique 29
-unpackCStringIdKey           = mkPreludeMiscIdUnique 30
-ushowListIdKey               = mkPreludeMiscIdUnique 31
+appendIdKey                  = mkPreludeMiscIdUnique  4
+buildIdKey                   = mkPreludeMiscIdUnique  5
+errorIdKey                   = mkPreludeMiscIdUnique  6
+foldlIdKey                   = mkPreludeMiscIdUnique  7
+foldrIdKey                   = mkPreludeMiscIdUnique  8
+recSelErrorIdKey             = mkPreludeMiscIdUnique  9
+integerMinusOneIdKey         = mkPreludeMiscIdUnique 10
+integerPlusOneIdKey          = mkPreludeMiscIdUnique 11
+integerPlusTwoIdKey          = mkPreludeMiscIdUnique 12
+integerZeroIdKey             = mkPreludeMiscIdUnique 13
+int2IntegerIdKey             = mkPreludeMiscIdUnique 14
+seqIdKey                     = mkPreludeMiscIdUnique 15
+irrefutPatErrorIdKey         = mkPreludeMiscIdUnique 16
+eqStringIdKey                = mkPreludeMiscIdUnique 17
+noMethodBindingErrorIdKey     = mkPreludeMiscIdUnique 18
+nonExhaustiveGuardsErrorIdKey = mkPreludeMiscIdUnique 19
+runtimeErrorIdKey            = mkPreludeMiscIdUnique 20 
+parErrorIdKey                = mkPreludeMiscIdUnique 21
+parIdKey                     = mkPreludeMiscIdUnique 22
+patErrorIdKey                = mkPreludeMiscIdUnique 23
+realWorldPrimIdKey           = mkPreludeMiscIdUnique 24
+recConErrorIdKey             = mkPreludeMiscIdUnique 25
+recUpdErrorIdKey             = mkPreludeMiscIdUnique 26
+traceIdKey                   = mkPreludeMiscIdUnique 27
+unpackCStringUtf8IdKey       = mkPreludeMiscIdUnique 28
+unpackCStringAppendIdKey      = mkPreludeMiscIdUnique 29
+unpackCStringFoldrIdKey              = mkPreludeMiscIdUnique 30
+unpackCStringIdKey           = mkPreludeMiscIdUnique 31
+
 unsafeCoerceIdKey            = mkPreludeMiscIdUnique 32
 concatIdKey                  = mkPreludeMiscIdUnique 33
 filterIdKey                  = mkPreludeMiscIdUnique 34
@@ -928,7 +969,6 @@ bindIOIdKey               = mkPreludeMiscIdUnique 36
 returnIOIdKey                = mkPreludeMiscIdUnique 37
 deRefStablePtrIdKey          = mkPreludeMiscIdUnique 38
 newStablePtrIdKey            = mkPreludeMiscIdUnique 39
-getTagIdKey                  = mkPreludeMiscIdUnique 40
 plusIntegerIdKey             = mkPreludeMiscIdUnique 41
 timesIntegerIdKey            = mkPreludeMiscIdUnique 42
 printIdKey                   = mkPreludeMiscIdUnique 43
@@ -939,32 +979,41 @@ splitIdKey                      = mkPreludeMiscIdUnique 48
 fstIdKey                     = mkPreludeMiscIdUnique 49
 sndIdKey                     = mkPreludeMiscIdUnique 50
 otherwiseIdKey               = mkPreludeMiscIdUnique 51
-mapIdKey                     = mkPreludeMiscIdUnique 52
 assertIdKey                  = mkPreludeMiscIdUnique 53
 runSTRepIdKey                = mkPreludeMiscIdUnique 54
 
-dollarMainKey                = mkPreludeMiscIdUnique 55
+rootMainKey                  = mkPreludeMiscIdUnique 55
 runMainKey                   = mkPreludeMiscIdUnique 56
 
 andIdKey                     = mkPreludeMiscIdUnique 57
 orIdKey                              = mkPreludeMiscIdUnique 58
 thenIOIdKey                  = mkPreludeMiscIdUnique 59
+lazyIdKey                    = mkPreludeMiscIdUnique 60
+assertErrorIdKey             = mkPreludeMiscIdUnique 61
 
 -- Parallel array functions
-nullPIdKey                   = mkPreludeMiscIdUnique 70
-lengthPIdKey                 = mkPreludeMiscIdUnique 71
-replicatePIdKey                      = mkPreludeMiscIdUnique 72
-mapPIdKey                    = mkPreludeMiscIdUnique 73
-filterPIdKey                 = mkPreludeMiscIdUnique 74
-zipPIdKey                    = mkPreludeMiscIdUnique 75
-crossPIdKey                  = mkPreludeMiscIdUnique 76
-indexPIdKey                  = mkPreludeMiscIdUnique 77
-toPIdKey                     = mkPreludeMiscIdUnique 78
-enumFromToPIdKey              = mkPreludeMiscIdUnique 79
-enumFromThenToPIdKey          = mkPreludeMiscIdUnique 80
-bpermutePIdKey               = mkPreludeMiscIdUnique 81
-bpermuteDftPIdKey            = mkPreludeMiscIdUnique 82
-indexOfPIdKey                = mkPreludeMiscIdUnique 83
+nullPIdKey                   = mkPreludeMiscIdUnique 80
+lengthPIdKey                 = mkPreludeMiscIdUnique 81
+replicatePIdKey                      = mkPreludeMiscIdUnique 82
+mapPIdKey                    = mkPreludeMiscIdUnique 83
+filterPIdKey                 = mkPreludeMiscIdUnique 84
+zipPIdKey                    = mkPreludeMiscIdUnique 85
+crossPIdKey                  = mkPreludeMiscIdUnique 86
+indexPIdKey                  = mkPreludeMiscIdUnique 87
+toPIdKey                     = mkPreludeMiscIdUnique 88
+enumFromToPIdKey              = mkPreludeMiscIdUnique 89
+enumFromThenToPIdKey          = mkPreludeMiscIdUnique 90
+bpermutePIdKey               = mkPreludeMiscIdUnique 91
+bpermuteDftPIdKey            = mkPreludeMiscIdUnique 92
+indexOfPIdKey                = mkPreludeMiscIdUnique 93
+
+-- dotnet interop
+unmarshalObjectIdKey          = mkPreludeMiscIdUnique 94
+marshalObjectIdKey            = mkPreludeMiscIdUnique 95
+marshalStringIdKey            = mkPreludeMiscIdUnique 96
+unmarshalStringIdKey          = mkPreludeMiscIdUnique 97
+checkDotnetResNameIdKey       = mkPreludeMiscIdUnique 98
+
 \end{code}
 
 Certain class operations from Prelude classes.  They get their own
@@ -974,6 +1023,7 @@ during type checking.
 \begin{code}
        -- Just a place holder for  unbound variables  produced by the renamer:
 unboundKey                   = mkPreludeMiscIdUnique 101 
+
 fromIntegerClassOpKey        = mkPreludeMiscIdUnique 102
 minusClassOpKey                      = mkPreludeMiscIdUnique 103
 fromRationalClassOpKey       = mkPreludeMiscIdUnique 104
@@ -987,9 +1037,22 @@ negateClassOpKey        = mkPreludeMiscIdUnique 111
 failMClassOpKey                      = mkPreludeMiscIdUnique 112
 bindMClassOpKey                      = mkPreludeMiscIdUnique 113 -- (>>=)
 thenMClassOpKey                      = mkPreludeMiscIdUnique 114 -- (>>)
-fromEnumClassOpKey           = mkPreludeMiscIdUnique 115
 returnMClassOpKey            = mkPreludeMiscIdUnique 117
-toEnumClassOpKey             = mkPreludeMiscIdUnique 119
+
+-- Recursive do notation
+mfixIdKey      = mkPreludeMiscIdUnique 118
+
+-- Arrow notation
+arrAIdKey      = mkPreludeMiscIdUnique 119
+composeAIdKey  = mkPreludeMiscIdUnique 120 -- >>>
+firstAIdKey    = mkPreludeMiscIdUnique 121
+appAIdKey      = mkPreludeMiscIdUnique 122
+choiceAIdKey   = mkPreludeMiscIdUnique 123 -- |||
+loopAIdKey     = mkPreludeMiscIdUnique 124
+
+---------------- Template Haskell -------------------
+--     USES IdUniques 200-299
+-----------------------------------------------------
 \end{code}
 
 
@@ -1016,8 +1079,6 @@ cCallishTyKeys =
        , wordTyConKey
        , byteArrayTyConKey
        , mutableByteArrayTyConKey
-       , foreignObjTyConKey
-       , foreignPtrTyConKey
        , stablePtrTyConKey
        , int8TyConKey
        , int16TyConKey
@@ -1037,62 +1098,6 @@ cCallishTyKeys =
 %*                                                                     *
 %************************************************************************
 
-@derivableClassKeys@ is also used in checking \tr{deriving} constructs
-(@TcDeriv@).
-
-@derivingOccurrences@ maps a class name to a list of the (qualified)
-occurrences that will be mentioned by the derived code for the class
-when it is later generated.  We don't need to put in things that are
-WiredIn (because they are already mapped to their correct name by the
-@NameSupply@.  The class itself, and all its class ops, is already
-flagged as an occurrence so we don't need to mention that either.
-
-@derivingOccurrences@ has an item for every derivable class, even if
-that item is empty, because we treat lookup failure as indicating that
-the class is illegal in a deriving clause.
-
-\begin{code}
-derivingOccurrences :: UniqFM [RdrName]
-derivingOccurrences = listToUFM deriving_occ_info
-
-derivableClassKeys  = map fst deriving_occ_info
-
-deriving_occ_info
-  = [ (eqClassKey,     [intTyCon_RDR, and_RDR, not_RDR])
-    , (ordClassKey,    [intTyCon_RDR, compose_RDR, eqTag_RDR, error_RDR])
-                               -- EQ (from Ordering) is needed to force in the constructors
-                               -- as well as the type constructor.
-    , (enumClassKey,   [intTyCon_RDR, eq_RDR, ge_RDR, and_RDR, map_RDR, plus_RDR, 
-                        error_RDR, showsPrec_RDR, append_RDR]) 
-                               -- The last two Enum deps are only used to produce better
-                               -- error msgs for derived toEnum methods.
-    , (boundedClassKey,        [intTyCon_RDR])
-    , (showClassKey,   [intTyCon_RDR, numClass_RDR, ordClass_RDR, compose_RDR, showString_RDR, 
-                        showParen_RDR, showSpace_RDR, showList___RDR])
-    , (readClassKey,   [intTyCon_RDR, numClass_RDR, ordClass_RDR,
-                        lexP_RDR, readPrec_RDR, 
-                        readListDefault_RDR, readListPrecDefault_RDR,
-                        step_RDR, parens_RDR, reset_RDR, prec_RDR, alt_RDR, choose_RDR,
-                        ident_RDR,     -- Pulls in the entire Lex.Lexeme data type
-                        bindM_RDR      -- Pulls in the entire Monad class decl
-                       ] )
-    , (ixClassKey,     [intTyCon_RDR, numClass_RDR, and_RDR, map_RDR, enumFromTo_RDR, error_RDR,
-                         foldr_RDR, build_RDR, 
-                             -- foldr and build required for list comprehension used
-                             -- with single constructor types  -- KSW 2000-06
-                        returnM_RDR, failM_RDR])
-                            -- the last two are needed to force returnM, thenM and failM
-                            -- in before typechecking the list(monad) comprehension
-                            -- generated for derived Ix instances (range method)
-                            -- of single constructor types.  -- SOF 8/97
-    ]
-       -- intTyCon: Practically any deriving needs Int, either for index calculations, 
-       --              or for taggery.
-       -- ordClass: really it's the methods that are actually used.
-       -- numClass: for Int literals
-\end{code}
-
-
 NOTE: @Eq@ and @Text@ do need to appear in @standardClasses@
 even though every numeric class has these two as a superclass,
 because the list of ambiguous dictionaries hasn't been simplified.
@@ -1138,3 +1143,12 @@ noDictClassKeys  -- These classes are used only for type annotations;
   = cCallishClassKeys
 \end{code}
 
+@derivableClassKeys@ is also used in checking \tr{deriving} constructs
+(@TcDeriv@).
+
+\begin{code}
+derivableClassKeys
+  = [ eqClassKey, ordClassKey, enumClassKey, ixClassKey,
+      boundedClassKey, showClassKey, readClassKey ]
+\end{code}
+