<div dir="ltr"><div>Hey Sam,</div><div><br></div><div>Starting from the implementation of :browse and going through the call graph in:<br><a href="https://gitlab.haskell.org/ghc/ghc/blob/master/ghc/GHCi/UI.hs" target="_blank">https://gitlab.haskell.org/ghc/ghc/blob/master/ghc/GHCi/UI.hs </a></div><div>gave the following, which works for me:</div><span style="font-family:courier new,monospace"><br></span><div><span style="font-family:courier new,monospace">module Main where<br><br>import           Control.Monad<br>import           Control.Monad.IO.Class<br><br>import           BasicTypes<br>import           DynFlags<br>import           GHC<br>import           GHC.Paths              (libdir)<br>import           Maybes<br>import           Panic<br><br>main = runGhc (Just libdir) $ do<br>  dflags <- getSessionDynFlags<br>  void $ setSessionDynFlags $ dflags {<br>      hscTarget = HscInterpreted<br>    , ghcLink   = LinkInMemory<br>    }<br>  t <- guessTarget "Main.hs" Nothing<br>  setTargets [t]<br>  _ <- load LoadAllTargets<br><br>  graph <- getModuleGraph<br>  mss <- filterM (isLoaded . ms_mod_name) (mgModSummaries graph)<br>  let m = ms_mod ms<br>      ms = head mss<br>  liftIO . putStrLn $ (show . length $ mss) ++ " modules loaded"<br>  mi <- getModuleInfo m<br>  let mod_info = fromJust mi<br>  dflags <- getDynFlags<br>  let names = GHC.modInfoTopLevelScope mod_info `orElse` []<br><br>  liftIO $ putStrLn $ "seen " <> (show $ length names) <> " Names"</span><br></div><div><br></div><div>--</div><div>Best, Artem<br> </div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 2 Aug 2019 at 15:47, Sam Halliday <<a href="mailto:sam.halliday@gmail.com" target="_blank">sam.halliday@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">To answer my own question with a solution and another question:<br>
<br>
Sam Halliday writes:<br>
> I'm mostly interested in gathering information about symbols and their<br>
> type signatures. As a first exercise: given a module+import section<br>
> for a haskell source file, I want to find out which symbols (and their<br>
> types) are available. Like :browse in ghci, but programmatically.<br>
<br>
This is answered by Stephen Diehl's blog post on the ghc api! How lucky<br>
I am: <a href="http://www.stephendiehl.com/posts/ghc_01.html" rel="noreferrer" target="_blank">http://www.stephendiehl.com/posts/ghc_01.html</a><br>
<br>
He points to getNamesInScope<br>
<br>
Unfortunately I'm getting zero Names back when loading a file that<br>
imports several modules from ghc. Is there something I'm missing in the<br>
following?<br>
<br>
module Main where<br>
<br>
import           Control.Monad<br>
import           Control.Monad.IO.Class<br>
import           GHC<br>
import           GHC.Paths              (libdir)<br>
<br>
main = runGhc (Just libdir) $ do<br>
  dflags <- getSessionDynFlags<br>
  void $ setSessionDynFlags $ dflags {<br>
      hscTarget = HscInterpreted<br>
    , ghcLink   = LinkInMemory<br>
    }<br>
  addTarget $ Target (TargetFile "exe/Main.hs" Nothing) False Nothing<br>
  res <- load LoadAllTargets<br>
  liftIO $ putStrLn $ showPpr dflags res<br>
  names <- getNamesInScope<br>
  liftIO $ putStrLn $ "seen " <> (show $ length names) <> " Names"<br>
<br>
<br>
-- <br>
Best regards,<br>
Sam<br>
_______________________________________________<br>
ghc-devs mailing list<br>
<a href="mailto:ghc-devs@haskell.org" target="_blank">ghc-devs@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs</a><br>
</blockquote></div>