GHC.Base.breakpoint isn't vaporware anymore.
[ghc-hetmet.git] / ghc / compiler / prelude / PrelNames.lhs
index 0b85276..d656fbf 100644 (file)
@@ -50,9 +50,8 @@ module PrelNames (
 #include "HsVersions.h"
 
 import Module    ( Module, mkModule )
-import OccName   ( dataName, tcName, clsName, varName, mkOccFS
-                 )
-                 
+import OccName   ( dataName, tcName, clsName, varName, mkOccNameFS,
+                   mkVarOccFS )
 import RdrName   ( RdrName, nameRdrName, mkOrig, rdrNameOcc, mkUnqual )
 import Unique    ( Unique, Uniquable(..), hasKey,
                    mkPreludeMiscIdUnique, mkPreludeDataConUnique,
@@ -75,7 +74,7 @@ import FastString
 This *local* name is used by the interactive stuff
 
 \begin{code}
-itName uniq = mkInternalName uniq (mkOccFS varName FSLIT("it")) noSrcLoc
+itName uniq = mkInternalName uniq (mkOccNameFS varName FSLIT("it")) noSrcLoc
 \end{code}
 
 \begin{code}
@@ -103,7 +102,6 @@ wired in ones are defined in TysWiredIn etc.
 basicKnownKeyNames :: [Name]
 basicKnownKeyNames
  = genericTyConNames
- ++ monadNames
  ++ typeableClassNames
  ++ [  -- Type constructors (synonyms especially)
        ioTyConName, ioDataConName,
@@ -146,6 +144,7 @@ basicKnownKeyNames
 
        -- Monad stuff
        thenIOName, bindIOName, returnIOName, failIOName,
+       failMName, bindMName, thenMName, returnMName,
 
        -- MonadRec stuff
        mfixName,
@@ -187,7 +186,8 @@ basicKnownKeyNames
        -- Others
        otherwiseIdName, 
        plusIntegerName, timesIntegerName,
-       eqStringName, assertName, assertErrorName, runSTRepName,
+       eqStringName, assertName, breakpointName, assertErrorName,
+        runSTRepName,
        printName, fstName, sndName,
 
        -- MonadFix
@@ -196,6 +196,9 @@ basicKnownKeyNames
        -- Splittable class
        splittableClassName, splitName,
 
+       -- Other classes
+       randomClassName, randomGenClassName, monadPlusClassName,
+
        -- Booleans
        andName, orName
        
@@ -207,9 +210,6 @@ basicKnownKeyNames
        , marshalStringName, unmarshalStringName, checkDotnetResName
     ]
 
-monadNames :: [Name]   -- The monad ops need by a HsDo
-monadNames = [returnMName, failMName, bindMName, thenMName]
-
 genericTyConNames :: [Name]
 genericTyConNames = [crossTyConName, plusTyConName, genUnitTyConName]
 \end{code}
@@ -260,18 +260,21 @@ lEX               = mkModule "Text.Read.Lex"
 mAIN           = mkModule "Main"
 pREL_INT       = mkModule "GHC.Int"
 pREL_WORD      = mkModule "GHC.Word"
+mONAD          = mkModule "Control.Monad"
 mONAD_FIX      = mkModule "Control.Monad.Fix"
 aRROW          = mkModule "Control.Arrow"
 aDDR           = mkModule "Addr"
+rANDOM         = mkModule "System.Random"
 
 gLA_EXTS       = mkModule "GHC.Exts"
 rOOT_MAIN      = mkModule ":Main"              -- Root module for initialisation 
-       -- The ':xxx' makes a moudle name that the user can never
+       -- The ':xxx' makes a module 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    = mkModule ":Interactive"
+thFAKE         = mkModule ":THFake"
 \end{code}
 
 %************************************************************************
@@ -372,6 +375,8 @@ maxBound_RDR            = varQual_RDR pREL_ENUM FSLIT("maxBound")
 range_RDR               = varQual_RDR pREL_ARR FSLIT("range")
 inRange_RDR             = varQual_RDR pREL_ARR FSLIT("inRange")
 index_RDR              = varQual_RDR pREL_ARR FSLIT("index")
+unsafeIndex_RDR                = varQual_RDR pREL_ARR FSLIT("unsafeIndex")
+unsafeRangeSize_RDR    = varQual_RDR pREL_ARR FSLIT("unsafeRangeSize")
 
 readList_RDR            = varQual_RDR pREL_READ FSLIT("readList")
 readListDefault_RDR     = varQual_RDR pREL_READ FSLIT("readListDefault")
@@ -410,10 +415,10 @@ inrDataCon_RDR     = dataQual_RDR pREL_BASE FSLIT("Inr")
 genUnitDataCon_RDR = dataQual_RDR pREL_BASE FSLIT("Unit")
 
 ----------------------
-varQual_RDR  mod str = mkOrig mod (mkOccFS varName str)
-tcQual_RDR   mod str = mkOrig mod (mkOccFS tcName str)
-clsQual_RDR  mod str = mkOrig mod (mkOccFS clsName str)
-dataQual_RDR mod str = mkOrig mod (mkOccFS dataName str)
+varQual_RDR  mod str = mkOrig mod (mkOccNameFS varName str)
+tcQual_RDR   mod str = mkOrig mod (mkOccNameFS tcName str)
+clsQual_RDR  mod str = mkOrig mod (mkOccNameFS clsName str)
+dataQual_RDR mod str = mkOrig mod (mkOccNameFS dataName str)
 \end{code}
 
 %************************************************************************
@@ -431,7 +436,6 @@ and it's convenient to write them all down in one place.
 
 
 \begin{code}
-rootMainName  = varQual rOOT_MAIN FSLIT("main") rootMainKey
 runMainIOName = varQual pREL_TOP_HANDLER FSLIT("runMainIO") runMainKey
 
 orderingTyConName = tcQual   pREL_BASE FSLIT("Ordering") orderingTyConKey
@@ -453,28 +457,34 @@ unpackCStringUtf8Name   = varQual pREL_BASE FSLIT("unpackCStringUtf8#") unpackCS
 eqStringName           = varQual pREL_BASE FSLIT("eqString")  eqStringIdKey
 
 -- Base classes (Eq, Ord, Functor)
-eqClassName      = clsQual pREL_BASE FSLIT("Eq") eqClassKey
-eqName           = methName eqClassName FSLIT("==") eqClassOpKey
-ordClassName     = clsQual pREL_BASE FSLIT("Ord") ordClassKey
-geName           = methName ordClassName FSLIT(">=") geClassOpKey
+eqClassName      = clsQual pREL_BASE FSLIT("Eq")      eqClassKey
+eqName           = methName eqClassName FSLIT("==")   eqClassOpKey
+ordClassName     = clsQual pREL_BASE FSLIT("Ord")     ordClassKey
+geName           = methName ordClassName FSLIT(">=")  geClassOpKey
 functorClassName  = clsQual pREL_BASE FSLIT("Functor") functorClassKey
 
 -- Class Monad
-monadClassName    = clsQual pREL_BASE FSLIT("Monad") monadClassKey
-thenMName         = methName monadClassName FSLIT(">>")  thenMClassOpKey
-bindMName         = methName monadClassName FSLIT(">>=") bindMClassOpKey
+monadClassName    = clsQual pREL_BASE FSLIT("Monad")        monadClassKey
+thenMName         = methName monadClassName FSLIT(">>")     thenMClassOpKey
+bindMName         = methName monadClassName FSLIT(">>=")    bindMClassOpKey
 returnMName       = methName monadClassName FSLIT("return") returnMClassOpKey
-failMName         = methName monadClassName FSLIT("fail") failMClassOpKey
+failMName         = methName monadClassName FSLIT("fail")   failMClassOpKey
 
 -- Random PrelBase functions
-otherwiseIdName   = varQual pREL_BASE FSLIT("otherwise") otherwiseIdKey
-foldrName        = varQual pREL_BASE FSLIT("foldr")     foldrIdKey
-buildName        = varQual pREL_BASE FSLIT("build")     buildIdKey
-augmentName      = varQual pREL_BASE FSLIT("augment")   augmentIdKey
-appendName       = varQual pREL_BASE FSLIT("++")        appendIdKey
-andName                  = varQual pREL_BASE FSLIT("&&")             andIdKey
-orName           = varQual pREL_BASE FSLIT("||")             orIdKey
-assertName        = varQual pREL_BASE FSLIT("assert")    assertIdKey
+otherwiseIdName   = varQual pREL_BASE FSLIT("otherwise")  otherwiseIdKey
+foldrName        = varQual pREL_BASE FSLIT("foldr")      foldrIdKey
+buildName        = varQual pREL_BASE FSLIT("build")      buildIdKey
+augmentName      = varQual pREL_BASE FSLIT("augment")    augmentIdKey
+appendName       = varQual pREL_BASE FSLIT("++")         appendIdKey
+andName                  = varQual pREL_BASE FSLIT("&&")         andIdKey
+orName           = varQual pREL_BASE FSLIT("||")         orIdKey
+assertName        = varQual pREL_BASE FSLIT("assert")     assertIdKey
+breakpointName    = varQual pREL_BASE FSLIT("breakpoint") breakpointIdKey
+breakpointJumpName
+    = mkInternalName
+        breakpointJumpIdKey
+        (mkOccNameFS varName FSLIT("breakpointJump"))
+        noSrcLoc
 
 -- PrelTup
 fstName                  = varQual pREL_TUP FSLIT("fst") fstIdKey
@@ -615,12 +625,17 @@ monadFixClassName  = clsQual mONAD_FIX FSLIT("MonadFix") monadFixClassKey
 mfixName          = methName monadFixClassName FSLIT("mfix") mfixIdKey
 
 -- Arrow notation
-arrAName          = varQual aRROW FSLIT("arr") arrAIdKey
-composeAName      = varQual aRROW FSLIT(">>>") composeAIdKey
-firstAName        = varQual aRROW FSLIT("first")       firstAIdKey
-appAName          = varQual aRROW FSLIT("app") appAIdKey
-choiceAName       = varQual aRROW FSLIT("|||") choiceAIdKey
-loopAName         = varQual aRROW FSLIT("loop")        loopAIdKey
+arrAName          = varQual aRROW FSLIT("arr")   arrAIdKey
+composeAName      = varQual aRROW FSLIT(">>>")   composeAIdKey
+firstAName        = varQual aRROW FSLIT("first") firstAIdKey
+appAName          = varQual aRROW FSLIT("app")   appAIdKey
+choiceAName       = varQual aRROW FSLIT("|||")   choiceAIdKey
+loopAName         = varQual aRROW FSLIT("loop")  loopAIdKey
+
+-- Other classes, needed for type defaulting
+monadPlusClassName  = clsQual mONAD FSLIT("MonadPlus")  monadPlusClassKey
+randomClassName     = clsQual rANDOM FSLIT("Random")    randomClassKey
+randomGenClassName  = clsQual rANDOM FSLIT("RandomGen") randomGenClassKey
 
 -- dotnet interop
 objectTyConName            = tcQual   dOTNET FSLIT("Object") objectTyConKey
@@ -647,17 +662,17 @@ tcQual   = mk_known_key_name tcName
 clsQual  = mk_known_key_name clsName
 
 mk_known_key_name space mod str uniq 
-  = mkExternalName uniq mod (mkOccFS space str) 
+  = mkExternalName uniq mod (mkOccNameFS space str) 
                   Nothing noSrcLoc
 
 conName :: Name -> FastString -> Unique -> Name
 conName tycon occ uniq
-  = mkExternalName uniq (nameModule tycon) (mkOccFS dataName occ) 
+  = mkExternalName uniq (nameModule tycon) (mkOccNameFS dataName occ) 
                   (Just tycon) noSrcLoc
 
 methName :: Name -> FastString -> Unique -> Name
 methName cls occ uniq
-  = mkExternalName uniq (nameModule cls) (mkOccFS varName occ) 
+  = mkExternalName uniq (nameModule cls) (mkVarOccFS occ) 
                   (Just cls) noSrcLoc
 \end{code}
 
@@ -698,6 +713,10 @@ typeable7ClassKey  = mkPreludeClassUnique 27
 
 monadFixClassKey       = mkPreludeClassUnique 28
 splittableClassKey     = mkPreludeClassUnique 29
+
+monadPlusClassKey      = mkPreludeClassUnique 30
+randomClassKey         = mkPreludeClassUnique 31
+randomGenClassKey      = mkPreludeClassUnique 32
 \end{code}
 
 %************************************************************************
@@ -890,6 +909,9 @@ thenIOIdKey               = mkPreludeMiscIdUnique 59
 lazyIdKey                    = mkPreludeMiscIdUnique 60
 assertErrorIdKey             = mkPreludeMiscIdUnique 61
 
+breakpointIdKey               = mkPreludeMiscIdUnique 62
+breakpointJumpIdKey           = mkPreludeMiscIdUnique 63
+
 -- Parallel array functions
 nullPIdKey                   = mkPreludeMiscIdUnique 80
 lengthPIdKey                 = mkPreludeMiscIdUnique 81
@@ -1022,9 +1044,12 @@ needsDataDeclCtxtClassKeys = -- see comments in TcDeriv
        [ readClassKey
        ]
 
+-- The "standard classes" are used in defaulting (Haskell 98 report 4.3.4),
+-- and are: "classes defined in the Prelude or a standard library"
 standardClassKeys = derivableClassKeys ++ numericClassKeys
-
-noDictClassKeys = [] -- ToDo: remove?
+                 ++ [randomClassKey, randomGenClassKey,
+                     functorClassKey, 
+                     monadClassKey, monadPlusClassKey]
 \end{code}
 
 @derivableClassKeys@ is also used in checking \tr{deriving} constructs