How to load & parse an HI (interface) file?

(GHC newbie alert -- is this the right mailing list for these kind of questions?) I"m writing some code to figure out all the instances of particular type-classes and after exploring a lot of options (hlint, haskell-src-exts, annotations, doctests, etc), I realized that the compiler had already figured it out and written it to disk for me! More digging led me to https://www.stackage.org/haddock/lts-9.0/ghc-8.0.2/LoadIface.html#v:loadSrcI... after which I got stuck. How does one call this function? Specifically: * What is SDoc and how to construct a reasonable value for this argument? * IsBootInterface would mostly be False, right? * What does `Maybe FastString` represent and how does one construct it? * Finally how does one evaluate the resulting monadic action to get access to the underlying `ModIface`? -- Saurabh.

GHC has a "--show-iface" option which pretty prints the ".hi" file. Not
sure if it works for your use-case but it may be easier to parse the text
displayed by this option.
-harendra
On 2 December 2017 at 21:29, Saurabh Nanda
(GHC newbie alert -- is this the right mailing list for these kind of questions?)
I"m writing some code to figure out all the instances of particular type-classes and after exploring a lot of options (hlint, haskell-src-exts, annotations, doctests, etc), I realized that the compiler had already figured it out and written it to disk for me!
More digging led me to https://www.stackage.org/haddock/lts-9.0/ghc-8.0.2/ LoadIface.html#v:loadSrcInterface after which I got stuck. How does one call this function? Specifically:
* What is SDoc and how to construct a reasonable value for this argument? * IsBootInterface would mostly be False, right? * What does `Maybe FastString` represent and how does one construct it? * Finally how does one evaluate the resulting monadic action to get access to the underlying `ModIface`?
-- Saurabh.
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Also, "-ddump-hi" dumps the same information at compile time.
-harendra
On 3 December 2017 at 01:50, Harendra Kumar
GHC has a "--show-iface" option which pretty prints the ".hi" file. Not sure if it works for your use-case but it may be easier to parse the text displayed by this option.
-harendra
On 2 December 2017 at 21:29, Saurabh Nanda
wrote: (GHC newbie alert -- is this the right mailing list for these kind of questions?)
I"m writing some code to figure out all the instances of particular type-classes and after exploring a lot of options (hlint, haskell-src-exts, annotations, doctests, etc), I realized that the compiler had already figured it out and written it to disk for me!
More digging led me to https://www.stackage.org/haddo ck/lts-9.0/ghc-8.0.2/LoadIface.html#v:loadSrcInterface after which I got stuck. How does one call this function? Specifically:
* What is SDoc and how to construct a reasonable value for this argument? * IsBootInterface would mostly be False, right? * What does `Maybe FastString` represent and how does one construct it? * Finally how does one evaluate the resulting monadic action to get access to the underlying `ModIface`?
-- Saurabh.
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

GHC has a "--show-iface" option which pretty prints the ".hi" file. Not
sure if it works for your use-case but it may be easier to parse the text displayed by this option.
From https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/IfaceFiles --
This textual format is not particularly designed for machine parsing. Doing so might be possible, but if you want to read GHC interface files you are almost certainly better off using the GHC API https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/API to do so.
That's the reason why I started investigating the GHC API. -- Saurabh.

I would be cautious about using the ghc-api hi file interfaces; hi files
turn out to interact with a lot of low-level parts in complex ways (even to
the extent that they're a large part of why ghc can't parallelize builds
itself and attempts to change that have mostly failed).
But if you must do this, you *really* want to have
https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler ready to hand ---
and go through it first so you have some idea of how it works; much of it
is links to the lower level details (often straight into the source).
On Sat, Dec 2, 2017 at 10:59 AM, Saurabh Nanda
(GHC newbie alert -- is this the right mailing list for these kind of questions?)
I"m writing some code to figure out all the instances of particular type-classes and after exploring a lot of options (hlint, haskell-src-exts, annotations, doctests, etc), I realized that the compiler had already figured it out and written it to disk for me!
More digging led me to https://www.stackage.org/haddock/lts-9.0/ghc-8.0.2/ LoadIface.html#v:loadSrcInterface after which I got stuck. How does one call this function? Specifically:
* What is SDoc and how to construct a reasonable value for this argument? * IsBootInterface would mostly be False, right? * What does `Maybe FastString` represent and how does one construct it? * Finally how does one evaluate the resulting monadic action to get access to the underlying `ModIface`?
-- Saurabh.
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
-- brandon s allbery kf8nh sine nomine associates allbery.b@gmail.com ballbery@sinenomine.net unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net

