TysWiredIn is now warning-free
[ghc-hetmet.git] / compiler / iface / BinIface.hs
index 3443e6a..d2c4083 100644 (file)
@@ -1,16 +1,17 @@
--- 
---  (c) The University of Glasgow 2002-2006
--- 
--- Binary interface file support.
-
-{-# OPTIONS_GHC -w #-}
+{-# OPTIONS -w #-}
 -- The above warning supression flag is a temporary kludge.
 -- While working on this module you are encouraged to remove it and fix
 -- any warnings in the module. See
---     http://hackage.haskell.org/trac/ghc/wiki/WorkingConventions#Warnings
+--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
 -- for details
 
-module BinIface ( writeBinIface, readBinIface, v_IgnoreHiWay ) where
+-- 
+--  (c) The University of Glasgow 2002-2006
+-- 
+-- Binary interface file support.
+
+module BinIface ( writeBinIface, readBinIface,
+                  CheckHiWay(..), TraceBinIFaceReading(..) ) where
 
 #include "HsVersions.h"
 
@@ -48,24 +49,43 @@ import Data.IORef
 import Control.Exception
 import Control.Monad
 
+data CheckHiWay = CheckHiWay | IgnoreHiWay
+    deriving Eq
+
+data TraceBinIFaceReading = TraceBinIFaceReading | QuietBinIFaceReading
+    deriving Eq
+
 -- ---------------------------------------------------------------------------
 -- Reading and writing binary interface files
 
-readBinIface :: FilePath -> TcRnIf a b ModIface
-readBinIface hi_path = do
+readBinIface :: CheckHiWay -> TraceBinIFaceReading -> FilePath
+             -> TcRnIf a b ModIface
+readBinIface checkHiWay traceBinIFaceReading hi_path = do
   nc <- getNameCache
-  (new_nc, iface) <- ioToIOEnv $ readBinIface_ hi_path nc
+  (new_nc, iface) <- liftIO $
+    readBinIface_ checkHiWay traceBinIFaceReading hi_path nc
   setNameCache new_nc
   return iface
 
-readBinIface_ :: FilePath -> NameCache -> IO (NameCache, ModIface)
-readBinIface_ hi_path nc = do
+readBinIface_ :: CheckHiWay -> TraceBinIFaceReading -> FilePath -> NameCache
+              -> IO (NameCache, ModIface)
+readBinIface_ checkHiWay traceBinIFaceReading hi_path nc = do
+  let printer :: SDoc -> IO ()
+      printer = case traceBinIFaceReading of
+                TraceBinIFaceReading -> \sd -> printSDoc sd defaultDumpStyle
+                QuietBinIFaceReading -> \_ -> return ()
+      wantedGot :: Outputable a => String -> a -> a -> IO ()
+      wantedGot what wanted got
+          = printer (text what <> text ": " <>
+                     vcat [text "Wanted " <> ppr wanted <> text ",",
+                           text "got    " <> ppr got])
   bh <- Binary.readBinMem hi_path
 
        -- Read the magic number to check that this really is a GHC .hi file
        -- (This magic number does not change when we change 
        --  GHC interface file format)
   magic <- get bh
+  wantedGot "Magic" binaryInterfaceMagic magic
   when (magic /= binaryInterfaceMagic) $
        throwDyn (ProgramError (
           "magic number mismatch: old/corrupt interface file?"))
@@ -80,6 +100,7 @@ readBinIface_ hi_path nc = do
         -- Check the interface file version and ways.
   check_ver  <- get bh
   let our_ver = show opt_HiVersion
+  wantedGot "Version" our_ver check_ver
   when (check_ver /= our_ver) $
         -- This will be caught by readIface which will emit an error
         -- msg containing the iface module name.
@@ -88,9 +109,9 @@ readBinIface_ hi_path nc = do
         ++ our_ver ++ ", found " ++ check_ver))
 
   check_way <- get bh
-  ignore_way <- readIORef v_IgnoreHiWay
   way_descr <- getWayDescr
-  when (not ignore_way && check_way /= way_descr) $
+  wantedGot "Way" way_descr check_way
+  when (checkHiWay == CheckHiWay && check_way /= way_descr) $
         -- This will be caught by readIface
         -- which will emit an error msg containing the iface module name.
      throwDyn (ProgramError (
@@ -367,8 +388,6 @@ instance Binary ModIface where
                 mi_fix_fn    = mkIfaceFixCache fixities,
                 mi_ver_fn    = mkIfaceVerCache decls })
 
-GLOBAL_VAR(v_IgnoreHiWay, False, Bool)
-
 getWayDescr :: IO String
 getWayDescr = do
   tag <- readIORef v_Build_tag
@@ -428,7 +447,7 @@ instance Binary Usage where
                        usg_exports = exps, usg_entities = ents,
                        usg_rules = rules })
 
-instance Binary a => Binary (Deprecs a) where
+instance Binary Deprecations where
     put_ bh NoDeprecs     = putByte bh 0
     put_ bh (DeprecAll t) = do
            putByte bh 1