
Hi, I am currently in the process of porting some of the Haskell Refactorer (HaRe) over to ghc 6.6. Part of HaRe requires the API and until now I've been content with using th 6.5 API. However, since I've started the switch I've noticed some strange problems and the latest is I am getting the following error when trying to find the type of an expression: <interactive>:1:0: Can't find interface-file declaration for Main.main Probable cause: bug in .hi-boot file, or inconsistent .hi file Use -ddump-if-trace to get an idea of which file caused the error I have attached the code and would appreciate if someone could point me in the right direction. Basically I just want to find the type of a particular expression within a file. This used to work but now seems to fail. The code is compiled with: ghc --make -package ghc-6.6 -o main hasktags.hs and run with ./main Main.hs The file main can have anything in it really - I'm just using it to find a type of some function called main. Thanks for you help! Chris Brown.

Hi Chris, On Fri, Nov 10, 2006 at 04:15:10PM +0000, C.M.Brown wrote:
I am currently in the process of porting some of the Haskell Refactorer (HaRe) over to ghc 6.6. Part of HaRe requires the API and until now I've been content with using th 6.5 API. However, since I've started the switch I've noticed some strange problems and the latest is I am getting the following error when trying to find the type of an expression:
<interactive>:1:0: Can't find interface-file declaration for Main.main Probable cause: bug in .hi-boot file, or inconsistent .hi file Use -ddump-if-trace to get an idea of which file caused the error
Attached is a smaller module showing the same thing, along with the (trivial) Main.hs I was testing with. If I tell it to use Interactive mode then all is well: $ ./hasktags Interactive Main.hs Loading package base ... linking ... done. [1 of 1] Compiling Main ( Main.hs, Main.o ) Just GHC.IOBase.IO () but if I tell it to use JustTypecheck mode then it breaks: $ ./hasktags JustTypecheck Main.hs [1 of 1] Compiling Main ( Main.hs, Main.o ) <interactive>:1:0: Can't find interface-file declaration for variable Main.main Probable cause: bug in .hi-boot file, or inconsistent .hi file Use -ddump-if-trace to get an idea of which file caused the error Nothing (remove *.hi *.o between runs) So it looks like using Interactive mode should allow you to get on for now. ghc --show-iface Main.hi gives interface main:Main 1 6070 where export main:Main main module dependencies: package dependencies: base orphans: base:GHC.Base family instance modules: main :: GHC.IOBase.IO () main :: GHC.IOBase.IO () in the first case, but the last two lines are missing in the second. This raises a few questions: Are there meant to be two "main :: GHC.IOBase.IO ()" lines when it works? Should it work with JustTypecheck? It looks like the point of JustTypecheck is that IDEs should be able to ask the type of something actually written in the file, but would it actually be more expensive to allow the information to be used to type other expressions? Should JustTypecheck be generating a .hi and .o file at all? It seems wrong to me. Simons? Thanks Ian

Hi Ian, After some playing around and hacking of my code, I finally got it to work. The problem is that the hscTarget flag needs to be set to HscNothing when running in the JustTypeCheck mode: GHC.setSessionDynFlags ses $ dflags1 {verbosity = 1, hscTarget=HscNothing} If you change the above line everything works. Something very subtle that I compeletely overlooked. Thanks for your help. Chris. On Sat, 25 Nov 2006, Ian Lynagh wrote:
Hi Chris,
On Fri, Nov 10, 2006 at 04:15:10PM +0000, C.M.Brown wrote:
I am currently in the process of porting some of the Haskell Refactorer (HaRe) over to ghc 6.6. Part of HaRe requires the API and until now I've been content with using th 6.5 API. However, since I've started the switch I've noticed some strange problems and the latest is I am getting the following error when trying to find the type of an expression:
<interactive>:1:0: Can't find interface-file declaration for Main.main Probable cause: bug in .hi-boot file, or inconsistent .hi file Use -ddump-if-trace to get an idea of which file caused the error
Attached is a smaller module showing the same thing, along with the (trivial) Main.hs I was testing with.
If I tell it to use Interactive mode then all is well:
$ ./hasktags Interactive Main.hs Loading package base ... linking ... done. [1 of 1] Compiling Main ( Main.hs, Main.o ) Just GHC.IOBase.IO ()
but if I tell it to use JustTypecheck mode then it breaks:
$ ./hasktags JustTypecheck Main.hs [1 of 1] Compiling Main ( Main.hs, Main.o )
<interactive>:1:0: Can't find interface-file declaration for variable Main.main Probable cause: bug in .hi-boot file, or inconsistent .hi file Use -ddump-if-trace to get an idea of which file caused the error Nothing
(remove *.hi *.o between runs)
So it looks like using Interactive mode should allow you to get on for now.
ghc --show-iface Main.hi gives
interface main:Main 1 6070 where export main:Main main module dependencies: package dependencies: base orphans: base:GHC.Base family instance modules: main :: GHC.IOBase.IO () main :: GHC.IOBase.IO ()
in the first case, but the last two lines are missing in the second.
This raises a few questions:
Are there meant to be two "main :: GHC.IOBase.IO ()" lines when it works?
Should it work with JustTypecheck? It looks like the point of JustTypecheck is that IDEs should be able to ask the type of something actually written in the file, but would it actually be more expensive to allow the information to be used to type other expressions?
Should JustTypecheck be generating a .hi and .o file at all? It seems wrong to me.
Simons?
Thanks Ian

