Interface file optimisation and removal of nameParent
[ghc-hetmet.git] / compiler / main / HscMain.lhs
index 6536068..0563f34 100644 (file)
@@ -30,6 +30,7 @@ import Module         ( Module )
 import CodeOutput      ( outputForeignStubs )
 import ByteCodeGen     ( byteCodeGen, coreExprToBCOs )
 import Linker          ( HValue, linkExpr )
+import CoreSyn         ( CoreExpr )
 import CoreTidy                ( tidyExpr )
 import CorePrep                ( corePrepExpr )
 import Flattening      ( flattenExpr )
@@ -38,17 +39,18 @@ import SimplCore        ( simplifyExpr )
 import TcRnDriver      ( tcRnStmt, tcRnExpr, tcRnType ) 
 import Type            ( Type )
 import PrelNames       ( iNTERACTIVE )
-import Kind            ( Kind )
+import {- Kind parts of -} Type                ( Kind )
 import CoreLint                ( lintUnfolding )
 import DsMeta          ( templateHaskellNames )
-import SrcLoc          ( noSrcLoc, getLoc )
+import SrcLoc          ( SrcSpan, noSrcLoc, interactiveSrcLoc, srcLocSpan )
 import VarEnv          ( emptyTidyEnv )
 #endif
 
 import Var             ( Id )
 import Module          ( emptyModuleEnv, ModLocation(..) )
 import RdrName         ( GlobalRdrEnv, RdrName, emptyGlobalRdrEnv )
-import HsSyn           ( HsModule, LHsBinds, HsGroup, LIE, LImportDecl )
+import HsSyn           ( HsModule, LHsBinds, HsGroup, LIE, LImportDecl, HsDoc,
+                          HaddockModInfo )
 import SrcLoc          ( Located(..) )
 import StringBuffer    ( hGetStringBuffer, stringToStringBuffer )
 import Parser
@@ -175,7 +177,8 @@ data HscChecked
         -- parsed
         (Located (HsModule RdrName))
         -- renamed
-        (Maybe (HsGroup Name,[LImportDecl Name],Maybe [LIE Name]))
+        (Maybe (HsGroup Name, [LImportDecl Name], Maybe [LIE Name],
+                Maybe (HsDoc Name), HaddockModInfo Name))
         -- typechecked
         (Maybe (LHsBinds Id, GlobalRdrEnv, ModDetails))
 
@@ -398,7 +401,7 @@ batchMsg mb_mod_index recomp
          liftIO $ do
          if recomp
             then showMsg "Compiling "
-            else if verbosity (hsc_dflags hsc_env) >= 2
+            else if verbosity (hsc_dflags hsc_env) >= 1
                     then showMsg "Skipping  "
                     else return ()
 
@@ -462,10 +465,7 @@ hscFileFrontEnd =
                          -------------------
                          -- DESUGAR
                          -------------------
