Hello community,

here is the log from the commit of package ghc-haskell-gi for openSUSE:Factory 
checked in at 2017-06-22 10:37:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-haskell-gi (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-haskell-gi.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-haskell-gi"

Thu Jun 22 10:37:36 2017 rev:3 rq:504070 version:0.20.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-haskell-gi/ghc-haskell-gi.changes    
2017-05-03 15:56:08.477110124 +0200
+++ /work/SRC/openSUSE:Factory/.ghc-haskell-gi.new/ghc-haskell-gi.changes       
2017-06-22 10:37:37.261070900 +0200
@@ -1,0 +2,5 @@
+Thu Jun  8 11:08:16 UTC 2017 - psim...@suse.com
+
+- Update to version 0.20.2.
+
+-------------------------------------------------------------------

Old:
----
  haskell-gi-0.20.1.tar.gz

New:
----
  haskell-gi-0.20.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-haskell-gi.spec ++++++
--- /var/tmp/diff_new_pack.AW7ib5/_old  2017-06-22 10:37:37.900980688 +0200
+++ /var/tmp/diff_new_pack.AW7ib5/_new  2017-06-22 10:37:37.900980688 +0200
@@ -19,7 +19,7 @@
 %global pkg_name haskell-gi
 %bcond_with tests
 Name:           ghc-%{pkg_name}
-Version:        0.20.1
+Version:        0.20.2
 Release:        0
 Summary:        Generate Haskell bindings for GObject Introspection capable 
libraries
 License:        LGPL-2.1+

++++++ haskell-gi-0.20.1.tar.gz -> haskell-gi-0.20.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/ChangeLog.md 
new/haskell-gi-0.20.2/ChangeLog.md
--- old/haskell-gi-0.20.1/ChangeLog.md  2017-03-27 22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/ChangeLog.md  2017-06-03 12:00:54.000000000 +0200
@@ -1,11 +1,15 @@
+### 0.20.2
+
++ Fixes for GHC 8.2.1.
+
 ### 0.20.1
 
-       + gtk-doc parser and haddock generator: while no means perfect,
-       now the autogenerated bindings come with some reasonable
-       autogenerated documentation.
++ gtk-doc parser and haddock generator: while by no means perfect,
+now the autogenerated bindings come with some reasonable
+autogenerated documentation.
 
-       + Many bugfixes. A particularly important one is for
-       [issue 82](https://github.com/haskell-gi/haskell-gi/issues/82), which
-       made compilation of
-       [gi-glib](http://hackage.haskell.org/package/gi-glib) fail, for
-       the latest version of gobject-introspection.
++ Many bugfixes. A particularly important one is for
+[issue 82](https://github.com/haskell-gi/haskell-gi/issues/82), which
+made compilation of
+[gi-glib](http://hackage.haskell.org/package/gi-glib) fail, for
+the latest version of gobject-introspection.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/cmdline/haskell-gi.hs 
new/haskell-gi-0.20.2/cmdline/haskell-gi.hs
--- old/haskell-gi-0.20.1/cmdline/haskell-gi.hs 2017-03-27 22:44:51.000000000 
+0200
+++ new/haskell-gi-0.20.2/cmdline/haskell-gi.hs 2017-06-03 12:00:54.000000000 
+0200
@@ -5,6 +5,7 @@
 #endif
 import Control.Monad (forM_, when, (>=>))
 import Control.Exception (handle)
+import Control.Applicative ((<|>))
 
 import Data.Char (toLower)
 import Data.Bool (bool)
@@ -71,6 +72,17 @@
   let (a, '=':b) = break (=='=') s
    in (a, b)
 
+solveNameVersion::Overrides -> Text -> (Text, Maybe Text)
+solveNameVersion ovs name = (nameWithoutVersion, version)
+ where
+   namePieces = T.splitOn "-" name
+   nameWithoutVersion = head namePieces
+   versionInName = if length namePieces == 2
+                     then Just (last namePieces)
+                     else Nothing
+   versionInOverride = M.lookup nameWithoutVersion (nsChooseVersion ovs)
+   version = versionInOverride <|> versionInName
+
 optDescrs :: [OptDescr (Options -> Options)]
 optDescrs = [
   Option "h" ["help"] (NoArg $ \opt -> opt { optMode = Help })
@@ -118,8 +130,8 @@
 -- | Load a dependency without further postprocessing.
 loadRawAPIs :: Bool -> Overrides -> [FilePath] -> Text -> IO [(Name, API)]
 loadRawAPIs verbose ovs extraPaths name = do
-  let version = M.lookup name (nsChooseVersion ovs)
-  gir <- loadRawGIRInfo verbose name version extraPaths
+  let (nameWithoutVersion, version) = solveNameVersion ovs name
+  gir <- loadRawGIRInfo verbose nameWithoutVersion version extraPaths
   return (girAPIs gir)
 
 -- | Set up the flags for the code generator.
@@ -165,18 +177,18 @@
 -- for this module.
 processMod :: Options -> Overrides -> [FilePath] -> Text -> IO ()
 processMod options ovs extraPaths name = do
-  let version = M.lookup name (nsChooseVersion ovs)
-      cfg = Config {modName = name,
+  let (nameWithoutVersion, version) = solveNameVersion ovs name
+      cfg = Config {modName = nameWithoutVersion,
                     verbose = optVerbose options,
                     overrides = ovs,
                     cgFlags = genFlags options
                    }
-      nm = ucFirst name
+      nm = ucFirst nameWithoutVersion
       mp = T.unpack . ("GI." <>)
 
   putStrLn $ "\t* Generating " ++ mp nm
 
-  (gir, girDeps) <- loadGIRInfo (optVerbose options) name version extraPaths
+  (gir, girDeps) <- loadGIRInfo (optVerbose options) nameWithoutVersion 
version extraPaths
                     (girFixups ovs)
   let (apis, deps) = filterAPIsAndDeps ovs gir girDeps
       allAPIs = M.union apis deps
@@ -193,7 +205,7 @@
                              ++ cabal ++ ".new instead") >>
                    return (cabal ++ ".new"))
     -- The module is not a dep of itself
-    let usedDeps = S.delete name modDeps
+    let usedDeps = S.delete nameWithoutVersion modDeps
         -- We only list as dependencies in the cabal file the
         -- dependencies that we use, disregarding what the .gir file says.
         actualDeps = filter ((`S.member` usedDeps) . girNSName) girDeps
@@ -216,8 +228,8 @@
 
 dump :: Options -> Overrides -> Text -> IO ()
 dump options ovs name = do
-  let version = M.lookup name (nsChooseVersion ovs)
-  (doc, _) <- loadGIRInfo (optVerbose options) name version (optSearchPaths 
options) []
+  let (nameWithoutVersion, version) = solveNameVersion ovs name
+  (doc, _) <- loadGIRInfo (optVerbose options) nameWithoutVersion version 
(optSearchPaths options) []
   mapM_ (putStrLn . ppShow) (girAPIs doc)
 
 process :: Options -> [Text] -> IO ()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/haskell-gi.cabal 
new/haskell-gi-0.20.2/haskell-gi.cabal
--- old/haskell-gi-0.20.1/haskell-gi.cabal      2017-03-27 22:44:51.000000000 
+0200
+++ new/haskell-gi-0.20.2/haskell-gi.cabal      2017-06-03 12:00:54.000000000 
+0200
@@ -1,5 +1,5 @@
 name:                haskell-gi
-version:             0.20.1
+version:             0.20.2
 synopsis:            Generate Haskell bindings for GObject Introspection 
capable libraries
 description:         Generate Haskell bindings for GObject Introspection 
capable libraries. This includes most notably
                      Gtk+, but many other libraries in the GObject ecosystem 
provide introspection data too.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/CabalHooks.hs 
new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/CabalHooks.hs
--- old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/CabalHooks.hs     2017-03-27 
22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/CabalHooks.hs     2017-06-03 
12:00:54.000000000 +0200
@@ -8,8 +8,13 @@
 import Distribution.Simple.LocalBuildInfo
 import Distribution.Simple.Setup
 import Distribution.Simple (UserHooks(..), simpleUserHooks,
-                            defaultMainWithHooks, OptimisationLevel(..),
-                            Dependency(..), PackageName(..))
+                            defaultMainWithHooks, OptimisationLevel(..))
+#if !MIN_VERSION_Cabal(2,0,0)
+import Distribution.Simple (Dependency(..), PackageName(..), unPackageName)
+#else
+import Distribution.Types.PkgconfigDependency (PkgconfigDependency(..))
+import Distribution.Types.PkgconfigName (unPkgconfigName)
+#endif
 import Distribution.PackageDescription
 
 import Data.GI.CodeGen.API (loadGIRInfo)
@@ -37,10 +42,21 @@
 type ConfHook = (GenericPackageDescription, HookedBuildInfo) -> ConfigFlags
               -> IO LocalBuildInfo
 
+#if !MIN_VERSION_Cabal(2,0,0)
+#define PkgconfigDependency Dependency
+
+unPkgconfigName :: PackageName -> String
+unPkgconfigName = unPackageName
+
+unFlagName :: FlagName -> String
+unFlagName (FlagName n) = n
+#endif
+
 -- | Generate the @PkgInfo@ module, listing the build information for
 -- the module. We include in particular the versions for the
 -- `pkg-config` dependencies of the module.
-genPkgInfo :: [Dependency] -> [(FlagName, Bool)] -> FilePath -> Text -> IO ()
+genPkgInfo :: [PkgconfigDependency] -> [(FlagName, Bool)] -> FilePath -> Text
+           -> IO ()
 genPkgInfo deps flags fName modName = do
   versions <- mapM findVersion deps
   utf8WriteFile fName $ T.unlines
@@ -54,14 +70,14 @@
          , "flags :: [(String, Bool)]"
          , "flags = " <> tshow flags'
          ]
-    where findVersion :: Dependency -> IO (Text, Text)
-          findVersion (Dependency (PackageName n) _) =
-              tryPkgConfig (T.pack n) >>= \case
+    where findVersion :: PkgconfigDependency -> IO (Text, Text)
+          findVersion (PkgconfigDependency n _) =
+              tryPkgConfig (T.pack (unPkgconfigName n)) >>= \case
                   Just v -> return v
-                  Nothing -> error ("Could not determine version for required 
pkg-config module \"" <> n <> "\".")
+                  Nothing -> error ("Could not determine version for required 
pkg-config module \"" <> (unPkgconfigName n) <> "\".")
 
           flags' :: [(String, Bool)]
-          flags' = map (\(FlagName fn, v) -> (fn, v)) flags
+          flags' = map (\(f, v) -> (unFlagName f, v)) flags
 
 -- | Parse the set of flags given to configure into flags for the code
 -- generator.
@@ -78,7 +94,7 @@
           check s = fromMaybe True (M.lookup s flags)
 
           flags :: M.Map String Bool
-          flags = M.fromList (map (\(FlagName fn, v) -> (fn, v)) fs)
+          flags = M.fromList (map (\(f, v) -> (unFlagName f, v)) fs)
 
 -- | A convenience helper for `confHook`, such that bindings for the
 -- given module are generated in the @configure@ step of @cabal@.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Callable.hs 
new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Callable.hs
--- old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Callable.hs       2017-03-27 
22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Callable.hs       2017-06-03 
12:00:54.000000000 +0200
@@ -29,7 +29,6 @@
 import Data.Maybe (isJust)
 import Data.Monoid ((<>))
 import Data.Tuple (swap)
-import Data.Typeable (TypeRep, typeOf)
 import qualified Data.Map as Map
 import qualified Data.Text as T
 import Data.Text (Text)
@@ -55,9 +54,9 @@
 hOutType :: Callable -> [Arg] -> ExcCodeGen TypeRep
 hOutType callable outArgs = do
   hReturnType <- case returnType callable of
-                   Nothing -> return $ typeOf ()
+                   Nothing -> return $ con0 "()"
                    Just r -> if skipRetVal callable
-                             then return $ typeOf ()
+                             then return $ con0 "()"
                              else haskellType r
   hOutArgTypes <- forM outArgs $ \outarg ->
                   wrapMaybe outarg >>= bool
@@ -69,7 +68,7 @@
                             && nullableReturnType
                          then maybeT hReturnType
                          else hReturnType
-  return $ case (outArgs, tshow maybeHReturnType) of
+  return $ case (outArgs, typeShow maybeHReturnType) of
              ([], _)   -> maybeHReturnType
              (_, "()") -> "(,)" `con` hOutArgTypes
              _         -> "(,)" `con` (maybeHReturnType : hOutArgTypes)
@@ -93,12 +92,12 @@
         let ft' = if direction arg == DirectionIn || argCallerAllocates arg
                   then ft
                   else ptr ft
-        let start = tshow ft' <> " -> "
+        let start = typeShow ft' <> " -> "
         return $ padTo 40 start <> "-- " <> (argCName arg)
                    <> " : " <> tshow (argType arg)
-    last = tshow <$> io <$> case returnType callable of
-                             Nothing -> return $ typeOf ()
-                             Just r  -> foreignType r
+    last = typeShow <$> io <$> case returnType callable of
+                                 Nothing -> return $ con0 "()"
+                                 Just r  -> foreignType r
 
 -- | Make a wrapper for foreign `FunPtr`s of the given type. Return
 -- the name of the resulting dynamic Haskell wrapper.
@@ -332,7 +331,7 @@
         _ -> terror $ "prepareInCallback : Not an interface! " <> T.pack 
(ppShow arg)
 
   when (scope == ScopeTypeAsync) $ do
-   ft <- tshow <$> foreignType (argType arg)
+   ft <- typeShow <$> foreignType (argType arg)
    line $ ptrName <> " <- callocMem :: IO (Ptr (" <> ft <> "))"
 
   wrapMaybe arg >>= bool
@@ -389,7 +388,7 @@
             (do
               name'' <- genConversion (prime name') $
                         literal $ M $ allocator <> " " <> tshow n <>
-                                    " :: " <> tshow (io ft)
+                                    " :: " <> typeShow (io ft)
               line $ "memcpy " <> name'' <> " " <> name' <> " " <> tshow n
               return name'')
              -- The semantics of this case are somewhat undefined.
@@ -399,7 +398,7 @@
       then return name'
       else do
         name'' <- genConversion (prime name') $
-                  literal $ M $ "allocMem :: " <> tshow (io $ ptr ft)
+                  literal $ M $ "allocMem :: " <> typeShow (io $ ptr ft)
         line $ "poke " <> name'' <> " " <> name'
         return name''
 
@@ -416,13 +415,12 @@
                           then "callocBoxedBytes"
                           else "callocBytes"
           genConversion name $ literal $ M $ allocator <> " " <> tshow n <>
-                            " :: " <> tshow (io ft)
+                            " :: " <> typeShow (io ft)
       Nothing ->
           notImplementedError $ ("Don't know how to allocate \""
                                  <> argCName arg <> "\" of type "
                                  <> tshow (argType arg))
-  else genConversion name $
-                        literal $ M $ "allocMem :: " <> tshow (io $ ptr ft)
+  else genConversion name $ literal $ M $ "allocMem :: " <> typeShow (io $ ptr 
ft)
 
 -- Convert a non-zero terminated out array, stored in a variable
 -- named "aname", into the corresponding Haskell object.
@@ -604,7 +602,7 @@
   return $ Signature {
       signatureCallable = callable,
       signatureConstraints = constraints,
-      signatureReturnType = tshow ("m" `con` [outType]),
+      signatureReturnType = typeShow ("m" `con` [outType]),
       signatureArgTypes = case symbol of
           KnownForeignSymbol _ -> zip (map Just hInArgs) types
           DynamicForeignSymbol w -> zip (Nothing : map Just hInArgs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/CodeGen.hs 
new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/CodeGen.hs
--- old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/CodeGen.hs        2017-03-27 
22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/CodeGen.hs        2017-06-03 
12:00:54.000000000 +0200
@@ -22,7 +22,8 @@
 import Data.GI.CodeGen.Constant (genConstant)
 import Data.GI.CodeGen.Code
 import Data.GI.CodeGen.EnumFlags (genEnum, genFlags)
-import Data.GI.CodeGen.Fixups (dropMovedItems, guessPropertyNullability)
+import Data.GI.CodeGen.Fixups (dropMovedItems, guessPropertyNullability,
+                               detectGObject)
 import Data.GI.CodeGen.GObject
 import Data.GI.CodeGen.Haddock (deprecatedPragma, addModuleDocumentation)
 import Data.GI.CodeGen.Inheritance (instanceTree, fullObjectMethodList,
@@ -256,7 +257,7 @@
              <> name' <> " a) =>"
     line $ "    " <> className <> " a"
     line $ "#endif"
-    line $ "instance " <> className <> " " <> name'
+    bline $ "instance " <> className <> " " <> name'
     forM_ parents $ \parent -> do
         pcls <- classConstraint parent
         line $ "instance " <> pcls <> " " <> name'
@@ -265,8 +266,8 @@
   group $ do
     let safeCast = "to" <> name'
     exportDecl safeCast
-    line $ safeCast <> " :: " <> className <> " o => o -> IO " <> name'
-    line $ safeCast <> " = unsafeCastTo " <> name'
+    line $ safeCast <> " :: (MonadIO m, " <> className <> " o) => o -> m " <> 
name'
+    line $ safeCast <> " = liftIO . unsafeCastTo " <> name'
 
 -- Wrap a given Object. We enforce that every Object that we wrap is a
 -- GObject. This is the case for everything except the ParamSpec* set
@@ -431,6 +432,9 @@
             -- Try to guess nullability of properties when there is no
             -- nullability info in the GIR.
           $ map guessPropertyNullability
+            -- Not every interface providing signals or properties is
+            -- correctly annotated as descending from GObject, fix this.
+          $ map detectGObject
           $ M.toList
           $ apis
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Constant.hs 
new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Constant.hs
--- old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Constant.hs       2017-03-27 
22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Constant.hs       2017-06-03 
12:00:54.000000000 +0200
@@ -56,14 +56,14 @@
 -- can be assigned to the corresponding Haskell type.
 assignValue :: Text -> Type -> Text -> ExcCodeGen ()
 assignValue name t@(TBasicType TPtr) value = do
-  ht <- tshow <$> haskellType t
+  ht <- typeShow <$> haskellType t
   writePattern name (ExplicitSynonym "ptrToIntPtr" "intPtrToPtr" value ht)
 assignValue name t@(TBasicType b) value = do
-  ht <- tshow <$> haskellType t
+  ht <- typeShow <$> haskellType t
   hv <- showBasicType b value
   writePattern name (SimpleSynonym hv ht)
 assignValue name t@(TInterface _) value = do
-  ht <- tshow <$> haskellType t
+  ht <- typeShow <$> haskellType t
   api <- findAPI t
   case api of
     Just (APIEnum _) ->
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Conversions.hs 
new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Conversions.hs
--- old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Conversions.hs    2017-03-27 
22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Conversions.hs    2017-06-03 
12:00:54.000000000 +0200
@@ -41,14 +41,11 @@
 import Control.Monad (when)
 import Data.Maybe (isJust)
 import Data.Monoid ((<>))
-import Data.Int
 import Data.Text (Text)
 import qualified Data.Text as T
-import Data.Typeable (TypeRep, tyConName, typeRepTyCon, typeOf)
-import Data.Word
 import GHC.Exts (IsString(..))
 
-import Foreign.C.Types (CInt, CUInt, CLong, CULong)
+import Foreign.C.Types (CInt, CUInt)
 import Foreign.Storable (sizeOf)
 
 import Data.GI.CodeGen.API
@@ -282,7 +279,7 @@
         return $ M "packStorableArray"
     | TCArray{}  <- t = notImplementedError $
                    "Don't know how to pack C array of type " <> tshow t
-    | otherwise = case (tshow hType, tshow fType) of
+    | otherwise = case (typeShow hType, typeShow fType) of
                ("T.Text", "CString") -> return $ M "textToCString"
                ("[Char]", "CString") -> return $ M "stringToCString"
                ("Char", "CInt")      -> return "(fromIntegral . ord)"
@@ -292,8 +289,8 @@
                ("GType", "CGType")   -> return "gtypeToCGType"
                _                     -> notImplementedError $
                                         "Don't know how to convert "
-                                        <> tshow hType <> " into "
-                                        <> tshow fType <> ".\n"
+                                        <> typeShow hType <> " into "
+                                        <> typeShow fType <> ".\n"
                                         <> "Internal type: "
                                         <> tshow t
 
@@ -404,7 +401,7 @@
 
 suForeignPtr :: Bool -> TypeRep -> Transfer -> CodeGen Constructor
 suForeignPtr isBoxed hType transfer = do
-  let constructor = T.pack . tyConName . typeRepTyCon $ hType
+  let constructor = typeConName hType
   if isBoxed then
       boxedForeignPtr constructor transfer
   else return $ M $ parenthesize $
@@ -422,7 +419,7 @@
 
 fObjectToH :: Type -> TypeRep -> Transfer -> ExcCodeGen Constructor
 fObjectToH t hType transfer = do
-  let constructor = T.pack . tyConName . typeRepTyCon $ hType
+  let constructor = typeConName hType
   isGO <- isGObject t
   return $ M $ parenthesize $
     case transfer of
@@ -437,7 +434,7 @@
 
 fCallbackToH :: TypeRep -> Transfer -> ExcCodeGen Constructor
 fCallbackToH hType TransferNothing = do
-  let constructor = T.pack . tyConName . typeRepTyCon $ hType
+  let constructor = typeConName hType
   return (P (callbackDynamicWrapper constructor))
 fCallbackToH _ transfer =
   notImplementedError ("ForeignCallback with unsupported transfer type `"
@@ -491,7 +488,7 @@
                    "Don't know how to unpack C array of type " <> tshow t
     | TByteArray <- t = return $ M "unpackGByteArray"
     | TGHash _ _ <- t = notImplementedError "Foreign Hashes not supported yet"
-    | otherwise = case (tshow fType, tshow hType) of
+    | otherwise = case (typeShow fType, typeShow hType) of
                ("CString", "T.Text") -> return $ M "cstringToText"
                ("CString", "[Char]") -> return $ M "cstringToString"
                ("CInt", "Char")      -> return "(chr . fromIntegral)"
@@ -501,8 +498,8 @@
                ("CGType", "GType")   -> return "GType"
                _                     ->
                    notImplementedError $ "Don't know how to convert "
-                                           <> tshow fType <> " into "
-                                           <> tshow hType <> ".\n"
+                                           <> typeShow fType <> " into "
+                                           <> typeShow hType <> ".\n"
                                            <> "Internal type: "
                                            <> tshow t
 
@@ -623,7 +620,7 @@
   return (ls, "[" <> name <> "]", constraints)
 argumentType letters@(l:ls) t = do
   api <- findAPI t
-  s <- tshow <$> haskellType t
+  s <- typeShow <$> haskellType t
   case api of
     -- Instead of restricting to the actual class,
     -- we allow for any object descending from it.
@@ -640,43 +637,44 @@
       -- See [Note: Callables that throw]
       if callableThrows (cbCallable cb)
       then do
-        ft <- tshow <$> foreignType t
+        ft <- typeShow <$> foreignType t
         return (letters, ft, [])
       else
         return (letters, s, [])
     _ -> return (letters, s, [])
 
-haskellBasicType TPtr      = ptr $ typeOf ()
-haskellBasicType TBoolean  = typeOf True
+haskellBasicType :: BasicType -> TypeRep
+haskellBasicType TPtr      = ptr $ con0 "()"
+haskellBasicType TBoolean  = con0 "Bool"
 -- For all the platforms that we support (and those supported by glib)
 -- we have gint == gint32. Encoding this assumption in the types saves
 -- conversions.
 haskellBasicType TInt      = case sizeOf (0 :: CInt) of
-                               4 -> typeOf (0 :: Int32)
+                               4 -> con0 "Int32"
                                n -> error ("Unsupported `gint' length: " ++
                                            show n)
 haskellBasicType TUInt     = case sizeOf (0 :: CUInt) of
-                               4 -> typeOf (0 :: Word32)
+                               4 -> con0 "Word32"
                                n -> error ("Unsupported `guint' length: " ++
                                            show n)
-haskellBasicType TLong     = typeOf (0 :: CLong)
-haskellBasicType TULong    = typeOf (0 :: CULong)
-haskellBasicType TInt8     = typeOf (0 :: Int8)
-haskellBasicType TUInt8    = typeOf (0 :: Word8)
-haskellBasicType TInt16    = typeOf (0 :: Int16)
-haskellBasicType TUInt16   = typeOf (0 :: Word16)
-haskellBasicType TInt32    = typeOf (0 :: Int32)
-haskellBasicType TUInt32   = typeOf (0 :: Word32)
-haskellBasicType TInt64    = typeOf (0 :: Int64)
-haskellBasicType TUInt64   = typeOf (0 :: Word64)
-haskellBasicType TGType    = "GType" `con` []
-haskellBasicType TUTF8     = "T.Text" `con` []
-haskellBasicType TFloat    = typeOf (0 :: Float)
-haskellBasicType TDouble   = typeOf (0 :: Double)
-haskellBasicType TUniChar  = typeOf ('\0' :: Char)
-haskellBasicType TFileName = "[Char]" `con` []
-haskellBasicType TIntPtr   = "CIntPtr" `con` []
-haskellBasicType TUIntPtr  = "CUIntPtr" `con` []
+haskellBasicType TLong     = con0 "CLong"
+haskellBasicType TULong    = con0 "CULong"
+haskellBasicType TInt8     = con0 "Int8"
+haskellBasicType TUInt8    = con0 "Word8"
+haskellBasicType TInt16    = con0 "Int16"
+haskellBasicType TUInt16   = con0 "Word16"
+haskellBasicType TInt32    = con0 "Int32"
+haskellBasicType TUInt32   = con0 "Word32"
+haskellBasicType TInt64    = con0 "Int64"
+haskellBasicType TUInt64   = con0 "Word64"
+haskellBasicType TGType    = con0 "GType"
+haskellBasicType TUTF8     = con0 "T.Text"
+haskellBasicType TFloat    = con0 "Float"
+haskellBasicType TDouble   = con0 "Double"
+haskellBasicType TUniChar  = con0 "Char"
+haskellBasicType TFileName = con0 "[Char]"
+haskellBasicType TIntPtr   = con0 "CIntPtr"
+haskellBasicType TUIntPtr  = con0 "CUIntPtr"
 
 -- This translates GI types to the types used for generated Haskell code.
 haskellType :: Type -> CodeGen TypeRep
@@ -864,7 +862,7 @@
 typePtrType (TBasicType TFileName) = return (Just FFIPtr)
 typePtrType t = do
   ft <- foreignType t
-  case tyConName (typeRepTyCon ft) of
+  case typeConName ft of
     "Ptr"    -> return (Just FFIPtr)
     "FunPtr" -> return (Just FFIFunPtr)
     _        -> return Nothing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Fixups.hs 
new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Fixups.hs
--- old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Fixups.hs 2017-03-27 
22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Fixups.hs 2017-06-03 
12:00:54.000000000 +0200
@@ -2,6 +2,7 @@
 module Data.GI.CodeGen.Fixups
     ( dropMovedItems
     , guessPropertyNullability
+    , detectGObject
     ) where
 
 import Data.Maybe (isNothing, isJust)
@@ -112,7 +113,20 @@
 
 -- | Find the first method with the given name, if any.
 findMethod :: [Method] -> T.Text -> Maybe Method
-findMethod methods n =
-    case filter ((== n) . name . methodName) methods of
-      [m] -> Just m
-      _ -> Nothing
+findMethod methods n = case filter ((== n) . name . methodName) methods of
+                         [m] -> Just m
+                         _ -> Nothing
+
+-- | Not every interface that provides signals/properties is marked as
+-- requiring GObject, but this is necessarily the case, so fix the
+-- introspection data accordingly.
+detectGObject :: (Name, API) -> (Name, API)
+detectGObject (n, APIInterface iface) =
+  if not (null (ifProperties iface) && null (ifSignals iface))
+  then let gobject = Name "GObject" "Object"
+       in if gobject `elem` (ifPrerequisites iface)
+          then (n, APIInterface iface)
+          else (n, APIInterface (iface {ifPrerequisites =
+                                        gobject : ifPrerequisites iface}))
+  else (n, APIInterface iface)
+detectGObject api = api
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/OverloadedMethods.hs 
new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/OverloadedMethods.hs
--- old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/OverloadedMethods.hs      
2017-03-27 22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/OverloadedMethods.hs      
2017-06-03 12:00:54.000000000 +0200
@@ -36,8 +36,12 @@
     line $ "instance (info ~ Resolve" <> n <> "Method t " <> n <> ", "
           <> "O.MethodInfo info " <> n <> " p) => O.IsLabel t ("
           <> n <> " -> p) where"
+    line $ "#if MIN_VERSION_base(4,10,0)"
+    indent $ line $ "fromLabel = O.overloadedMethod (O.MethodProxy :: 
O.MethodProxy info)"
+    line $ "#else"
     indent $ line $ "fromLabel _ = O.overloadedMethod (O.MethodProxy :: 
O.MethodProxy info)"
     line $ "#endif"
+    line $ "#endif"
 
 -- | Generate the `MethodList` instance given the list of methods for
 -- the given named type.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/OverloadedSignals.hs 
new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/OverloadedSignals.hs
--- old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/OverloadedSignals.hs      
2017-03-27 22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/OverloadedSignals.hs      
2017-06-03 12:00:54.000000000 +0200
@@ -18,7 +18,7 @@
 import Data.GI.CodeGen.Code
 import Data.GI.CodeGen.Inheritance (fullObjectSignalList, 
fullInterfaceSignalList)
 import Data.GI.CodeGen.GObject (apiIsGObject)
-import Data.GI.CodeGen.Signal (signalHaskellName)
+import Data.GI.CodeGen.Signal (signalHaskellName, genSignalConnector)
 import Data.GI.CodeGen.SymbolNaming (upperName, hyphensToCamelCase,
                                      qualifiedSymbol)
 import Data.GI.CodeGen.Util (lcFirst, ucFirst)
@@ -86,7 +86,8 @@
       let signalConnectorName = name <> sn
           cbHaskellType = signalConnectorName <> "Callback"
       line $ "type HaskellCallbackType " <> si <> " = " <> cbHaskellType
-      line $ "connectSignal _ = " <> "connect" <> name <> sn
+      line $ "connectSignal _ obj cb connectMode = do"
+      indent $ genSignalConnector signal cbHaskellType "connectMode"
   exportSignal (lcFirst sn) si
 
 -- | Signal instances for (GObject-derived) objects.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Properties.hs 
new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Properties.hs
--- old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Properties.hs     2017-03-27 
22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Properties.hs     2017-06-03 
12:00:54.000000000 +0200
@@ -122,11 +122,11 @@
                          <> "\" $ getObjectProperty" <> tStr
                 else "getObjectProperty" <> tStr
   line $ getter <> " :: " <> constraints <>
-                " => o -> " <> tshow ("m" `con` [outType])
+                " => o -> " <> typeShow ("m" `con` [outType])
   line $ getter <> " obj = liftIO $ " <> getProp
            <> " obj \"" <> propName prop <> "\"" <>
            if tStr `elem` ["Object", "Boxed"]
-           then " " <> tshow constructorType -- These require the constructor.
+           then " " <> typeShow constructorType -- These require the 
constructor.
            else ""
   exportProperty docSection getter
 
@@ -149,7 +149,7 @@
 
 genPropertyClear :: Text -> Name -> Text -> Property -> CodeGen ()
 genPropertyClear clear n docSection prop = group $ do
-  nothingType <- tshow . maybeT <$> haskellType (propType prop)
+  nothingType <- typeShow . maybeT <$> haskellType (propType prop)
   cls <- classConstraint n
   let constraints = ["MonadIO m", cls <> " o"]
   tStr <- propTypeStr $ propType prop
@@ -257,8 +257,8 @@
              then return "()"
              else do
                sOutType <- if isNullable && propReadNullable prop /= Just False
-                           then tshow . maybeT <$> haskellType (propType prop)
-                           else tshow <$> haskellType (propType prop)
+                           then typeShow . maybeT <$> haskellType (propType 
prop)
+                           else typeShow <$> haskellType (propType prop)
                return $ if T.any (== ' ') sOutType
                         then parenthesize sOutType
                         else sOutType
@@ -270,7 +270,7 @@
     inConstraint <- if writable || constructOnly
                     then do
                       inIsGO <- isGObject (propType prop)
-                      hInType <- tshow <$> haskellType (propType prop)
+                      hInType <- typeShow <$> haskellType (propType prop)
                       if inIsGO
                          then typeConstraint (propType prop)
                          else return $ "(~) " <> if T.any (== ' ') hInType
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Signal.hs 
new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Signal.hs
--- old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Signal.hs 2017-03-27 
22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Signal.hs 2017-06-03 
12:00:54.000000000 +0200
@@ -1,5 +1,6 @@
 module Data.GI.CodeGen.Signal
     ( genSignal
+    , genSignalConnector
     , genCallback
     , signalHaskellName
     ) where
@@ -11,7 +12,6 @@
 
 import Data.Maybe (catMaybes)
 import Data.Monoid ((<>))
-import Data.Typeable (typeOf)
 import Data.Bool (bool)
 import qualified Data.Text as T
 import Data.Text (Text)
@@ -49,10 +49,10 @@
       forM_ hInArgs $ \arg -> do
         ht <- haskellType (argType arg)
         wrapMaybe arg >>= bool
-                          (line $ tshow ht <> " ->")
-                          (line $ tshow (maybeT ht) <> " ->")
+                          (line $ typeShow ht <> " ->")
+                          (line $ typeShow (maybeT ht) <> " ->")
       ret <- hOutType cb hOutArgs
-      line $ tshow $ io ret
+      line $ typeShow $ io ret
 
     blank
 
@@ -76,14 +76,14 @@
         let ht' = if direction arg /= DirectionIn
                   then ptr ht
                   else ht
-        line $ tshow ht' <> " ->"
+        line $ typeShow ht' <> " ->"
       when (callableThrows cb) $
         line "Ptr (Ptr GError) ->"
       when isSignal $ line $ withComment "Ptr () ->" "user_data"
       ret <- io <$> case returnType cb of
-                      Nothing -> return $ typeOf ()
+                      Nothing -> return $ con0 "()"
                       Just t -> foreignType t
-      line $ tshow ret
+      line $ typeShow ret
     return ctypeName
 
 -- Generator for wrappers callable from C
@@ -257,14 +257,14 @@
         let ht' = if direction arg /= DirectionIn
                   then ptr ht
                   else ht
-        line $ tshow ht' <> " ->"
+        line $ typeShow ht' <> " ->"
       when (callableThrows cb) $
         line "Ptr (Ptr GError) ->"
       when isSignal $ line "Ptr () ->"
       ret <- io <$> case returnType cb of
-                      Nothing -> return $ typeOf ()
+                      Nothing -> return $ con0 "()"
                       Just t -> foreignType t
-      line $ tshow ret
+      line $ typeShow ret
 
     let cArgNames = map escapedArgName (args cb)
         allArgs = if isSignal
@@ -360,12 +360,12 @@
                        in w <> T.concat (map ucFirst ws)
 
 genSignal :: Signal -> Name -> ExcCodeGen ()
-genSignal (Signal { sigName = sn, sigCallable = cb }) on = do
+genSignal s@(Signal { sigName = sn, sigCallable = cb }) on = do
   let on' = upperName on
 
   line $ "-- signal " <> on' <> "::" <> sn
 
-  let sn' = signalHaskellName (sn)
+  let sn' = signalHaskellName sn
       signalConnectorName = on' <> ucFirst sn'
       cbType = signalConnectorName <> "Callback"
 
@@ -389,30 +389,36 @@
   -- ("on...") or after the default handler runs (after...). We
   -- provide convenient wrappers for both cases.
   group $ do
-    let signatureConstraints = "(GObject a, MonadIO m) =>"
+    -- Notice that we do not include GObject here as a constraint,
+    -- since if something provides signals it is necessarily a
+    -- GObject.
+    klass <- classConstraint on
+    let signatureConstraints = "(" <> klass <> " a, MonadIO m) =>"
         signatureArgs = "a -> " <> cbType <> " -> m SignalHandlerId"
         signature = " :: " <> signatureConstraints <> " " <> signatureArgs
         onName = "on" <> signalConnectorName
         afterName = "after" <> signalConnectorName
-    line $ onName <> signature
-    line $ onName <> " obj cb = liftIO $ connect"
-             <> signalConnectorName <> " obj cb SignalConnectBefore"
-    line $ afterName <> signature
-    line $ afterName <> " obj cb = connect"
-             <> signalConnectorName <> " obj cb SignalConnectAfter"
-    exportSignal (lcFirst sn') onName
-    exportSignal (lcFirst sn') afterName
 
-  group $ do
-    let fullName = "connect" <> signalConnectorName
-        signatureConstraints = "(GObject a, MonadIO m) =>"
-        signatureArgs = "a -> " <> cbType
-                        <> " -> SignalConnectMode -> m SignalHandlerId"
-    line $ fullName <> " :: " <> signatureConstraints
-    line $ T.replicate (4 + T.length fullName) " " <> signatureArgs
-    line $ fullName <> " obj cb after = liftIO $ do"
-    indent $ do
-        cb' <- genWrappedCallback cb "cb" cbType True
-        let cb'' = prime cb'
-        line $ cb'' <> " <- " <> callbackWrapperAllocator cbType <> " " <> cb'
-        line $ "connectSignalFunPtr obj \"" <> sn <> "\" " <> cb'' <> " after"
+    group $ do
+      line $ onName <> signature
+      line $ onName <> " obj cb = liftIO $ do"
+      indent $ genSignalConnector s cbType "SignalConnectBefore"
+      exportSignal (lcFirst sn') onName
+
+    group $ do
+      line $ afterName <> signature
+      line $ afterName <> " obj cb = liftIO $ do"
+      indent $ genSignalConnector s cbType "SignalConnectAfter"
+      exportSignal (lcFirst sn') afterName
+
+-- | Generate the code for connecting the given signal. This assumes
+-- that it lives inside a @do@ block.
+genSignalConnector :: Signal
+                   -> Text -- ^ Callback type
+                   -> Text -- ^ SignalConnectBefore or SignalConnectAfter
+                   -> CodeGen ()
+genSignalConnector (Signal {sigName = sn, sigCallable = cb}) cbType when = do
+  cb' <- genWrappedCallback cb "cb" cbType True
+  let cb'' = prime cb'
+  line $ cb'' <> " <- " <> callbackWrapperAllocator cbType <> " " <> cb'
+  line $ "connectSignalFunPtr obj \"" <> sn <> "\" " <> cb'' <> " " <> when
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Struct.hs 
new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Struct.hs
--- old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Struct.hs 2017-03-27 
22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Struct.hs 2017-06-03 
12:00:54.000000000 +0200
@@ -112,10 +112,10 @@
   nullConvert <- if embedded
                  then return Nothing
                  else maybeNullConvert (fieldType field)
-  hType <- tshow <$> if isJust nullConvert
-                     then maybeT <$> isoHaskellType (fieldType field)
-                     else isoHaskellType (fieldType field)
-  fType <- tshow <$> foreignType (fieldType field)
+  hType <- typeShow <$> if isJust nullConvert
+                        then maybeT <$> isoHaskellType (fieldType field)
+                        else isoHaskellType (fieldType field)
+  fType <- typeShow <$> foreignType (fieldType field)
 
   line $ getter <> " :: MonadIO m => " <> name' <> " -> m " <>
               if T.any (== ' ') hType
@@ -154,10 +154,10 @@
 
   isPtr <- typeIsPtr (fieldType field)
 
-  fType <- tshow <$> foreignType (fieldType field)
+  fType <- typeShow <$> foreignType (fieldType field)
   hType <- if isPtr
            then return fType
-           else tshow <$> haskellType (fieldType field)
+           else typeShow <$> haskellType (fieldType field)
 
   line $ setter <> " :: MonadIO m => " <> name' <> " -> "
            <> hType <> " -> m ()"
@@ -175,7 +175,7 @@
   let name' = upperName n
   let clear = fieldClear n field
 
-  fType <- tshow <$> foreignType (fieldType field)
+  fType <- typeShow <$> foreignType (fieldType field)
 
   line $ clear <> " :: MonadIO m => " <> name' <> " -> m ()"
   line $ clear <> " s = liftIO $ withManagedPtr s $ \\ptr -> do"
@@ -211,12 +211,12 @@
 
   embedded <- isEmbedded field
   isNullable <- typeIsNullable (fieldType field)
-  outType <- tshow <$> if not embedded && isNullable
-                       then maybeT <$> isoHaskellType (fieldType field)
-                       else isoHaskellType (fieldType field)
+  outType <- typeShow <$> if not embedded && isNullable
+                          then maybeT <$> isoHaskellType (fieldType field)
+                          else isoHaskellType (fieldType field)
   inType <- if isPtr
-            then tshow <$> foreignType (fieldType field)
-            else tshow <$> haskellType (fieldType field)
+            then typeShow <$> foreignType (fieldType field)
+            else typeShow <$> haskellType (fieldType field)
 
   line $ "data " <> it
   line $ "instance AttrInfo " <> it <> " where"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Type.hs 
new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Type.hs
--- old/haskell-gi-0.20.1/lib/Data/GI/CodeGen/Type.hs   2017-03-27 
22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/lib/Data/GI/CodeGen/Type.hs   2017-06-03 
12:00:54.000000000 +0200
@@ -1,28 +1,72 @@
--- | Type constructors.
+-- | An abstraction for representing type constructors. This is a very
+-- simplified version of `Data.Typeable`, which we don't use directly
+-- to avoid compatibility headaches.
 module Data.GI.CodeGen.Type
     ( Type(..)  -- Reexported for convenience.
     , BasicType(..)
 
+    , TypeRep
+
+    , con
+    , con0
+
+    , typeShow
+    , typeConName
+
     , io
     , ptr
     , funptr
-    , con
     , maybeT
     ) where
 
-import Data.Typeable (TypeRep, mkTyConApp, typeOf, typeRepTyCon, mkTyCon3)
+import Data.Monoid ((<>))
 import qualified Data.Text as T
 import Data.Text (Text)
 
 import Data.GI.GIR.BasicTypes (Type(..), BasicType(..))
 
+-- | A fully applied type.
+data TypeRep = TypeRep { typeCon     :: TypeCon
+                       , typeConArgs :: [TypeRep]
+                       } deriving (Eq)
+
+-- | A type constructor. We single out some specific constructors
+-- since they have special syntax in their Haskell representation.
+data TypeCon = TupleCon
+             | ListCon
+             | TextualCon Text
+  deriving (Eq)
+
+-- | Give a valid Haskell source representation of the given
+-- `TypeRep`.
+typeShow :: TypeRep -> Text
+typeShow (TypeRep TupleCon args) =
+  "(" <> T.intercalate ", " (map typeShow args) <> ")"
+typeShow (TypeRep ListCon args) =
+  "[" <> T.intercalate ", " (map typeShow args) <> "]"
+typeShow (TypeRep (TextualCon con) args) =
+  T.intercalate " " (con : map (parenthesize . typeShow) args)
+  where parenthesize :: Text -> Text
+        parenthesize s = if T.any (== ' ') s
+                         then "(" <> s <> ")"
+                         else s
+
+-- | Return a textual representation of the type constructor for the
+-- given `TypeRep`.
+typeConName :: TypeRep -> Text
+typeConName (TypeRep TupleCon _) = "(,)"
+typeConName (TypeRep ListCon _) = "[,]"
+typeConName (TypeRep (TextualCon s) _) = s
+
 -- | Type constructor applied to the given types.
 con :: Text -> [TypeRep] -> TypeRep
-con "[]" xs = mkTyConApp listCon xs
-              where listCon = typeRepTyCon (typeOf [True])
-con "(,)" xs = mkTyConApp tupleCon xs
-               where tupleCon = typeRepTyCon (typeOf (True, True))
-con s xs = mkTyConApp (mkTyCon3 "GI" "GI" (T.unpack s)) xs
+con "[]" xs = TypeRep {typeCon = ListCon, typeConArgs = xs }
+con "(,)" xs = TypeRep {typeCon = TupleCon, typeConArgs = xs }
+con s xs = TypeRep {typeCon = TextualCon s, typeConArgs = xs}
+
+-- | A shorthand for a type constructor taking no arguments.
+con0 :: Text -> TypeRep
+con0 c = con c []
 
 -- | Embed in the `IO` monad.
 io :: TypeRep -> TypeRep
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/haskell-gi-0.20.1/lib/Data/GI/GIR/Repository.hs 
new/haskell-gi-0.20.2/lib/Data/GI/GIR/Repository.hs
--- old/haskell-gi-0.20.1/lib/Data/GI/GIR/Repository.hs 2017-03-27 
22:44:51.000000000 +0200
+++ new/haskell-gi-0.20.2/lib/Data/GI/GIR/Repository.hs 2017-06-03 
12:00:54.000000000 +0200
@@ -19,9 +19,6 @@
 import System.Environment.XDG.BaseDir (getSystemDataDirs)
 import System.FilePath (searchPathSeparator, takeBaseName, (</>), (<.>))
 
-girDataDirs :: IO [FilePath]
-girDataDirs = getSystemDataDirs "gir-1.0"
-
 girFilePath :: String -> String -> FilePath -> FilePath
 girFilePath name version path = path </> name ++ "-" ++ version <.> "gir"
 
@@ -52,21 +49,29 @@
                             then reverse acc : go ys []
                             else go ys (y : acc)
 
--- | Search for an appropriate @.gir@ file in the search path. This is
--- either passed in explicitly, or if that is absent, loaded from the
--- environment variable @HASKELL_GI_GIR_SEARCH_PATH@. In either case
+girDataDirs :: IO [FilePath]
+girDataDirs = getSystemDataDirs "gir-1.0"
+
+-- | Construct the GIR search path, possibly looking into the
+-- @HASKELL_GI_GIR_SEARCH_PATH@ environment variable if no explicit
+-- list of extra paths is given. In either case
 -- the system data dirs are also searched if nothing can be found in
 -- the explicitly passed paths, or in the contents of
 -- @HASKELL_GI_GIR_SEARCH_PATH@.
-girFile :: Text -> Maybe Text -> [FilePath] -> IO (Maybe FilePath)
-girFile name version extraPaths = do
+buildSearchPath :: [FilePath] -> IO [FilePath]
+buildSearchPath extraPaths = do
   paths <- case extraPaths of
              [] -> lookupEnv "HASKELL_GI_GIR_SEARCH_PATH" >>= \case
-                   Nothing -> return []
-                   Just s -> return (splitOn searchPathSeparator s)
+               Nothing -> return []
+               Just s -> return (splitOn searchPathSeparator s)
              ps -> return ps
   dataDirs <- girDataDirs
-  firstJust <$> (mapM (girFile' name version) (paths ++ dataDirs))
+  return (paths ++ dataDirs)
+
+-- | Search for an appropriate @.gir@ file in the search path.
+girFile :: Text -> Maybe Text -> [FilePath] -> IO (Maybe FilePath)
+girFile name version searchPath =
+  firstJust <$> (mapM (girFile' name version) searchPath)
     where firstJust = listToMaybe . catMaybes
 
 -- | Try to load the `.gir` file corresponding to the given repository
@@ -75,13 +80,13 @@
                  -> Maybe Text  -- ^ version
                  -> [FilePath]  -- ^ searchPath
                  -> IO XML.Document
-readGiRepository verbose name version extraPaths =
-    girFile name version extraPaths >>= \case
+readGiRepository verbose name version extraPaths = do
+  searchPath <- buildSearchPath extraPaths
+  girFile name version searchPath >>= \case
         Just path -> do
             when verbose $ putStrLn $ "Loading GI repository: " ++ path
             XML.readFile XML.def path
-        Nothing -> do
-            dataDirs <- girDataDirs
-            error $ "Did not find a GI repository for " ++ (T.unpack name)
-                ++ maybe "" ("-" ++) (T.unpack <$> version)
-                ++ " in " ++ show dataDirs
+        Nothing -> error $ "Did not find a GI repository for "
+                   ++ (T.unpack name)
+                   ++ maybe "" ("-" ++) (T.unpack <$> version)
+                   ++ " in " ++ show searchPath ++ "."


Reply via email to