\begin{code}
module HscMain ( HscResult(..), hscMain,
#ifdef GHCI
- hscStmt, hscThing,
+ hscStmt, hscThing, hscModuleContents,
#endif
initPersistentCompilerState ) where
import ByteCodeGen ( byteCodeGen )
import CoreTidy ( tidyCoreExpr )
import CorePrep ( corePrepExpr )
-import Rename ( renameStmt, renameRdrName )
+import Rename ( renameStmt, renameRdrName, slurpIface )
import RdrName ( rdrNameOcc, setRdrNameOcc )
import RdrHsSyn ( RdrNameStmt )
import OccName ( dataName, tcClsName,
import Type ( Type )
import Id ( Id, idName, setGlobalIdDetails )
import IdInfo ( GlobalIdDetails(VanillaGlobal) )
-import HscTypes ( InteractiveContext(..) )
+import Name ( isLocalName )
+import NameEnv ( lookupNameEnv )
+import RdrName ( rdrEnvElts )
import PrelNames ( iNTERACTIVE )
import StringBuffer ( stringToStringBuffer )
import FastString ( mkFastString )
import Maybes ( catMaybes )
+
+import List ( nub )
#endif
import HsSyn
import CodeOutput ( codeOutput )
import Module ( ModuleName, moduleName, mkHomeModule,
- moduleUserString )
+ moduleUserString, lookupModuleEnv )
import CmdLineOpts
+import DriverState ( v_HCHeader )
import ErrUtils ( dumpIfSet_dyn, showPass, printError )
import Util ( unJust )
import UniqSupply ( mkSplitUniqSupply )
import NameEnv ( emptyNameEnv, mkNameEnv )
import Module ( Module )
-import IOExts ( newIORef, readIORef, writeIORef, unsafePerformIO )
+import IOExts ( newIORef, readIORef, writeIORef, modifyIORef,
+ unsafePerformIO )
import Monad ( when )
import Maybe ( isJust, fromJust )
(pcs_ch, errs_found, (recomp_reqd, maybe_checked_iface))
<- _scc_ "checkOldIface"
- checkOldIface ghci_mode dflags hit hst pcs (ml_hi_file location)
+ checkOldIface ghci_mode dflags hit hst pcs mod (ml_hi_file location)
source_unchanged maybe_old_iface;
if errs_found then
= do {
when (verbosity dflags >= 1) $
hPutStrLn stderr ("Skipping " ++
- compMsg have_object mod location);
+ showModMsg have_object mod location);
-- CLOSURE
(pcs_cl, closure_errs, cl_hs_decls)
return (HscNoRecomp pcs_tc new_details old_iface)
}}}
-compMsg use_object mod location =
- mod_str ++ replicate (max 0 (16 - length mod_str)) ' '
- ++" ( " ++ unJust "hscRecomp" (ml_hs_file location) ++ ", "
- ++ (if use_object
- then unJust "hscRecomp" (ml_obj_file location)
- else "interpreted")
- ++ " )"
- where mod_str = moduleUserString mod
-
-
hscRecomp ghci_mode dflags have_object
mod location maybe_checked_iface hst hit pcs_ch
= do {
; when (ghci_mode /= OneShot && verbosity dflags >= 1) $
hPutStrLn stderr ("Compiling " ++
- compMsg (not toInterp) mod location);
+ showModMsg (not toInterp) mod location);
-------------------
-- PARSE
mod_name_to_Module nm
= do m <- findModule nm ; return (fst (fromJust m))
- (h_code,c_code,fe_binders) = foreign_stuff
+ (h_code, c_code, headers, fe_binders) = foreign_stuff
+
+ -- turn the list of headers requested in foreign import
+ -- declarations into a string suitable for emission into generated
+ -- C code...
+ --
+ foreign_headers =
+ unlines
+ . map (\fname -> "#include \"" ++ _UNPK_ fname ++ "\"")
+ . reverse
+ $ headers
+
+ -- ...and add the string to the headers requested via command line
+ -- options
+ --
+ ; modifyIORef v_HCHeader (++ foreign_headers)
; imported_modules <- mapM mod_name_to_Module imported_module_names
-- Rename it
(pcs1, print_unqual, maybe_renamed_stmt)
- <- renameStmt dflags hit hst pcs0
- iNTERACTIVE icontext parsed_stmt
+ <- renameStmt dflags hit hst pcs0 icontext parsed_stmt
; case maybe_renamed_stmt of
Nothing -> return (pcs0, Nothing)
-> IO ( PersistentCompilerState,
[TyThing] )
-hscThing dflags hst hit pcs0 icontext str
+hscThing dflags hst hit pcs0 ic str
= do maybe_rdr_name <- myParseIdentifier dflags str
case maybe_rdr_name of {
Nothing -> return (pcs0, []);
tccls_name = setRdrNameOcc rdr_name tccls_occ
(pcs, unqual, maybe_rn_result) <-
- renameRdrName dflags hit hst pcs0 iNTERACTIVE icontext rdr_names
+ renameRdrName dflags hit hst pcs0 ic rdr_names
case maybe_rn_result of {
Nothing -> return (pcs, []);
case maybe_pcs of {
Nothing -> return (pcs, []);
Just pcs ->
- let maybe_ty_things = map (lookupType hst (pcs_PTE pcs)) names
+ let do_lookup n
+ | isLocalName n = lookupNameEnv (ic_type_env ic) n
+ | otherwise = lookupType hst (pcs_PTE pcs) n
+
+ maybe_ty_things = map do_lookup names
in
return (pcs, catMaybes maybe_ty_things) }
}}}
%************************************************************************
%* *
+\subsection{Find all the things defined in a module}
+%* *
+%************************************************************************
+
+\begin{code}
+#ifdef GHCI
+hscModuleContents
+ :: DynFlags
+ -> HomeSymbolTable
+ -> HomeIfaceTable
+ -> PersistentCompilerState -- IN: persistent compiler state
+ -> Module -- module to inspect
+ -> Bool -- grab just the exports, or the whole toplev
+ -> IO (PersistentCompilerState, Maybe [TyThing])
+
+hscModuleContents dflags hst hit pcs0 mod exports_only = do {
+
+ -- slurp the interface if necessary
+ (pcs1, print_unqual, maybe_rn_stuff)
+ <- slurpIface dflags hit hst pcs0 mod;
+
+ case maybe_rn_stuff of {
+ Nothing -> return (pcs0, Nothing);
+ Just (names, rn_decls) -> do {
+
+ -- Typecheck the declarations
+ maybe_pcs <-
+ typecheckExtraDecls dflags pcs1 hst print_unqual iNTERACTIVE rn_decls;
+
+ case maybe_pcs of {
+ Nothing -> return (pcs1, Nothing);
+ Just pcs2 ->
+
+ let { all_names
+ | exports_only = names
+ | otherwise =
+ let { iface = fromJust (lookupModuleEnv hit mod);
+ env = fromJust (mi_globals iface);
+ range = rdrEnvElts env;
+ } in
+ -- grab all the things from the global env that are locally def'd
+ nub [ n | elts <- range, GRE n LocalDef _ <- elts ];
+
+ pte = pcs_PTE pcs2;
+
+ ty_things = map (fromJust . lookupType hst pte) all_names;
+
+ } in
+
+ return (pcs2, Just ty_things)
+ }}}}
+#endif
+\end{code}
+
+%************************************************************************
+%* *
\subsection{Initial persistent state}
%* *
%************************************************************************