packages feed

haskell-gi 0.22.4 → 0.22.5

raw patch · 4 files changed

+107/−33 lines, 4 filesdep −semigroupsPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies removed: semigroups

API changes (from Hackage documentation)

- Data.GI.CodeGen.Overrides: parseOverridesFile :: FilePath -> IO (Either Text Overrides)
+ Data.GI.CodeGen.CabalHooks: TaggedOverride :: Text -> Text -> TaggedOverride
+ Data.GI.CodeGen.CabalHooks: [overrideTag] :: TaggedOverride -> Text
+ Data.GI.CodeGen.CabalHooks: [overrideText] :: TaggedOverride -> Text
+ Data.GI.CodeGen.CabalHooks: data TaggedOverride
+ Data.GI.CodeGen.CabalHooks: setupBinding :: Text -> Text -> Bool -> Maybe FilePath -> [TaggedOverride] -> Maybe FilePath -> IO ()
+ Data.GI.CodeGen.Overrides: parseOverrides :: Text -> IO (Either Text Overrides)
- Data.GI.CodeGen.CabalHooks: configureDryRun :: Text -> Text -> Maybe FilePath -> IO [Text]
+ Data.GI.CodeGen.CabalHooks: configureDryRun :: Text -> Text -> Maybe FilePath -> [TaggedOverride] -> IO ([Text], Set Text)

Files

