-- -> IO (CmState, Maybe HValue)
cmGetModInfo, -- :: CmState -> (ModuleGraph, HomePackageTable)
- findModuleLinkable_maybe, -- Exported to InteractiveUI
cmSetDFlags,
cmGetBindings, -- :: CmState -> [TyThing]
cmGetPrintUnqual, -- :: CmState -> PrintUnqualified
-
- sandboxIO -- Should be somewhere else
#endif
)
where
extendModuleEnvList, extendModuleEnv,
moduleNameUserString,
ModLocation(..) )
+import RdrName ( GlobalRdrEnv, plusGlobalRdrEnv )
import GetImports
import UniqFM
import Digraph ( SCC(..), stronglyConnComp, flattenSCC, flattenSCCs )
-> [String] -- and the just the exports from these
-> IO CmState
cmSetContext cmstate toplevs exports = do
- let old_ic = cm_ic cmstate
+ let old_ic = cm_ic cmstate
+ hsc_env = cm_hsc cmstate
+ hpt = hsc_HPT hsc_env
- export_env <- mkExportEnv (cm_hsc cmstate)
- (map mkModuleName exports)
+ export_env <- mkExportEnv hsc_env (map mkModuleName exports)
+ toplev_envs <- mapM (mkTopLevEnv hpt) toplevs
- putStrLn (showSDoc (text "export env" $$ ppr export_env))
+ let all_env = foldr plusGlobalRdrEnv export_env toplev_envs
return cmstate{ cm_ic = old_ic { ic_toplev_scope = toplevs,
- ic_exports = exports,
- ic_rn_gbl_env = export_env } }
+ ic_exports = exports,
+ ic_rn_gbl_env = all_env } }
+
+mkTopLevEnv :: HomePackageTable -> String -> IO GlobalRdrEnv
+mkTopLevEnv hpt mod
+ = case lookupModuleEnvByName hpt (mkModuleName mod) of
+ Nothing -> throwDyn (ProgramError ("mkTopLevEnv: not a home module " ++ mod))
+ Just details -> case hm_globals details of
+ Nothing -> throwDyn (ProgramError ("mkTopLevEnv: not interpreted " ++ mod))
+ Just env -> return env
cmGetContext :: CmState -> IO ([String],[String])
cmGetContext CmState{cm_ic=ic} =
cmBrowseModule :: CmState -> String -> Bool -> IO [IfaceDecl]
cmBrowseModule cmstate str exports_only
- = getModuleContents (cm_hsc cmstate) (cm_ic cmstate)
- (mkModuleName str) exports_only
+ = do { mb_decls <- getModuleContents (cm_hsc cmstate) (cm_ic cmstate)
+ (mkModuleName str) exports_only
+ ; case mb_decls of
+ Nothing -> return [] -- An error of some kind
+ Just ds -> return ds
+ }
-----------------------------------------------------------------------------
where
getRootSummary :: FilePath -> IO ModSummary
getRootSummary file
- | haskellish_src_file file
+ | isHaskellSrcFilename file
= do exists <- doesFileExist file
if exists then summariseFile file else do
throwDyn (CmdLineError ("can't find file `" ++ file ++ "'"))