I would be cautious about using the ghc-api hi file interfaces; hi files turn out to interact with a lot of low-level parts in complex ways (even to the extent that they're a large part of why ghc can't parallelize builds itself and attempts to change that have mostly failed).
Are you cautioning against using the GHC API (as opposed to the
--show-iface command line interface)
or using HI files themselves?
-- Saurabh.
On Sun, Dec 3, 2017 at 2:04 AM, Brandon Allbery
I would be cautious about using the ghc-api hi file interfaces; hi files turn out to interact with a lot of low-level parts in complex ways (even to the extent that they're a large part of why ghc can't parallelize builds itself and attempts to change that have mostly failed).
But if you must do this, you *really* want to have https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler ready to hand --- and go through it first so you have some idea of how it works; much of it is links to the lower level details (often straight into the source).
On Sat, Dec 2, 2017 at 10:59 AM, Saurabh Nanda
wrote: (GHC newbie alert -- is this the right mailing list for these kind of questions?)
I"m writing some code to figure out all the instances of particular type-classes and after exploring a lot of options (hlint, haskell-src-exts, annotations, doctests, etc), I realized that the compiler had already figured it out and written it to disk for me!
More digging led me to https://www.stackage.org/haddo ck/lts-9.0/ghc-8.0.2/LoadIface.html#v:loadSrcInterface after which I got stuck. How does one call this function? Specifically:
* What is SDoc and how to construct a reasonable value for this argument? * IsBootInterface would mostly be False, right? * What does `Maybe FastString` represent and how does one construct it? * Finally how does one evaluate the resulting monadic action to get access to the underlying `ModIface`?
-- Saurabh.
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
-- brandon s allbery kf8nh sine nomine associates allbery.b@gmail.com ballbery@sinenomine.net unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net

I _think_ I've found what I need from
https://github.com/ghc/ghc/blob/8843a39b3c941b1908a8d839f52bc323f3b45081/com...
On Sun, Dec 3, 2017 at 7:41 AM, Saurabh Nanda
I would be cautious about using the ghc-api hi file interfaces; hi files turn out to interact with a lot of low-level parts in complex ways (even to the extent that they're a large part of why ghc can't parallelize builds itself and attempts to change that have mostly failed).
Are you cautioning against using the GHC API (as opposed to the --show-iface command line interface) or using HI files themselves?
-- Saurabh.
On Sun, Dec 3, 2017 at 2:04 AM, Brandon Allbery
wrote: I would be cautious about using the ghc-api hi file interfaces; hi files turn out to interact with a lot of low-level parts in complex ways (even to the extent that they're a large part of why ghc can't parallelize builds itself and attempts to change that have mostly failed).
But if you must do this, you *really* want to have https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler ready to hand --- and go through it first so you have some idea of how it works; much of it is links to the lower level details (often straight into the source).
On Sat, Dec 2, 2017 at 10:59 AM, Saurabh Nanda
wrote: (GHC newbie alert -- is this the right mailing list for these kind of questions?)
I"m writing some code to figure out all the instances of particular type-classes and after exploring a lot of options (hlint, haskell-src-exts, annotations, doctests, etc), I realized that the compiler had already figured it out and written it to disk for me!
More digging led me to https://www.stackage.org/haddo ck/lts-9.0/ghc-8.0.2/LoadIface.html#v:loadSrcInterface after which I got stuck. How does one call this function? Specifically:
* What is SDoc and how to construct a reasonable value for this argument? * IsBootInterface would mostly be False, right? * What does `Maybe FastString` represent and how does one construct it? * Finally how does one evaluate the resulting monadic action to get access to the underlying `ModIface`?
-- Saurabh.
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
-- brandon s allbery kf8nh sine nomine associates allbery.b@gmail.com ballbery@sinenomine.net unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net