ChangeLog.md view
@@ -1,3 +1,7 @@+### 0.22.5+++ Add support for inheriting overloading info.+ ### 0.22.4  + Do not generate bindings for struct/union fields pointing to private/class structs, which we do not bind.
haskell-gi.cabal view
@@ -1,5 +1,5 @@ name:                haskell-gi-version:             0.22.4+version:             0.22.5 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.@@ -42,8 +42,6 @@                        xml-conduit >= 1.3.0,                        regex-tdfa >= 1.2,                        text >= 1.0--  build-depends: semigroups == 0.18.*    extensions:          CPP, ForeignFunctionInterface, DoAndIfThenElse, LambdaCase, RankNTypes, OverloadedStrings   ghc-options:         -Wall -fwarn-incomplete-patterns -fno-warn-name-shadowing
lib/Data/GI/CodeGen/CabalHooks.hs view
@@ -2,7 +2,9 @@ -- bindings. module Data.GI.CodeGen.CabalHooks     ( setupHaskellGIBinding+    , setupBinding     , configureDryRun+    , TaggedOverride(..)     ) where  import qualified Distribution.ModuleName as MN@@ -14,40 +16,55 @@  import Data.GI.CodeGen.API (loadGIRInfo) import Data.GI.CodeGen.Code (genCode, writeModuleTree, listModuleTree,-                             ModuleInfo)+                             ModuleInfo, transitiveModuleDeps) import Data.GI.CodeGen.CodeGen (genModule) import Data.GI.CodeGen.Config (Config(..)) import Data.GI.CodeGen.LibGIRepository (setupTypelibSearchPath) import Data.GI.CodeGen.ModulePath (toModulePath)-import Data.GI.CodeGen.Overrides (parseOverridesFile, girFixups,+import Data.GI.CodeGen.Overrides (parseOverrides, girFixups,                                   filterAPIsAndDeps)+import Data.GI.CodeGen.Util (utf8ReadFile, utf8WriteFile, ucFirst) -import Control.Monad (void)+import System.Directory (createDirectoryIfMissing)+import System.FilePath (joinPath, takeDirectory) -import Data.Maybe (fromJust)+import Control.Monad (void, forM)++import Data.Maybe (fromJust, fromMaybe) import qualified Data.Map as M+import Data.Monoid ((<>))+import qualified Data.Set as S import Data.Text (Text) import qualified Data.Text as T  type ConfHook = (GenericPackageDescription, HookedBuildInfo) -> ConfigFlags               -> IO LocalBuildInfo +-- | Included overrides file.+data TaggedOverride =+  TaggedOverride { overrideTag   :: Text+                   -- ^ Tag for the override, for error reporting purposes.+                 , overrideText  :: Text+                 }+ -- | Generate the code for the given module. genModuleCode :: Text -- ^ name               -> Text -- ^ version               -> Bool -- ^ verbose-              -> Maybe FilePath -- ^ overrides file+              -> [TaggedOverride] -- ^ Explicit overrides               -> IO ModuleInfo genModuleCode name version verbosity overrides = do   setupTypelibSearchPath [] -  ovs <- case overrides of-    Nothing -> return mempty-    Just fname -> parseOverridesFile fname >>= \case-         Left err -> error $ "Error when parsing overrides file: "-                     ++ T.unpack err-         Right ovs -> return ovs+  parsed <- forM overrides $ \(TaggedOverride tag ovText) -> do+    parseOverrides ovText >>= \case+      Left err -> error $ "Error when parsing overrides file \""+                  <> T.unpack tag <> "\":"+                  <> T.unpack err+      Right ovs -> return ovs +  let ovs = mconcat parsed+   (gir, girDeps) <- loadGIRInfo verbosity name (Just version) [] (girFixups ovs)   let (apis, deps) = filterAPIsAndDeps ovs gir girDeps       allAPIs = M.union apis deps@@ -57,20 +74,55 @@    return $ genCode cfg allAPIs (toModulePath name) (genModule apis) +-- | Write a module containing information about the configuration for+-- the package.+genConfigModule :: Maybe FilePath -> Text -> Maybe TaggedOverride -> IO ()+genConfigModule outputDir modName maybeGiven = do+  let fname = joinPath [ fromMaybe "" outputDir+                       , "GI"+                       , T.unpack (ucFirst modName)+                       , "Config.hs" ]+      dirname = takeDirectory fname++  createDirectoryIfMissing True dirname++  utf8WriteFile fname $ T.unlines+    [ "{-# LANGUAGE OverloadedStrings #-}"+    , "module GI." <> ucFirst modName <> ".Config ( overrides ) where"+    , ""+    , "import qualified Data.Text as T"+    , "import Data.Text (Text)"+    , ""+    , "overrides :: Text"+    , "overrides = T.unlines"+    , " [ " <> T.intercalate "\n , " (quoteOverrides maybeGiven) <> "]"+    ]++  where quoteOverrides :: Maybe TaggedOverride -> [Text]+        quoteOverrides Nothing = []+        quoteOverrides (Just (TaggedOverride _ ovText)) =+          map (T.pack . show) (T.lines ovText)+ -- | A convenience helper for `confHook`, such that bindings for the -- given module are generated in the @configure@ step of @cabal@. confCodeGenHook :: Text -- ^ name                 -> Text -- ^ version                 -> Bool -- ^ verbose                 -> Maybe FilePath -- ^ overrides file+                -> [TaggedOverride] -- ^ other overrides                 -> Maybe FilePath -- ^ output dir                 -> ConfHook -- ^ previous `confHook`                 -> ConfHook-confCodeGenHook name version verbosity overrides outputDir+confCodeGenHook name version verbosity overridesFile inheritedOverrides outputDir                 defaultConfHook (gpd, hbi) flags = do-  m <- genModuleCode name version verbosity overrides -  let em' = map (MN.fromString . T.unpack) (listModuleTree m)+  givenOvs <- traverse (\fname -> TaggedOverride (T.pack fname) <$> utf8ReadFile fname) overridesFile++  let ovs = maybe inheritedOverrides (:inheritedOverrides) givenOvs+  m <- genModuleCode name version verbosity ovs++  let buildInfo = MN.fromString . T.unpack $ "GI." <> ucFirst name <> ".Config"+      em' = buildInfo : map (MN.fromString . T.unpack) (listModuleTree m)       lib = ((condTreeData . fromJust . condLibrary) gpd)       bi = libBuildInfo lib #if MIN_VERSION_base(4,11,0)@@ -84,6 +136,8 @@    void $ writeModuleTree verbosity outputDir m +  genConfigModule outputDir name givenOvs+   lbi <- defaultConfHook (gpd', hbi) flags    return (lbi {withOptimization = NoOptimisation})@@ -96,18 +150,35 @@                       -> Maybe FilePath -- ^ output dir                       -> IO () setupHaskellGIBinding name version verbose overridesFile outputDir =+  setupBinding name version verbose overridesFile [] outputDir++-- | The entry point for @Setup.hs@ files in bindings.+setupBinding :: Text -- ^ name+             -> Text -- ^ version+             -> Bool -- ^ verbose+             -> Maybe FilePath -- ^ overrides file+             -> [TaggedOverride] -- ^ Explicit overrides+             -> Maybe FilePath -- ^ output dir+             -> IO ()+setupBinding name version verbose overridesFile overrides outputDir =     defaultMainWithHooks (simpleUserHooks {                             confHook = confCodeGenHook name version verbose-                                       overridesFile outputDir+                                       overridesFile overrides outputDir                                        (confHook simpleUserHooks)                           }) --- | Return the list of modules that `setupHaskellGIBinding` would create.+-- | Return the list of modules that `setupHaskellGIBinding` would+-- create, together with the set of dependencies loaded while+-- generating the code. configureDryRun :: Text -- ^ name                 -> Text -- ^ version-                -> Maybe FilePath-                -> IO [Text]-configureDryRun name version overrides = do-  m <- genModuleCode name version False overrides+                -> Maybe FilePath -- ^ Overrides file+                -> [TaggedOverride] -- ^ Other overrides to load+                -> IO ([Text], S.Set Text)+configureDryRun name version overridesFile inheritedOverrides = do+  givenOvs <- traverse (\fname -> TaggedOverride (T.pack fname) <$> utf8ReadFile fname) overridesFile -  return (listModuleTree m)+  let ovs = maybe inheritedOverrides (:inheritedOverrides) givenOvs+  m <- genModuleCode name version False ovs++  return (listModuleTree m, transitiveModuleDeps m)
lib/Data/GI/CodeGen/Overrides.hs view
@@ -2,7 +2,7 @@ module Data.GI.CodeGen.Overrides     ( Overrides(pkgConfigMap, cabalPkgVersion, nsChooseVersion, girFixups,                 onlineDocsMap)-    , parseOverridesFile+    , parseOverrides     , filterAPIsAndDeps     ) where @@ -132,12 +132,11 @@ -- encode this in a monad. type Parser a = WriterT Overrides (StateT ParserState (ExceptT Text IO)) a --- | Parse the given overrides file, filling in the configuration as+-- | Parse the given overrides, filling in the configuration as -- needed. In case the parsing fails we return a description of the -- error instead.-parseOverridesFile :: FilePath -> IO (Either Text Overrides)-parseOverridesFile fname = do-  overrides <- utf8ReadFile fname+parseOverrides :: Text -> IO (Either Text Overrides)+parseOverrides overrides = do   runExceptT $ flip evalStateT emptyParserState $ execWriterT $     mapM (parseOneLine . T.strip) (T.lines overrides) @@ -394,10 +393,12 @@  -- | Parse the given overrides file, and merge into the given context. parseInclude :: Text -> Parser ()-parseInclude fname = liftIO (parseOverridesFile $ T.unpack fname) >>= \case-  Left err -> throwError ("Error when parsing included '"-                         <> fname <> "': " <> err)-  Right ovs -> tell ovs+parseInclude fname = do+  includeText <- liftIO $ utf8ReadFile (T.unpack fname)+  liftIO (parseOverrides includeText) >>= \case+    Left err -> throwError ("Error when parsing included '"+                            <> fname <> "': " <> err)+    Right ovs -> tell ovs  -- | Filter a set of named objects based on a lookup list of names to -- ignore.