api to access .hi files

Sam Halliday sam.halliday at gmail.com
Fri Aug 2 21:30:58 UTC 2019


Brandon Allbery <allbery.b at gmail.com> writes:

> No, those are in base. But I don't think you would be seeing imported names
> as such there, come to think of it, only names declared locally.

Hmm, then perhaps I misunderstand what it's doing.

If I do what I thought might be the equivalent ghci command

    λ> :l exe/Main.hs
    [1 of 1] Compiling Main             ( exe/Main.hs, interpreted )
    Ok, one module loaded.
    λ> :browse
    main :: IO ()

we see one symbol. So this is already different to what my application
is doing.

But the information I want is when we do something like

    λ> :browse! *Main
    ... everything in scope including Prelude and GHC ...


An option I have considered would be to manually parse the import
sections and then perform the Module lookup via the pkg database, but
that approach has many flaws because it means reimplementing a lot of
the early compilation stages manually and I'm sure dealing with explicit
import lists (and hiding, not to mention dealing with lang extensions
such as TypeOperators) is probably quite tricky to get right.

>
> On Fri, Aug 2, 2019 at 4:06 PM Sam Halliday <sam.halliday at gmail.com> wrote:
>
>> Brandon Allbery <allbery.b at gmail.com> writes:
>>
>> > At a guess, because the ghc package defaults to being hidden (it's
>> creating
>> > a new ghc instance at runtime, so the visibility of the ghc package when
>> > compiling your code is not relevant) you need to do the ghc-api
>> equivalent
>> > of "-package ghc". Or for testing just "ghc-pkg expose ghc".
>>
>> Hmm, would that also explain why the Prelude and Control.Monad modules
>> are not shown either?
>>
>> Is there a way to expose all modules programmatically?
>>
>>
>> >
>> > On Fri, Aug 2, 2019 at 3:47 PM Sam Halliday <sam.halliday at gmail.com>
>> wrote:
>> >
>> >> To answer my own question with a solution and another question:
>> >>
>> >> Sam Halliday writes:
>> >> > I'm mostly interested in gathering information about symbols and their
>> >> > type signatures. As a first exercise: given a module+import section
>> >> > for a haskell source file, I want to find out which symbols (and their
>> >> > types) are available. Like :browse in ghci, but programmatically.
>> >>
>> >> This is answered by Stephen Diehl's blog post on the ghc api! How lucky
>> >> I am: http://www.stephendiehl.com/posts/ghc_01.html
>> >>
>> >> He points to getNamesInScope
>> >>
>> >> Unfortunately I'm getting zero Names back when loading a file that
>> >> imports several modules from ghc. Is there something I'm missing in the
>> >> following?
>> >>
>> >> module Main where
>> >>
>> >> import           Control.Monad
>> >> import           Control.Monad.IO.Class
>> >> import           GHC
>> >> import           GHC.Paths              (libdir)
>> >>
>> >> main = runGhc (Just libdir) $ do
>> >>   dflags <- getSessionDynFlags
>> >>   void $ setSessionDynFlags $ dflags {
>> >>       hscTarget = HscInterpreted
>> >>     , ghcLink   = LinkInMemory
>> >>     }
>> >>   addTarget $ Target (TargetFile "exe/Main.hs" Nothing) False Nothing
>> >>   res <- load LoadAllTargets
>> >>   liftIO $ putStrLn $ showPpr dflags res
>> >>   names <- getNamesInScope
>> >>   liftIO $ putStrLn $ "seen " <> (show $ length names) <> " Names"
>> >>
>> >>
>> >> --
>> >> Best regards,
>> >> Sam
>> >> _______________________________________________
>> >> ghc-devs mailing list
>> >> ghc-devs at haskell.org
>> >> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>> >>
>> >
>> >
>> > --
>> > brandon s allbery kf8nh
>> > allbery.b at gmail.com
>>
>> --
>> Best regards,
>> Sam
>>
>
>
> -- 
> brandon s allbery kf8nh
> allbery.b at gmail.com

-- 
Best regards,
Sam
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 194 bytes
Desc: not available
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20190802/05f2679e/attachment.sig>


More information about the ghc-devs mailing list