+\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}
+
+%************************************************************************
+%* *