The problem with the API is it's complex and can break between ghc versions.
But --show-iface is even more fragile and prone to break between ghc
versions.
The history of the plugins package constitutes a record of both kinds of
pain.
On Sat, Dec 2, 2017 at 9:11 PM, Saurabh Nanda
I would be cautious about using the ghc-api hi file interfaces; hi files turn out to interact with a lot of low-level parts in complex ways (even to the extent that they're a large part of why ghc can't parallelize builds itself and attempts to change that have mostly failed).
Are you cautioning against using the GHC API (as opposed to the --show-iface command line interface) or using HI files themselves?
-- Saurabh.
On Sun, Dec 3, 2017 at 2:04 AM, Brandon Allbery
wrote: I would be cautious about using the ghc-api hi file interfaces; hi files turn out to interact with a lot of low-level parts in complex ways (even to the extent that they're a large part of why ghc can't parallelize builds itself and attempts to change that have mostly failed).
But if you must do this, you *really* want to have https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler ready to hand --- and go through it first so you have some idea of how it works; much of it is links to the lower level details (often straight into the source).
On Sat, Dec 2, 2017 at 10:59 AM, Saurabh Nanda
wrote: (GHC newbie alert -- is this the right mailing list for these kind of questions?)
I"m writing some code to figure out all the instances of particular type-classes and after exploring a lot of options (hlint, haskell-src-exts, annotations, doctests, etc), I realized that the compiler had already figured it out and written it to disk for me!
More digging led me to https://www.stackage.org/haddo ck/lts-9.0/ghc-8.0.2/LoadIface.html#v:loadSrcInterface after which I got stuck. How does one call this function? Specifically:
* What is SDoc and how to construct a reasonable value for this argument? * IsBootInterface would mostly be False, right? * What does `Maybe FastString` represent and how does one construct it? * Finally how does one evaluate the resulting monadic action to get access to the underlying `ModIface`?
-- Saurabh.
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
-- brandon s allbery kf8nh sine nomine associates allbery.b@gmail.com ballbery@sinenomine.net unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net
-- brandon s allbery kf8nh sine nomine associates allbery.b@gmail.com ballbery@sinenomine.net unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net

Hey,
there's this relatively recent thread on finding instances of a type class:
https://mail.haskell.org/pipermail/ghc-devs/2017-May/014217.html
I'm sorry, but I couldn't find a better archive for ghc-devs.
Enjoy
Sebastian
On Sun, Dec 3, 2017 at 3:43 AM, Brandon Allbery
The problem with the API is it's complex and can break between ghc versions. But --show-iface is even more fragile and prone to break between ghc versions. The history of the plugins package constitutes a record of both kinds of pain.
On Sat, Dec 2, 2017 at 9:11 PM, Saurabh Nanda
wrote: I would be cautious about using the ghc-api hi file interfaces; hi files turn out to interact with a lot of low-level parts in complex ways (even to the extent that they're a large part of why ghc can't parallelize builds itself and attempts to change that have mostly failed).
Are you cautioning against using the GHC API (as opposed to the --show-iface command line interface) or using HI files themselves?
-- Saurabh.
On Sun, Dec 3, 2017 at 2:04 AM, Brandon Allbery
wrote: I would be cautious about using the ghc-api hi file interfaces; hi files turn out to interact with a lot of low-level parts in complex ways (even to the extent that they're a large part of why ghc can't parallelize builds itself and attempts to change that have mostly failed).
But if you must do this, you *really* want to have https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler ready to hand --- and go through it first so you have some idea of how it works; much of it is links to the lower level details (often straight into the source).
On Sat, Dec 2, 2017 at 10:59 AM, Saurabh Nanda
wrote: (GHC newbie alert -- is this the right mailing list for these kind of questions?)
I"m writing some code to figure out all the instances of particular type-classes and after exploring a lot of options (hlint, haskell-src-exts, annotations, doctests, etc), I realized that the compiler had already figured it out and written it to disk for me!
More digging led me to https://www.stackage.org/haddo ck/lts-9.0/ghc-8.0.2/LoadIface.html#v:loadSrcInterface after which I got stuck. How does one call this function? Specifically:
* What is SDoc and how to construct a reasonable value for this argument? * IsBootInterface would mostly be False, right? * What does `Maybe FastString` represent and how does one construct it? * Finally how does one evaluate the resulting monadic action to get access to the underlying `ModIface`?
-- Saurabh.
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
-- brandon s allbery kf8nh sine nomine associates allbery.b@gmail.com ballbery@sinenomine.net unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net
-- brandon s allbery kf8nh sine nomine associates allbery.b@gmail.com ballbery@sinenomine.net unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
participants (4)
-
Brandon Allbery
-
Harendra Kumar
-
Saurabh Nanda
-
Sebastian Graf