-                         -> do (warns, maybe_ds_result) <- {-# SCC "DeSugar" #-}
-                                                           deSugar hsc_env tc_result
-                               printBagOfWarnings dflags warns
-                               return maybe_ds_result
+                         -> {-# SCC "DeSugar" #-} deSugar hsc_env tc_result
 
 --------------------------------------------------------------
 -- Simplifiers
@@ -527,7 +527,7 @@ hscNormalIface simpl_result
                <- {-# SCC "MkFinalIface" #-}
                   mkIface hsc_env maybe_old_iface simpl_result details
        -- Emit external core
-       emitExternalCore (hsc_dflags hsc_env) (mg_exports simpl_result) cg_guts -- Move this? --Lemmih 03/07/2006
+       emitExternalCore (hsc_dflags hsc_env) (availsToNameSet (mg_exports simpl_result)) cg_guts -- Move this? --Lemmih 03/07/2006
        dumpIfaceStats hsc_env
 
            -------------------
@@ -541,9 +541,11 @@ hscNormalIface simpl_result
 hscWriteIface :: (ModIface, Bool, ModDetails, a) -> Comp (ModIface, ModDetails, a)
 hscWriteIface (iface, no_change, details, a)
     = do mod_summary <- gets compModSummary
+         hsc_env <- gets compHscEnv
+         let dflags = hsc_dflags hsc_env
          liftIO $ do
          unless no_change
-           $ writeIfaceFile (ms_location mod_summary) iface
+           $ writeIfaceFile dflags (ms_location mod_summary) iface
          return (iface, details, a)
 
 hscIgnoreIface :: (ModIface, Bool, ModDetails, a) -> Comp (ModIface, ModDetails, a)
@@ -675,17 +677,21 @@ hscFileCheck hsc_env mod_summary = do {
        ; case maybe_tc_result of {
             Nothing -> return (Just (HscChecked rdr_module Nothing Nothing));
             Just tc_result -> do
-               let md = ModDetails { 
-                               md_types   = tcg_type_env tc_result,
-                               md_exports = tcg_exports  tc_result,
-                               md_insts   = tcg_insts    tc_result,
-                               md_rules   = [panic "no rules"] }
+               let type_env = tcg_type_env tc_result
+                   md = ModDetails { 
+                               md_types     = type_env,
+                               md_exports   = tcg_exports   tc_result,
+                               md_insts     = tcg_insts     tc_result,
+                               md_fam_insts = tcg_fam_insts tc_result,
+                               md_rules     = [panic "no rules"] }
                                   -- Rules are CoreRules, not the
                                   -- RuleDecls we get out of the typechecker
                     rnInfo = do decl <- tcg_rn_decls tc_result
                                 imports <- tcg_rn_imports tc_result
                                 let exports = tcg_rn_exports tc_result
-                                return (decl,imports,exports)
+                               let doc = tcg_doc tc_result
+                                   hmi = tcg_hmi tc_result
+                                return (decl,imports,exports,doc,hmi)
                return (Just (HscChecked rdr_module 
                                    rnInfo
                                   (Just (tcg_binds tc_result,
@@ -805,14 +811,22 @@ hscStmt hsc_env stmt
                Nothing -> return Nothing ;
                Just (new_ic, bound_names, tc_expr) -> do {
 
+
+               -- Desugar it
+       ; let rdr_env  = ic_rn_gbl_env new_ic
+             type_env = ic_type_env new_ic
+       ; mb_ds_expr <- deSugarExpr hsc_env iNTERACTIVE rdr_env type_env tc_expr
+       
+       ; case mb_ds_expr of {
+               Nothing -> return Nothing ;
+               Just ds_expr -> do {
+
                -- Then desugar, code gen, and link it
-       ; hval <- compileExpr hsc_env iNTERACTIVE 
-                             (ic_rn_gbl_env new_ic) 
-                             (ic_type_env new_ic)
-                             tc_expr
+       ; let src_span = srcLocSpan interactiveSrcLoc
+       ; hval <- compileExpr hsc_env src_span ds_expr
 
        ; return (Just (hsc_env{ hsc_IC=new_ic }, bound_names, hval))
-       }}}}}
+       }}}}}}}
 
 hscTcExpr      -- Typecheck an expression (but don't run it)
   :: HscEnv
@@ -892,19 +906,12 @@ hscParseThing parser dflags str
 
 \begin{code}
 #ifdef GHCI
-compileExpr :: HscEnv 
-           -> Module -> GlobalRdrEnv -> TypeEnv
-           -> LHsExpr Id
-           -> IO HValue
+compileExpr :: HscEnv -> SrcSpan -> CoreExpr -> IO HValue
 
-compileExpr hsc_env this_mod rdr_env type_env tc_expr
+compileExpr hsc_env srcspan ds_expr
   = do { let { dflags  = hsc_dflags hsc_env ;
-               lint_on = dopt Opt_DoCoreLinting dflags ;
-               !srcspan = getLoc tc_expr }
+               lint_on = dopt Opt_DoCoreLinting dflags }
              
-               -- Desugar it
-       ; ds_expr <- deSugarExpr hsc_env this_mod rdr_env type_env tc_expr
-       
                -- Flatten it
        ; flat_expr <- flattenExpr hsc_env ds_expr