C.M.Brown wrote:
Hi Ian,
After some playing around and hacking of my code, I finally got it to work. The problem is that the hscTarget flag needs to be set to HscNothing when running in the JustTypeCheck mode:
GHC.setSessionDynFlags ses $ dflags1 {verbosity = 1, hscTarget=HscNothing}
Yes, the HscTarget thing is something of a wart. I started to clean it up, but didn't get around to finishing it yet. Here's the relevant ticket: http://hackage.haskell.org/trac/ghc/ticket/276 Cheers, Simon
If you change the above line everything works. Something very subtle that I compeletely overlooked.
Thanks for your help. Chris.
On Sat, 25 Nov 2006, Ian Lynagh wrote:
Hi Chris,
On Fri, Nov 10, 2006 at 04:15:10PM +0000, C.M.Brown wrote:
I am currently in the process of porting some of the Haskell Refactorer (HaRe) over to ghc 6.6. Part of HaRe requires the API and until now I've been content with using th 6.5 API. However, since I've started the switch I've noticed some strange problems and the latest is I am getting the following error when trying to find the type of an expression:
<interactive>:1:0: Can't find interface-file declaration for Main.main Probable cause: bug in .hi-boot file, or inconsistent .hi file Use -ddump-if-trace to get an idea of which file caused the error
Attached is a smaller module showing the same thing, along with the (trivial) Main.hs I was testing with.
If I tell it to use Interactive mode then all is well:
$ ./hasktags Interactive Main.hs Loading package base ... linking ... done. [1 of 1] Compiling Main ( Main.hs, Main.o ) Just GHC.IOBase.IO ()
but if I tell it to use JustTypecheck mode then it breaks:
$ ./hasktags JustTypecheck Main.hs [1 of 1] Compiling Main ( Main.hs, Main.o )
<interactive>:1:0: Can't find interface-file declaration for variable Main.main Probable cause: bug in .hi-boot file, or inconsistent .hi file Use -ddump-if-trace to get an idea of which file caused the error Nothing
(remove *.hi *.o between runs)
So it looks like using Interactive mode should allow you to get on for now.
ghc --show-iface Main.hi gives
interface main:Main 1 6070 where export main:Main main module dependencies: package dependencies: base orphans: base:GHC.Base family instance modules: main :: GHC.IOBase.IO () main :: GHC.IOBase.IO ()
in the first case, but the last two lines are missing in the second.
This raises a few questions:
Are there meant to be two "main :: GHC.IOBase.IO ()" lines when it works?
Should it work with JustTypecheck? It looks like the point of JustTypecheck is that IDEs should be able to ask the type of something actually written in the file, but would it actually be more expensive to allow the information to be used to type other expressions?
Should JustTypecheck be generating a .hi and .o file at all? It seems wrong to me.
Simons?
Thanks Ian
participants (3)
-
C.M.Brown
-
Ian Lynagh
-
Simon Marlow