Interface file optimisation and removal of nameParent
[ghc-hetmet.git] / compiler / typecheck / TcRnMonad.lhs
index 0b5e4fc..3272dea 100644 (file)
@@ -19,9 +19,10 @@ import SrcLoc           ( noSrcLoc  )
 import TysWiredIn       ( intTy, stringTy, mkListTy, unitTy, boolTy )
 import PrelNames        ( breakpointJumpName, breakpointCondJumpName )
 import NameEnv          ( mkNameEnv )
+import TcEnv            ( tcExtendIdEnv )
 #endif
 
-import HsSyn           ( emptyLHsBinds )
+import HsSyn           ( emptyLHsBinds, HaddockModInfo(..) )
 import HscTypes                ( HscEnv(..), ModGuts(..), ModIface(..),
                          TypeEnv, emptyTypeEnv, HscSource(..), isHsBoot,
                          ExternalPackageState(..), HomePackageTable,
@@ -31,11 +32,13 @@ import Module               ( Module, moduleName )
 import RdrName         ( GlobalRdrEnv, LocalRdrEnv, emptyLocalRdrEnv )
 import Name            ( Name, mkInternalName, tidyNameOcc, nameOccName, getSrcLoc )
 import Type            ( Type )
-import TcType          ( tcIsTyVarTy, tcGetTyVar )
+import TcType          ( TcType, tcIsTyVarTy, tcGetTyVar )
 import NameEnv         ( extendNameEnvList, nameEnvElts )
 import InstEnv         ( emptyInstEnv )
+import FamInstEnv      ( emptyFamInstEnv )
 
 import Var             ( setTyVarName )
+import Id              ( mkSysLocal )
 import VarSet          ( emptyVarSet )
 import VarEnv          ( TidyEnv, emptyTidyEnv, extendVarEnv )
 import ErrUtils                ( Message, Messages, emptyMessages, errorsFound, 
@@ -47,12 +50,13 @@ import NameSet              ( NameSet, emptyDUs, emptyNameSet, unionNameSets, addOneToNameSe
 import OccName         ( emptyOccEnv, tidyOccName )
 import Bag             ( emptyBag )
 import Outputable
-import UniqSupply      ( UniqSupply, mkSplitUniqSupply, uniqFromSupply, splitUniqSupply )
+import UniqSupply      ( UniqSupply, mkSplitUniqSupply, uniqFromSupply, uniqsFromSupply, splitUniqSupply )
 import UniqFM          ( unitUFM )
 import Unique          ( Unique )
 import DynFlags                ( DynFlags(..), DynFlag(..), dopt, dopt_set,
                          dopt_unset, GhcMode ) 
 import StaticFlags     ( opt_PprStyle_Debug )
+import FastString      ( FastString )
 import Bag             ( snocBag, unionBags )
 import Panic           ( showException )
  
@@ -101,9 +105,10 @@ initTc hsc_env hsc_src mod do_this
                tcg_type_env = hsc_global_type_env hsc_env,
                tcg_type_env_var = type_env_var,
                tcg_inst_env  = emptyInstEnv,
+               tcg_fam_inst_env  = emptyFamInstEnv,
                tcg_inst_uses = dfuns_var,
                tcg_th_used   = th_var,
-               tcg_exports  = emptyNameSet,
+               tcg_exports  = [],
                tcg_imports  = init_imports,
                tcg_dus      = emptyDUs,
                 tcg_rn_imports = Nothing,
@@ -112,10 +117,13 @@ initTc hsc_env hsc_src mod do_this
                tcg_binds    = emptyLHsBinds,
                tcg_deprecs  = NoDeprecs,
                tcg_insts    = [],
+               tcg_fam_insts= [],
                tcg_rules    = [],
                tcg_fords    = [],
                tcg_dfun_n   = dfun_n_var,
-               tcg_keep     = keep_var
+               tcg_keep     = keep_var,
+               tcg_doc      = Nothing,
+               tcg_hmi      = HaddockModInfo Nothing Nothing Nothing Nothing
             } ;
             lcl_env = TcLclEnv {
                tcl_errs       = errs_var,
@@ -132,33 +140,8 @@ initTc hsc_env hsc_src mod do_this
    
        -- OK, here's the business end!
        maybe_res <- initTcRnIf 'a' hsc_env gbl_env lcl_env $
-                    do {
-#if defined(GHCI) && defined(BREAKPOINT)
-                          unique <- newUnique ;
-                          let { var = mkInternalName unique (mkOccName tvName "a") noSrcLoc;
-                                tyvar = mkTyVar var liftedTypeKind;
-                                basicType extra = (FunTy intTy
-                                                   (FunTy (mkListTy unitTy)
-                                                    (FunTy stringTy
-                                                     (ForAllTy tyvar
-                                                      (extra
-                                                       (FunTy (TyVarTy tyvar)
-                                                        (TyVarTy tyvar)))))));
-                                breakpointJumpType
-                                    = mkGlobalId VanillaGlobal breakpointJumpName
-                                                 (basicType id) vanillaIdInfo;
-                                breakpointCondJumpType
-                                    = mkGlobalId VanillaGlobal breakpointCondJumpName
-                                                 (basicType (FunTy boolTy)) vanillaIdInfo;
-                                new_env = mkNameEnv [(breakpointJumpName
-                                                     , ATcId breakpointJumpType topLevel False)
-                                                     ,(breakpointCondJumpName
-                                                     , ATcId breakpointCondJumpType topLevel False)];
-                              };
-                          r <- tryM (updLclEnv (\gbl -> gbl{tcl_env=new_env}) do_this)
-#else
-                          r <- tryM do_this
-#endif
+                    addBreakpointBindings $
+                    do { r <- tryM do_this
                        ; case r of
                          Right res -> return (Just res)
                          Left _    -> return Nothing } ;
@@ -173,8 +156,7 @@ initTc hsc_env hsc_src mod do_this
        return (msgs, final_res)
     }
   where
-    init_imports = emptyImportAvails {imp_env = 
-                                       unitUFM (moduleName mod) emptyNameSet}
+    init_imports = emptyImportAvails {imp_env = unitUFM (moduleName mod) []}
        -- Initialise tcg_imports with an empty set of bindings for
        -- this module, so that if we see 'module M' in the export
        -- list, and there are no bindings in M, we don't bleat 
@@ -191,6 +173,32 @@ initTcPrintErrors env mod todo = do
   return res
 \end{code}
 
+\begin{code}
+addBreakpointBindings :: TcM a -> TcM a
+addBreakpointBindings thing_inside
+#if defined(GHCI) && defined(BREAKPOINT)
+  = do { unique <- newUnique
+        ; let { var = mkInternalName unique (mkOccName tvName "a") noSrcLoc;
+                tyvar = mkTyVar var liftedTypeKind;
+                basicType extra = (FunTy intTy
+                                   (FunTy (mkListTy unitTy)
+                                    (FunTy stringTy
+                                     (ForAllTy tyvar
+                                      (extra
+                                       (FunTy (TyVarTy tyvar)
+                                        (TyVarTy tyvar)))))));
+                breakpointJumpId
+                    = mkGlobalId VanillaGlobal breakpointJumpName
+                                 (basicType id) vanillaIdInfo;
+                breakpointCondJumpId
+                    = mkGlobalId VanillaGlobal breakpointCondJumpName
+                                 (basicType (FunTy boolTy)) vanillaIdInfo
+         }
+       ; tcExtendIdEnv [breakpointJumpId, breakpointCondJumpId] thing_inside}
+#else
+   = thing_inside
+#endif
+\end{code}
 
 %************************************************************************
 %*                                                                     *
@@ -353,8 +361,13 @@ newUniqueSupply
 
 newLocalName :: Name -> TcRnIf gbl lcl Name
 newLocalName name      -- Make a clone
-  = newUnique          `thenM` \ uniq ->
-    returnM (mkInternalName uniq (nameOccName name) (getSrcLoc name))
+  = do { uniq <- newUnique
+       ; return (mkInternalName uniq (nameOccName name) (getSrcLoc name)) }
+
+newSysLocalIds :: FastString -> [TcType] -> TcRnIf gbl lcl [TcId]
+newSysLocalIds fs tys
+  = do { us <- newUniqueSupply
+       ; return (zipWith (mkSysLocal fs) (uniqsFromSupply us) tys) }
 \end{code}